SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor

自架發票軟體比較:Invoice Ninja、InvoiceShelf 等 5 款

比較 Invoice Ninja、InvoiceShelf、InvoicePlane、Kimai 與 ERPNext 在單一 VPS 的週期性帳單、稅務、客戶入口網站、付款閘道及授權條款。

應該選擇哪一套自架發票軟體?

在單一 VPS 上,自架發票軟體主要有 5 個實際可行的選擇,而且它們並不是相近的替代品。Invoice Ninja 是功能最完整的產品:週期性發票、客戶入口網站、付款閘道與電子發票格式,在安裝完成後即可使用。InvoiceShelf 是較輕量、完全開放原始碼的選項。InvoicePlane 是單純的 PHP 應用程式,不需要額外協調元件。Kimai 用來記錄工時並據此計費,而不是處理明細項目。ERPNext 是完整的會計系統,也能列印發票。

有兩個問題,比缺少某項功能更常讓自架發票系統失效。第一個是電子郵件。發票若停留在垃圾郵件資料夾,就等於尚未收款,而且你不會收到任何通知。第二個是備份。這是唯一一種資料庫,一旦遺失,造成的會是稅務問題,而不只是使用上的不便。

請先閱讀授權條款,再查看功能清單。這 5 個選項中,有 3 個採用著作傳式授權、1 個採用寬鬆授權,另 1 個則提供原始碼,但對可進行的操作設有實際限制。

五種選項,以及各自適用的對象

Invoice Ninja

這是目前採用 v5 系列的 Laravel 應用程式。自行託管免費且功能不受限制,包含週期性發票、報價單、專案、工時追蹤、費用、客戶入口網站,以及 Stripe 和 PayPal 等付款閘道。該專案將自身定位為「使用 Laravel 建置、可取得原始碼的發票、報價單、專案與工時追蹤應用程式」。自行託管者需要付費的項目有兩項。第一項是品牌移除。依照專案的說明:「我們提供每年 $40 的白標授權,移除應用程式面向客戶部分的 Invoice Ninja 品牌。」截至 October 2026,價格仍為此金額。第二項是在 Peppol network 上傳送與接收電子發票。這需要白標授權及預付 e-credits,詳情請參閱下方「會計師會要求什麼」一節。

如果你需要功能最完整的產品,且能接受執行規模最大的技術堆疊,請選擇它。

InvoiceShelf

這是 Crater 的分支,採用 GNU Affero General Public License version 3 (AGPL-3.0)。功能涵蓋發票、估價單、週期性計費、費用、稅務、多幣別、客戶入口網站及多公司管理。付款與白標功能位於個別的官方模組儲存庫,兩者皆採用 AGPL-3.0,且均可免費使用。卡片付款透過 Stripe checkout 執行。

如果你需要小型、完全開放原始碼的應用程式,且不需要三十種付款閘道,請選擇它。

InvoicePlane

這是採用 CodeIgniter 的 PHP 應用程式,使用 MIT license 發布,也是此處唯一能將檔案解壓縮至 web root 後直接安裝的選項。不需要 Docker,也不需要 Node build step。PDF 由 mPDF 產生,因此範本使用 HTML 和 CSS。客戶會取得 guest link,用來檢視及支付發票。

付款功能過去是主要限制。InvoicePlane 1.6 預設只支援 Stripe,並移除了其他供應商。2026 年 8 月 28 日發布的 1.7.2 重新加入 Stripe 和 PayPal,並新增 PayPal Advanced Credit Cards 和 Venmo。1.7.2 隨附的安裝指南要求 PHP 8.2 或更新版本,支援 8.3 和 8.4,以及 MariaDB;但專案 wiki 的 requirements 頁面仍顯示較舊的 PHP 8.0 至 8.1 範圍。請閱讀你下載之版本的說明。

如果你使用 shared hosting 或 512 MB VPS,請選擇它。

Kimai

這是 AGPL-3.0 授權的工時追蹤工具,可根據 timesheet 產生發票。任何按工時計費的人,都適合使用它。發票範本必須以 DOCX、ODS 或 XLSX 檔案上傳。文件確認這是唯一接受的格式,之後會將範本轉換為 PDF 或 HTML。你可以使用文書處理器排版發票,不必撰寫 CSS,多數人會覺得這樣更簡單。

Kimai 沒有付款閘道,其商店也沒有列出付款外掛,因此你必須以電子郵件寄送 PDF。名為 Customer Portal 的免費供應商外掛,會透過 secret URL 分享客戶與專案統計資料及 timesheet,也可選擇設定密碼保護,但顯示的是 timesheet,而不是發票。結構化電子發票功能由付費商店外掛 E-Invoice Plus 提供;截至 October 2026,價格為每年 99 EUR,不含 VAT。它支援 CII 或 UBL 格式的 EN16931、Extended 和 XRechnung 3.0 profiles,以及 beta 階段的 Peppol UBL,還支援 ZUGFeRD 和 Factur-X 混合式 PDF。

如果發票是追蹤工時後產生的結果,請選擇它。

ERPNext

ERPNext 採用 GPL-3.0,且屬於不同類型的軟體。銷售發票只是完整 accounting system 中的一種文件類型;該系統還包含 chart of accounts、journal entries、庫存及薪資管理。當開立發票不再是工作的全部內容時,它才是合適的選擇。對只有八名客戶的單一自由工作者而言,這套軟體過於龐大。建置 ERPNext 本身就是一個專案,詳見 在 VPS 上執行 ERPNext。

週期性發票依賴無法直接看見的排程器

Invoice Ninja、InvoiceShelf、InvoicePlane 和 ERPNext 都能產生週期性發票。Kimai 的核心功能沒有週期性發票,因為其中的發票是依某個期間的工時表項目建立。

所有採用 Laravel 的系統,失效模式都相同,而且不易察覺。週期性發票由 Laravel 的排程器建立。排程器必須每分鐘觸發一次,方式可以是由 cron 呼叫 php artisan schedule:run,或執行長時間運作的 php artisan schedule:work 程序。若沒有任何程序觸發排程器,週期性發票清單仍會顯示下次寄送日期,但日期會直接過去。系統不會產生發票,也不會記錄錯誤,因為根本沒有程式碼執行。

因此,建立第一張週期性發票後,請將下次寄送日期設在幾分鐘後,然後等待該時間到達。若沒有收到發票,表示排程器沒有執行。在 Docker 安裝中,通常代表排程器服務或程序從未啟動,或已經結束。目前的 Invoice Ninja 和 InvoiceShelf 映像會在應用程式容器內執行排程器,而不是使用獨立服務,因此應查看該容器的日誌。

docker compose ps
docker compose logs --tail 50

檔案中的每項服務都應回報 running。處於 exited 狀態的服務,就是需要查看其日誌的服務。

多幣別與稅務:決定採用前應檢查的項目

功能清單中的「多幣別」可能代表差異很大的功能。請在示範執行個體上執行以下 4 項檢查,並使用自己業務中的實際數字。因為這類錯誤通常是由會計師發現,而不是由你自己發現。

  1. 發票是否儲存開立日期所適用的匯率?這是必要條件。如果應用程式使用即時匯率重新計算總額,上一季的報表會在每次開啟時變更,帳簿也會與已申報的資料不一致。
  2. 稅額是按明細項目、按發票,還是兩者都計算?在其中一個明細項目適用 0 稅率之前,單一發票層級的稅率看似沒有問題。
  3. 是否可以輸入含稅價格,也可以輸入未稅價格?事後轉換會使每個明細項目產生 1 分的四捨五入差異,而這些差異會在一年內累積。
  4. 對於不必繳納 VAT 的其他國家客戶,文件會顯示哪些內容?發票上必須列印免稅說明,不能只在稅額欄顯示 0。

Invoice Ninja 和 ERPNext 可處理以上 4 項需求。InvoiceShelf 將稅務與多幣別列為功能。InvoicePlane 和 Kimai 的功能較簡單,因此請使用最棘手的發票測試,而不是最容易處理的發票。

客戶入口網站與付款閘道

客戶入口網站是讓客戶查看發票、下載 PDF 並付款的頁面。這項功能的重要性超乎表面,因為透過電子郵件催款所耗費的時間,可能比製作發票還多。

Invoice Ninja 在這方面最完整,提供完整的入口網站、多種付款閘道、儲存付款方式,以及週期性發票的自動計費。InvoiceShelf 提供客戶入口網站,並透過其付款模組加入 Stripe checkout。InvoicePlane 會為每張發票提供訪客連結,支援 Stripe;自 1.7.2 起也再次支援 PayPal。Kimai 沒有付款閘道,而其免費的 Customer Portal 外掛分享的是工時表與統計資料,不是發票,因此 PDF 需要以附件寄出。

有一點經常被混淆。在自架開票應用程式,不代表要保存卡號。使用 Stripe checkout 時,客戶會被重新導向至 Stripe,並在 Stripe 頁面輸入卡號;你的 VPS 完全不會看到這些資料。你的 PCI(支付卡產業)合規範圍之所以維持在較小程度,正是因為你沒有自行建立付款表單。若日後需要使用多個付款處理商,或想依國家分流付款,應將這項功能放在獨立層,例如 使用 Hyperswitch 自架付款編排。

PDF 品質,以及最後會編輯的範本

你會編輯範本。這裡的每項預設值,都會讓你的地址出現在不符合所在國家格式的位置。

Invoice Ninja 會使用封裝在映像檔中的無頭 Chrome 將 HTML 與 CSS 範本轉換為 PDF(arm64 使用 Chromium),因此容器映像檔很大。請為此預留記憶體:無頭瀏覽器是整個堆疊中最耗用資源的程序,因此 1 GB VPS 的資源相當吃緊。InvoicePlane 使用 mPDF,這是純 PHP 實作且耗用資源少,但會忽略部分現代 CSS。Kimai 則採取相反的方法,要求你上傳 DOCX 或 ODS 檔案,版面由不曾撰寫樣式表的人員在 LibreOffice 或 Word 中完成。

如果你重視設計完善的發票,而不在意 CSS,Kimai 的方法較適合。如果你希望將範本納入版本控制並可比較差異,HTML 較適合。

授權條款是否允許商業使用?

這 5 個專案都允許你向自己的客戶開立發票。差異會在你進一步使用它們時出現。

Invoice Ninja 採用 Elastic License 2.0。其中有 2 個條款需要注意。

你不得以代管或受管理服務的形式,向第三方提供本軟體,且該服務讓使用者存取本軟體的大部分功能。
你不得移動、變更、停用或規避本軟體中的授權金鑰功能。

因此,為自己的企業執行它沒有問題;但若將執行個體作為產品提供給客戶,則不允許。第二個條款也是移除品牌標示需要支付 $40 授權費,而不是直接修改原始碼的原因。

InvoiceShelf、Kimai 和 Crater 採用 AGPL-3.0。商業使用免費,也沒有更高階的方案。相關義務位於第 13 節:如果你修改程式碼,並讓其他人透過網路使用修改後的版本,就必須向他們提供你的修改內容原始碼。未修改的執行個體已受到上游公開原始碼涵蓋,因此大多數自行代管者不會遇到這項要求。

InvoicePlane 採用 MIT,是這些專案中限制最少的授權條款。不過,其 README 指出名稱與標誌仍歸專案所有。

ERPNext 採用 GPL-3.0。你散布的修改內容必須一併提供,而私下執行則沒有相關義務。

以上是對授權條款內容的說明,不構成法律建議。

專案仍在維護嗎?請查看提交記錄

Crater 多年來一直是熱門的開源發票應用程式,現在仍有許多指南推薦使用它。其預設分支已經 1329 天沒有提交,最近一次提交是在 2023 年 2 月 19 日。

圖表Gap since the last commit on the default branch, in days, checked 10 October 2026
此圖表背後的資料
[
  {
    "label": "ERPNext",
    "commit_gap": 0
  },
  {
    "label": "InvoicePlane",
    "commit_gap": 0
  },
  {
    "label": "Kimai",
    "commit_gap": 4
  },
  {
    "label": "InvoiceShelf",
    "commit_gap": 11
  },
  {
    "label": "Invoice Ninja",
    "commit_gap": 22
  },
  {
    "label": "Crater",
    "commit_gap": 1329
  }
]

該區塊中的 6 個專案,有五個在過去四週內提交過,三個在過去一週內提交過。InvoiceShelf 是延續 Crater 開發工作的分支,採用相同的 AGPL-3.0 授權條款與資料模型,因此遷移過去屬於資料遷移,而不是重新開發。請安裝 InvoiceShelf,不要安裝 Crater。

逐一安裝在 VPS 上

除了 InvoicePlane 之外,其他服務都最適合使用 Docker Compose 執行。如果你不熟悉這項技術,請先參考在 VPS 上建立第一個 Docker Compose 堆疊,再回到這裡。

Invoice Ninja 提供自己的 compose repository。目前的指示使用其 debian 分支,compose 檔案位於同名子目錄中。

git clone https://github.com/invoiceninja/dockerfiles.git -b debian
cd dockerfiles/debian
docker run --rm -it invoiceninja/invoiceninja-debian php artisan key:generate --show

將完整輸出複製到該目錄中 .env 檔案的 APP_KEY,並填入實際的 APP_URL。同時設定第一個帳號的 IN_USER_EMAIL 與 IN_PASSWORD;如果留空,登入預設會使用 admin@example.com,密碼則是 changeme!。然後啟動服務。

docker compose up -d

內建的 nginx 服務會在主機上發布 80 埠,因此請在它前方放置 TLS 代理,或修改該埠對映。在設定精靈中,資料庫主機請填入 mysql,因為這是 compose network 上的服務名稱。此處的 localhost 會指向應用程式容器本身。

InvoiceShelf 會依資料庫引擎提供現成的 compose 檔案,每種引擎各提供一份。

curl -fLO https://raw.githubusercontent.com/InvoiceShelf/docker/master/docker-compose.mysql.yml
mv docker-compose.mysql.yml docker-compose.yml

啟動前先開啟該檔案。檔案中的所有密碼都是預留值,檔案本身的註解也有說明。APP_URL、SESSION_DOMAIN 與 SANCTUM_STATEFUL_DOMAINS 預設都為 localhost;首次登入前,必須將這三項全部設為實際的主機名稱。接著啟動服務。

docker compose up -d

它會在主機上發布 8090 埠,並在容器內提供 8080 埠。在讓任何用戶端連線之前,請先在前方設定具備 TLS(傳輸層安全性)的反向代理。

Kimai 正式環境 compose 檔案,取自專案文件
services:

  sqldb:
    image: mysql:8.3
    volumes:
      - mysql:/var/lib/mysql
    environment:
      - MYSQL_DATABASE=kimai
      - MYSQL_USER=kimaiuser
      - MYSQL_PASSWORD=kimaipassword
      - MYSQL_ROOT_PASSWORD=changemeplease
    command: --default-storage-engine innodb
    restart: unless-stopped
    healthcheck:
      test: mysqladmin -uroot -p$$MYSQL_ROOT_PASSWORD ping -h 127.0.0.1 --silent
      interval: 10s
      timeout: 5s
      retries: 12
      start_period: 30s

  kimai:
    image: kimai/kimai2:stable
    depends_on:
      sqldb:
        condition: service_healthy
        restart: true
    volumes:
      - data:/opt/kimai/var/data
      - plugins:/opt/kimai/var/plugins
    ports:
      - 8001:8001
    environment:
      - APP_SECRET=your-fantastic-long-random-and-ultra-secure-secret
      - TRUSTED_HOSTS=kimai.example.com
      - ADMINMAIL=admin@example.com
      - ADMINPASS=changemeplease
      - DATABASE_URL=mysql://kimaiuser:kimaipassword@sqldb/kimai?charset=utf8mb4&serverVersion=8.3.0
    restart: unless-stopped

volumes:
  data:
  mysql:
  plugins:

將 APP_SECRET 設為自行產生的長隨機字串,並將 TRUSTED_HOSTS 設為實際使用的網域。ADMINMAIL 與 ADMINPASS 會在第一次啟動時建立第一個管理員帳號,因此之後請在介面中變更該密碼,並將密碼從檔案中移除。

InvoicePlane 沒有容器。請先建立空白資料庫。

sudo mysql -e "CREATE DATABASE invoiceplane CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"

從專案的 releases 頁面下載壓縮檔,將其解壓縮到網頁根目錄,將 ipconfig.php.example 複製為 ipconfig.php,並依照該檔案中的註解,在其中設定 URL。然後開啟 https://your-domain.example/index.php/setup,依照安裝程式完成設定。

為什麼你的發票郵件會落入垃圾郵件資料夾

這是會直接造成金錢損失的故障,而且應用程式仍會正常回報發票已寄出。

不要使用 VPS 自己的 IP 位址寄送發票郵件。新的 VPS IP 沒有寄信紀錄,大型郵件接收服務通常會預設將來自託管網段中未知位址的第一封郵件視為可疑。請透過你已完成驗證之網域上的 SMTP(簡易郵件傳輸協定)relay 寄送。完整完成這項設定需要另寫一份指南,而從自架應用程式可靠寄送郵件涵蓋 relay、DNS 記錄與測試。

From 位址是大多數發票設定出錯的地方。它必須位於你控制的網域上,而且 relay 必須使用 DKIM(網域金鑰識別郵件)為該網域簽署。將客戶自己的位址放在 From 看似禮貌,卻會造成投遞失敗,因為接收伺服器會檢查 From 網域是否與驗證郵件的網域相符。當客戶的網域發布 p=reject 的 DMARC 政策時,Gmail 會直接拒絕郵件:

550 5.7.26 Unauthenticated email from example.com is not accepted due to domain's DMARC policy

在 From 保留你自己的位址,並將客戶的位址放在 Reply-To。寄送任何正式郵件前,先檢查已發布的記錄。

dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT selector1._domainkey.example.com

第一個指令應回傳包含你的 relay 名稱的 SPF(寄件者政策架構)記錄。第二個指令應回傳 DMARC(網域型郵件驗證、回報與一致性)政策。第三個指令取決於 relay 提供的 selector;若回應為空,表示 DKIM 記錄遺失,或發布在錯誤的名稱下,因此你寄出的每封郵件都會通過不了簽章檢查。

接著將一張真實發票寄到你在大型郵件服務商擁有的帳戶,並讀取原始標頭。Authentication-Results 標頭中的 dkim=pass 與 spf=pass 才是唯一有效的證明。應用程式自己的「已寄出」標記,只表示它已將郵件交給 relay。

備份:唯一不能遺失的資料庫

遺失媒體伺服器只代表需要重新下載檔案。即使是 PhotoPrism 或 Immich 等自架相片伺服器,通常也只是保存手機上的原始檔副本,而原始檔仍存在於拍攝這些照片的手機中。遺失開票資料庫則代表你無法證明開立過哪些帳單、已收取哪些款項,或仍欠哪些款項。請以相應的嚴謹程度處理。

請備份 4 項內容。資料庫。儲存磁碟區,其中包含標誌、產生的 PDF 和費用收據。應用程式的環境檔案。以及以一般檔案保存的產生後 PDF,因為即使沒有產生該 PDF 的應用程式,10 年後仍能開啟它。

環境檔案的重要性超乎許多人預期。Laravel 會使用該檔案中的 APP_KEY,加密包括付款閘道憑證在內的敏感儲存值。若將資料庫還原到使用新產生金鑰的環境中,這些值便無法解密。你的發票全部存在,但付款閘道設定已無法讀取。

InvoiceShelf stack 的傾印方式如下。其資料庫服務執行於 mariadb:10,因此容器內使用的工具是 mariadb-dump。

docker compose exec -T database mariadb-dump \
  --user=root --password=YOUR_ROOT_PASSWORD \
  --single-transaction --databases invoiceshelf > invoiceshelf.sql

--single-transaction 會在不鎖定 InnoDB 資料表的情況下建立一致的快照,因此傾印執行期間應用程式仍可提供服務。-T 會阻止 Docker 配置終端機,否則可能損毀重新導向的輸出,產生無法匯入的傾印檔案。

請依排程,使用 加密的 restic 備份將資料傳送至異地儲存,並將保留期限設定為足以涵蓋會計師指定的期間。

接著進行還原。將傾印載入一次性容器,登入後開啟上個月的發票。在你完成這項操作前,無法確認備份是否可用。

您的會計師會要求的資料

不要從教學文章取得稅務建議。以下是這些軟體可以產出的資料,您可以將這份清單交給提供建議的人員。

可匯出的資料。 您應能直接從介面將發票與付款資料匯出為 CSV,不需要資料庫用戶端,也不需要提交支援請求。SQL 傾印是備份,不是匯出,因為您的會計師無法直接開啟。

不可變更的編號。 發票編號應依序編排,不能重複使用,也不應出現缺號。刪除發票會留下缺號,之後必須說明原因。請改用取消或折讓;本節介紹的每個應用程式都支援這些方式。是否必須採用無缺號編號,取決於您註冊的地區,建議及早詢問。

保存期限。 依規定要求的期間保存資料庫傾印與產生的 PDF。PDF 是實際寄出的文件;如果日後有人對發票提出爭議,這份文件才是重要的憑證。

變更歷程。 能夠顯示誰在何時編輯發票相當實用,而這也是這些應用程式之間差異最大的功能。Invoice Ninja 會為每筆記錄保留活動日誌。

在 EU 部分地區,結構化電子發票已成為實際要求,不再只是額外功能。Invoice Ninja 可產生常見格式,包括 ZUGFeRD、XRechnung、Facturae、FatturaPA 與一般的 EN16931。從自架執行個體透過 Peppol network 傳送時,必須使用 Invoice Ninja 自有的 access point。您必須是經驗證的 white-label license 持有人,這也同時作為身分驗證,並購買 e-credits:$50 可處理 500 份文件,或 $100 可處理 1,000 份文件;文件可在 12 個月內寄出或接收。依供應商說法,「透過該 network 傳送與接收很遺憾並非免費」,因此截至 October 2026,這是付費服務。Kimai 的付費 E-Invoice Plus plugin 支援 EN16931、XRechnung、ZUGFeRD、Factur-X,以及處於 beta 階段的 Peppol,但不支援 Facturae 或 FatturaPA。InvoicePlane 提供電子發票整合介面,但核心並未附帶任何格式:您必須從專案的 InvoicePlane-e-invoices repository 加入 templates;其中提供 ZUGFeRD、Factur-X 與 UBL 範例。ERPNext 可透過 ALYF 提供的免費 GPL-3.0 eu_einvoice app 取得 XRechnung、ZUGFeRD 與 Factur-X,但僅支援 CII,不支援 UBL 或 Peppol。InvoiceShelf 的功能列表中沒有電子發票格式。Invoice Ninja 是唯一內建上述全部功能的選項;如果您在 EU 內開立發票,這是選擇它最有力的單一理由。

FAQ

我應該安裝 Crater 還是 InvoiceShelf?

InvoiceShelf。Crater 的預設分支截至 2026 年 10 月 10 日已經 1329 天沒有提交,而 InvoiceShelf 自己的遷移指南稱其為「目前已停止維護的 Crater 專案」。InvoiceShelf 採用相同的 AGPL-3.0 授權與相同的資料模型,因此兩者之間的遷移是資料庫遷移,不必重寫程式。任何仍建議使用 Crater 的指南,都是在該專案停止更新前撰寫的。

我可以不付費,將 Invoice Ninja 用於自己的業務嗎?

可以。自行託管的 Invoice Ninja 依 Elastic License 2.0 授權,可免費使用完整功能,包括定期發票、客戶入口網站與付款閘道。以下兩項功能需要付費。若要移除面向客戶頁面上的 Invoice Ninja 品牌,需要購買白標授權;依該專案截至 2026 年 10 月的說明,價格為「每年 $40」。若要透過 Peppol 網路傳送或接收電子發票,則需要相同的授權,另加預付 e-credits,價格從 12 個月 500 份文件 $50 起。該授權禁止的是將軟體作為代他人提供的代管服務執行。

為什麼我的發票電子郵件會進入垃圾郵件資料夾?

幾乎總是因為郵件未針對其 From 位址中的網域完成驗證。請透過 SMTP relay 傳送,不要直接從 VPS 傳送;接著為網域發布 SPF 與 DMARC 記錄,並依 relay 提供的 selector 新增 DKIM 記錄。將自己的位址保留在 From,並把客戶位址放在 Reply-To。若將客戶位址設為寄件者,而客戶網域發布了 DMARC reject policy,Gmail 會以 550 5.7.26 Unauthenticated email from example.com is not accepted due to domain's DMARC policy 拒絕郵件。請在測試郵件的 Authentication-Results 標頭中找出 dkim=pass 與 spf=pass,以確認修正已生效。

如果我按時數計費,應該選哪一套?

Kimai。它首先是工時追蹤工具,因此發票會根據已核准的工時表項目產生,明細項目就是你記錄的工作。範本是 DOCX、ODS 或 XLSX 檔案,可使用文書處理器設計,比編輯 CSS 更簡單。代價是 Kimai 不提供線上付款功能。其免費的 Customer Portal 外掛可透過秘密連結分享工時表與專案統計資料,但不分享發票,因此你必須以電子郵件寄送 PDF,再透過轉帳收款。Invoice Ninja 也能追蹤工時,並提供支援信用卡付款的完整發票入口網站;如果線上刷卡付款比工時表細節更重要,請改選 Invoice Ninja。

我確切需要備份哪些內容?

資料庫、存放標誌與產生之 PDF 的儲存區、環境檔案,以及以一般檔案保存的已產生 PDF。環境檔案最容易被遺漏:Invoice Ninja 與 InvoiceShelf 等 Laravel 應用程式會使用 APP_KEY 加密儲存的憑證,因此若將資料庫還原到使用新產生金鑰的環境中,付款閘道設定將無法讀取。請將整個備份還原到一次性測試執行個體,並開啟一張舊發票,因為只有這樣才能確認備份可正常運作。