指南

如何构建发票应用

发票应用保存客户列表,让你创建带有明细项目和税费的发票,为每张发票分配唯一编号,生成 PDF 或供客户打开的链接,并跟踪其是否已付款。第一版是一个直接的数据库应用,用 AI 在一两个下午就能做出来。真正重要的细节——编号、税费、锁定的发票、付款状态——才是把玩具和能够发给客户的工具区分开来的地方。

先确定你需要哪种发票工具

“发票应用”可以指几种不同的东西。开始之前先选定一种:

类型使用者区别在哪里
个人开票工具自由职业者一个业务主体、快速生成 PDF、一份简单的付款人名单
企业开票工具小型团队多个用户、共享的客户列表、报表
嵌入更大应用中的开票功能你的客户或员工从你已经记录的工作、预约或工时中直接生成发票
面向他人的开票产品许多企业每个账户只能看到自己的数据——这就是一个 SaaS

第三种类型最能体现自建的价值:如果你本来就记录了工作或工时,那么直接从这些数据生成发票,可以省去重复录入。第四种则是完整的 SaaS MVP,还需要处理账户和计费等问题。

数据模型

四张数据表可以覆盖大多数需求:

  • 企业设置——你的名称、地址、税号或增值税号、logo、银行信息、默认付款条件、默认税率、货币,以及下一个发票编号。
  • 客户——姓名、公司、邮箱、账单地址、必要时的税号,以及默认付款条件。
  • 发票——编号、客户、开票日期、到期日、状态、货币、备注,以及合计(小计、税额、总额)。
  • 明细项目——所属发票、描述、数量、单价、税率和行合计。

如果客户分期付款或使用多种方式付款,可以再添加一张付款表:所属发票、日期、金额、付款方式、参考号。

关键规则

除非你明确提出要求,否则 AI 构建器通常不会自动做对以下这些部分:

  1. 连续且唯一的编号。 许多税务系统要求发票编号唯一且连续。应在发票正式开具时由服务器生成编号,而不是在创建草稿时生成,这样废弃的草稿就不会留下空缺。
  2. 锁定已发送的发票。 发票发出之后如果被悄悄修改,就会出问题。只允许编辑草稿;对于已发送的发票,应作废后重开,或开具贷项通知单。
  3. 快照客户信息。 如果客户明年更换了地址,去年的发票仍应显示旧地址。开具发票时,应将客户信息复制到发票上。
  4. 以最小货币单位的整数存储金额。 以分(或便士)为单位存储,而不是小数,这样合计金额就不会因舍入而出现偏差。税额的舍入方式应符合税务机关的要求,即按行舍入或按发票舍入。
  5. 状态应与实际情况一致。 草稿、已发送、已付款、部分付款、逾期、已作废。“逾期”应根据到期日自动计算,而不是手动设置。

PDF 还是发票页面?

客户通常希望收到 PDF,但网页更容易保持同步。大多数发票工具两者都提供:

  • 可分享的发票页面,使用难以猜测的链接,客户无需登录即可查看和付款。
  • PDF 下载,基于同一份数据生成,带有你的 logo 和信息。

请确认版式适合打印,并检查 PDF 在纸张尺寸(A4 或美国信纸)上的效果。较长的明细列表应能干净地跨页分割。

在线收款

对很多企业来说,在发票上显示银行信息就已足够。如果你希望接受银行卡付款,可以连接支付服务商:

  • Stripe Checkout 或付款链接,金额为发票金额。客户在发票页面点击“立即付款”。
  • Webhook:服务商在付款成功时通知你的应用,应用随即将发票标记为已付款。不要仅仅因为客户返回了成功页面就标记为已付款——这个页面可能在未付款的情况下也能访问。参见如何为应用添加付款功能。
  • 先使用测试模式。 在整个流程跑通之前,使用服务商的测试密钥和测试卡。

值得了解的是:截至 2026 年 9 月,Stripe 也提供自己的发票产品,带有托管的发票页面。如果你只需要发送发票并收到付款,这可能就已经足够。

付款提醒

自动发送的“您的发票即将到期”邮件是最受重视的功能之一,也是最容易出错的功能之一。你需要:

  • 一个邮件服务商(Resend、Postmark、SendGrid 等)——参见如何从应用发送邮件。
  • 一个能定时运行、用于查找逾期发票的机制。已发布的网页应用在闲置时会休眠,不会自己醒来,因此要询问构建者如何触发检查——例如由外部定时任务服务定期调用应用中的一个端点。
  • 一份已发送提醒的记录,确保没有人收到重复的邮件。

先从手动的“发送提醒”按钮开始,之后再实现自动化。

一条有效的首条提示词

为我的网页设计业务构建一个发票应用。我登录后管理客户(姓名、公司、邮箱、账单地址、增值税号)。我创建带有明细项目(描述、数量、单价)的发票,每行可设置增值税税率,并实时看到小计、增值税和总额。发票编号连续(INV-0001、INV-0002),在我将发票标记为已发送时分配;草稿可以继续编辑,已发送的发票则锁定。每张发票都有状态(草稿、已发送、已付款、逾期)和到期日;“逾期”根据到期日自动计算。每张发票都有一个私密的可分享链接,以及一份带有我的 logo 和银行信息的 PDF 下载。仪表盘显示未收款总额和逾期总额。金额以便士存储。只使用英镑。所有数据保存在数据库中。

构建步骤

  1. 先设置企业信息和客户。 每张发票都依赖这些信息,因此要先让它们正常工作。
  2. 发票编辑器。 明细项目、税费和合计。用棘手的数字进行测试——例如 3 × £33.33,税率 20%——并用计算器核对合计。
  3. 编号与锁定。 开具三张发票,删除一张草稿,再开具一张。编号应保持连续,没有空缺或重复。
  4. 发票页面和 PDF。 在隐私窗口中打开分享链接,打印 PDF。
  5. 付款。 在测试模式下添加 Stripe,用测试卡支付一张发票,确认 webhook 将其标记为已付款。
  6. 安全检查。 退出登录,尝试通过修改 URL 中的 ID 打开另一位客户的发票。只有私密链接应当有效,而且不应泄露其他发票。我们的安全检查清单列出了更多需要测试的项目。
  7. 导出。 添加发票和付款的 CSV 导出,供会计使用。

常见错误

  • 使用浮点数处理金额。 0.1 + 0.2 不等于 0.3,这在真实应用中确实会出现。请以最小单位的整数存储。
  • 可编辑已发送的发票。 客户收到发票之后再修改,会引发纠纷和会计问题。
  • 在草稿阶段分配编号。 会造成空缺和混乱。
  • 可以猜到的发票链接。 /invoice/42 会诱使别人尝试 /invoice/43。应使用足够长的随机令牌。
  • 假设只有一种税务规则。 税率、反向征税和必需的表述因国家和客户类型而异。请咨询会计师,不要让 AI 去猜。
  • 没有备份。 发票是你可能需要保存多年的记录。应定期导出;在允许的套餐中,还应将代码保存在 GitHub 上。

成本与工具

组成部分用途说明
应用构建器 / 托管 / 数据库构建并运行应用在 Mythex 上,一个积分余额即可覆盖以上所有项目——参见价格
支付服务商银行卡付款按每笔交易收取手续费;请查看该服务商在你所在国家的最新价格
邮件服务商发送发票和提醒很多服务商在低用量时提供免费套餐
域名专业的发票链接可选,按年计费

什么时候现成的发票软件更好

当开票是你自己工作流程的一部分、你希望工具完全贴合你的开票方式,或者你要在已有的应用中增加发票功能时,就值得自己构建。以下情况则应选择成熟的会计或发票软件:

  • 你需要在同一个地方完成记账、银行流水同步、费用追踪和报税。
  • 你所在国家要求以特定格式或通过认证渠道开具电子发票。
  • 你更希望会计师使用他们已经熟悉的工具。

一个常见的折中方案是:自建与你的业务紧密相关的部分(项目、工时表、让客户查看发票的客户门户),然后把数字导出到你的会计软件中。小企业应该自建还是购买软件一文详细讨论了这个决定。

用 Mythex 构建

在 Mythex 上,你在聊天中描述这个发票应用,然后在实时预览中看着它逐步成形。当应用需要时,它会添加数据库,把 Stripe 密钥等 API 密钥保存在项目机密中,并将应用发布到一个可以立即使用的网址。文档中的 Stripe 教程展示了自带密钥的配置方式。如果你希望从一条已经描述了基本功能的提示词开始,可以试试发票生成器或自由职业者发票模板。

常见问题

发票应用需要哪些功能?

客户列表、带明细项目、税费和合计金额的发票、唯一且连续的发票编号、PDF 或可分享的发票页面,以及每张发票的状态(草稿、已发送、已付款、逾期)。在线支付和付款提醒是最有用的后续功能。

我的发票应用能接受银行卡付款吗?

可以,通过 Stripe 等支付服务商即可。应用会为发票金额创建一个付款链接或结账页面,付款成功后,服务商发来的 webhook 会将发票标记为已付款。

使用我自己的发票应用合法吗?

一般来说是合法的,但发票的法律内容要求因国家而异——例如卖方信息、税号、日期和税额明细——而且有些国家要求以特定格式开具电子发票。在依赖它之前,请先向会计师确认哪些规定适用于你。

我应该自己构建发票应用,还是使用会计软件?

如果你需要记账、报税或银行对账,就用会计软件。如果开票与你自己的工作流程紧密相关——例如项目、工时表——或者你想要一个没有按席位收费的简单工具,那就自己构建。

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 繁體中文(香港) 繁體中文(台灣)