指南

如何建置發票 App

發票 App 會保存一份客戶列表,讓你建立含帳項明細與稅額的發票,為每張發票指派唯一編號,產生 PDF 或客戶可以開啟的連結,並追蹤是否已付款。第一版是一個直接的資料庫 App,用 AI 花一兩個下午就能建置完成。真正重要的細節,包括編號、稅額、鎖定的發票與付款狀態,正是區分玩具與能夠寄給客戶的工具的關鍵。

先決定你需要哪一種發票工具

「發票 App」涵蓋好幾種不同的東西。開始之前,請先選定一種:

類型使用者差異
個人發票產生器自由工作者一個事業體、快速產生 PDF、簡單的已付款清單
企業發票工具小型團隊多位使用者、共用客戶列表、報表
嵌入較大 App 的發票功能你的客戶或員工從你已經追蹤的案件、預約或工時自動產生發票
供其他企業使用的發票產品許多企業每個帳號只能看到自己的資料,這就是 SaaS

第三種類型是自建最能發揮價值的地方:如果你已經記錄案件或工時,直接從這些資料產生發票,就能省下重複輸入的時間。第四種則是一個完整的 SaaS MVP,需要處理帳號與計費等議題。

資料模型

四個資料表涵蓋大多數需求:

  • 事業設定:你的名稱、地址、統一編號或增值稅號、標誌、銀行資料、預設付款期限、預設稅率、幣別,以及下一個發票編號。
  • 客戶:名稱、公司、電子郵件、帳單地址、必要時的稅籍編號,以及預設條件。
  • 發票:編號、客戶、開立日期、到期日、狀態、幣別、備註,以及總計(小計、稅額、總額)。
  • 帳項明細:所屬發票、說明、數量、單價、稅率與金額小計。

如果客戶分期或以多種方式付款,可以加入付款資料表:所屬發票、日期、金額、方式、參考編號。

真正重要的規則

如果你沒有特別要求,AI 建置工具通常不會做好這些部分:

  1. 連續且唯一的編號。 許多稅務制度要求發票編號唯一且連續。應在發票正式開立時,由伺服器產生編號,而不是在建立草稿時產生,這樣被放棄的草稿就不會造成號碼缺口。
  2. 鎖定已送出的發票。 發票送給客戶後,若被悄悄修改就會出問題。只允許編輯草稿;對已送出的發票,應作廢後重開,或開立折讓單/貸項通知單。
  3. 快照客戶資料。 如果客戶明年換了地址,去年的發票仍應顯示舊地址。開立發票時,就將客戶資料複製到發票上。
  4. 以最小貨幣單位的整數儲存金額。 以分(或便士)儲存,而不是小數,避免總計因四捨五入而偏差。稅額要依稅務機關要求的方式取捨,可以逐行計算,也可以逐張發票計算。
  5. 狀態要符合實際。 草稿、已送出、已付款、部分付款、逾期、已作廢。「逾期」應根據到期日計算,而不是手動設定。

PDF 還是發票頁面?

客戶通常期待 PDF,但網頁更容易保持同步。多數發票工具兩者都提供:

  • 可分享的發票頁面:附有難以猜測的連結,讓客戶不需登入即可檢視並付款。
  • PDF 下載:由同一份資料產生,附上你的標誌與資料。

請要求適合列印的版面,並確認 PDF 在紙張尺寸(A4 或 US Letter)上的呈現。帳項明細很長時,應能乾淨地跨頁。

線上收款

對許多企業來說,在發票上顯示銀行帳號就足夠了。如果你想接受信用卡付款,可以串接付款服務商:

  • Stripe 結帳或付款連結,金額即為發票金額。客戶在發票頁面點擊「立即付款」。
  • Webhook:付款服務商在付款成功時通知你的 App,App 再將發票標記為已付款。不要僅因客戶返回成功頁面就標記為已付款,因為該頁面可以在未付款的情況下被造訪。參見如何為你的 App 加入付款功能。
  • 先在測試模式下運作。在整個流程都正常之前,使用付款服務商的測試金鑰與測試卡。

值得注意的是,Stripe 自 2026 年 9 月起也提供自家的發票產品,附有代管的發票頁面。如果你只需要寄出發票並收到款項,這可能就已足夠。

催繳提醒

「您的發票即將到期」之類的自動電子郵件,是最受重視的功能之一,也是最容易出錯的功能之一。你需要:

  • 電子郵件服務(Resend、Postmark、SendGrid 等)。參見如何從你的 App 寄送電子郵件。
  • 能定時執行、找出逾期發票的機制。閒置時會休眠的已發布網頁 App 不會自己醒來,因此請詢問建置工具如何觸發檢查,例如由外部的排程服務定時呼叫 App 中的端點。
  • 已寄出提醒的紀錄,確保同一封提醒不會寄給同一人兩次。

先從手動的「寄送提醒」按鈕開始,之後再自動化。

一則可行的第一則提示

為我的網頁設計事業建置發票 App。我登入後管理客戶(名稱、公司、電子郵件、帳單地址、增值稅號)。我建立發票並加入帳項明細(說明、數量、單價),每一行可設定增值稅率,小計、增值稅與總額會即時計算。發票編號是連續的(INV-0001、INV-0002),在我把發票標記為已送出時才指派;草稿保持可編輯,已送出的發票則鎖定。每張發票都有狀態(草稿、已送出、已付款、逾期)與到期日;逾期根據到期日計算。每張發票會產生一個私人的可分享連結,以及附上我的標誌與銀行資料的 PDF 下載。儀表板顯示未收款總額與逾期總額。金額以便士儲存,僅使用英鎊。所有資料存入資料庫。

建置步驟

  1. 先設定事業資料與客戶。 每張發票都依賴它們,所以先讓這兩部分運作。
  2. 發票編輯器。 帳項明細、稅額與總計。用棘手的數字測試,例如 3 × £33.33 加 20% 增值稅,並用計算機核對總計。
  3. 編號與鎖定。 開立三張發票,刪除一張草稿,再開立一張。編號應維持連續,沒有缺口或重複。
  4. 發票頁面與 PDF。 在私密視窗中開啟分享連結,列印 PDF。
  5. 付款。 在測試模式中加入 Stripe,用測試卡支付一張發票,確認 Webhook 會把它標記為已付款。
  6. 安全檢查。 登出後,嘗試把網址中的 ID 改成另一位客戶的發票。只有私人的分享連結應該能開啟,而且不應洩漏其他發票。我們的安全檢查清單有更多可以嘗試的項目。
  7. 匯出。 新增發票與付款的 CSV 匯出,供會計師使用。

常見錯誤

  • 金額使用浮點數。 0.1 + 0.2 不等於 0.3 是真實 App 中真實存在的錯誤。請儲存最小單位的整數。
  • 已送出的發票仍可編輯。 客戶收到後再修改,會造成爭議與帳務問題。
  • 在草稿階段就指派號碼。 會造成缺號與混淆。
  • 可猜測的發票連結。 /invoice/42 會讓人試試 /invoice/43。請使用長的隨機權杖。
  • 假設只有一種稅制。 稅率、反向課稅與必要的法定文字,會因國家與客戶類型而異。請詢問會計師,不要讓 AI 猜測。
  • 沒有備份。 發票是你可能需要保存多年的紀錄。定期匯出,並在方案允許時,把程式碼保存到 GitHub。

成本與工具

項目用途說明
App 建置工具/主機/資料庫建置與運行 App在 Mythex,一份點數餘額即可涵蓋這些項目,請見定價
付款服務商信用卡收款每筆交易收取手續費;請查詢你所在國家的最新費率
電子郵件服務寄送發票與提醒許多服務在低用量時有免費方案
網域專業的發票連結選用,按年計費

何時現成的發票軟體是更好的選擇

當發票是你自己工作流程的一部分、當你希望工具完全依照你的計費方式量身打造,或當你要把發票功能加入已有的 App 時,就適合自建。以下情況則應選擇成熟的會計或發票軟體:

  • 你需要在同一處處理記帳、銀行帳務同步、費用追蹤與報稅。
  • 你所在的國家要求特定格式的電子發票,或必須透過認證管道開立。
  • 你寧願讓會計師使用他們已經熟悉的工具。

一個常見的折衷做法,是自建針對你業務的部分(案件、工時,以及讓客戶查看發票的客戶入口),再把數字匯出到會計軟體。中小企業自建或購買軟體的比較會協助你做出決定。

用 Mythex 建置

在 Mythex 上,你可以在聊天中描述發票 App,並在即時預覽中看到它逐步成形。當 App 需要時,會加入資料庫,並把 Stripe 密鑰等 API 金鑰保存在專案機密中,然後把 App 發布到可立即使用的網址。文件中的 Stripe 範例說明了自備金鑰的設定方式。若想從已描述基本需求的提示開始,可以試用發票產生器或自由工作者發票範本。

常見問題

發票 App 需要哪些功能?

客戶列表、含帳項明細、稅額與總計的發票、不重複且連續的發票編號、PDF 或可分享的發票頁面,以及每張發票的狀態(草稿、已送出、已付款、逾期)。線上收款與催繳提醒是最實用的後續功能。

我的發票 App 可以接受信用卡付款嗎?

可以,透過 Stripe 等付款服務商即可。App 會為發票金額建立付款連結或結帳頁面,付款成功時,付款服務商透過 Webhook 通知 App,將發票標記為已付款。

使用自建的發票 App 合法嗎?

一般而言可以,但發票的法定內容要求因國家而異,例如賣方資料、稅籍編號、日期與稅額拆分,某些國家還要求使用特定格式的電子發票。在依賴之前,請先與會計師確認適用於你的規定。

我應該自建發票 App,還是使用會計軟體?

如果你需要記帳、報稅或銀行對帳,請使用會計軟體。當發票與你自己的工作流程綁在一起(案件、工時、專案),或你想要一個沒有每席位費用的簡單工具時,就適合自建。

Mythex · Pricing · 用 AI 打造任何東西 · 網站與應用程式範本 · Mythex 比較 · AI 應用程式開發詞彙表 · 免費的 AI 應用程式開發工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港)