Nordlet 与 Odoo:平台构建者选型指南
基于各产品自身的官方文档,为正在嵌入式会计 API 与开源 ERP 套件之间进行抉择的开发人员提供的对比指南。
Odoo 和 Nordlet 经常被平台团队同时列入候选名单,但它们并不属于同类型的产品。Odoo 是一个功能广泛的业务应用套件,内置会计功能,支持自行托管和修改。Nordlet 则是一个纯粹的会计后端(accounting backend),专注于会计领域,专为从外部产品调用而设计。
这项选择通常取决于两个问题:你希望将多少业务放在同一个系统中,以及由谁来运行它。下文关于 Odoo 的所有内容均摘自 Odoo 自身的文档和定价页面(相关处均已附上链接)。
产品定位
Odoo 是一个开源套件,涵盖会计、库存、制造、销售、CRM、人力资源、网站建设等功能,提供 Odoo Online、Odoo.sh 或自托管部署选项。它的优势在于功能全面、可扩展性强,且支持自行部署。特定国家/地区的会计业务逻辑由本地化模块提供支持,并拥有庞大的社区。
Nordlet 是一个云会计 API。它通过单一的 REST 接口提供不可变的复式记账总账(double-entry ledger)、发票、采购记录、银行对账单与对账、库存、固定资产、薪资、报表以及欧盟税务处理——目前在 29 个模块中包含超过 400 个端点,均由单一的 OpenAPI specification 生成。它本身也包含一个应用程序,并且运行在外部调用者所使用的相同端点之上。
决定大多数评估结果的 API 问题
这也是两款产品在平台构建者眼中分化最明显的方面。
Odoo 的外部 API 是模型级(model-level)的。 你需要先进行身份验证,然后通过 XML-RPC 或 JSON-RPC 对数据模型(例如用于日记账分录和发票的 account.move、用于联系人的 res.partner 以及用于会计科目的 account.account)调用对象关系映射(ORM)方法。这种方式功能强大:只要系统能建模的内容,你都能触及。这也意味着,正确使用这些模型的责任在于你,你的集成耦合到 Odoo 的内部数据模型,而不是稳定的领域契约(domain contract)。
Odoo 官方资料中的两个事实改变了这种计算:
- Odoo 的文档指出,外部 API 访问权限仅在**自定义(Custom)**定价层级提供,在 One App Free 或标准计划中不可用。因此,API 访问权限是一个定价决策,而不仅仅是技术决策。当前的计划和价格可在 Odoo's pricing page 上查看。
- Odoo 已宣布,
/xmlrpc、/xmlrpc/2和/jsonrpc端点计划被移除(计划在 Odoo 22 和 Odoo Online 21.1 中),取而代之的是更新的 JSON-2 API。基于当前 RPC 端点编写的集成在未来将面临迁移。
Nordlet 的 API 是领域级(domain-level)的。 操作形式为带有 JSON 请求体的 POST /v1/{module}/{resource}/{action},因此你调用的是 sales/invoices/issue(开具销售发票),而不是直接操作日记账模型,会计后果由 API 负责处理。密钥带有权限范围(scopes),例如 sales:write。重试操作受到 Idempotency-Key 头的保护:带有相同有效负载(payload)的相同键会重放存储的响应,而带有更改后有效负载的相同键将被拒绝并返回 idempotency_key_reuse 错误,而不是被静默接受。Webhook 事件在与更改相同的数据库事务中写入事务性发件箱(transactional outbox),因此回滚的文档绝不会发出事件,并且交付时带有你可以验证的 HMAC 签名。
功能对比
标记为“未公开确认”的单元格表示我们无法在开发人员提交代码前所需的级别上验证该功能。这并不意味着该功能不存在。
| 功能 | Nordlet | Odoo |
|---|---|---|
| 产品形态 | 会计 API,托管式 | 完整业务套件;托管式或自托管 |
| 主要接口 | 带强类型 TypeScript SDK 的 REST API | Web 应用程序;模型级外部 API |
| API 协议 | 基于 HTTPS 的 JSON,每个操作对应一个 RPC 风格的 POST | XML-RPC 和 JSON-RPC,正逐步被 JSON-2 API 取代 |
| API 可用性 | 所有计划、所有模块 | 依 Odoo 文档所述仅限自定义计划 |
| 复式记账总账 | 有,通过提交时的数据库触发器强制保持平衡 | 有,在会计模块内 |
| 期间锁定(Period locking) | 有;锁定期间内的过账日期将被拒绝并返回 409 |
会计模块支持锁定日期 |
| 幂等键(Idempotency keys) | 有,包含重放和冲突处理的已记录语义 | 外部 API 未公开确认 |
| Webhooks | 有,已签名、支持重试、来自事务性发件箱 | 存在自动化操作和 Webhook;交付保证未公开确认 |
| 审计记录 | 每次变更包含操作者、操作、实体、差异;可查询 | 动态讨论区(Chatter)和日志注释;范围因模型而异 |
| 欧盟增值税(EU VAT) | 欧盟 27 国的各国家/地区税率、VIES 验证、带更正的 OSS/IOSS 计算 | 各国本地化模块;深度因国家/地区而异 |
| 电子发票 | 适用于 Peppol BIS 3.0 的 EN 16931 UBL;支持 IT、PL、RO 的国家格式 | 本地化模块涵盖多种国家格式 |
| 库存、制造 | FIFO 库存、物料清单(BOM)、组装与拆卸、工艺路线、工作中心、按工序记录的生产订单、质量检查、维护 | 功能广泛,核心优势 |
| CRM、网站、营销 | 仅限合作伙伴咨询、群组和状态;无网站构建器或营销工具 | 有,核心优势 |
| 自托管 | 无;自定义层级列出了自携云(BYOC)支持 | 有 |
| 源码可用性 | 专有 | 开源核心,提供付费版本 |
| 多公司 | 一个账号下无限家公司,基于角色的访问控制 | 支持多公司 |
定价模型
它们无法进行逐项对比,因为它们的收费标准不同。
Odoo 按每用户每月收费,免费层级仅限单个应用程序,且外部 API 访问权限仅限自定义层级。对于平台而言,尴尬之处在于,当是由软件(而不是员工)生成会计数据时,“用户数”并不是衡量负载的良好指标。自托管消除了订阅成本,但增加了基础设施和维护成本。
Nordlet 按请求量收费。已公布的计划包括:每月 10 欧元对应 3,000 次请求,50 欧元对应 30,000 次请求,300 欧元对应 200,000 次请求,超出请求按次计费,另可按需提供自定义层级。每个计划都包含所有模块和完整的 API;用户、公司和沙盒公司数量不限。请求指通过 API 或应用程序执行的任何操作。
实际影响是:一个拥有 4 名员工、每月产生 50,000 次会计操作的市场平台,在按量计费模式下按 50,000 次操作付费,而在按用户计费模式下则为 4 名用户付费——并且当业务量翻倍时,按用户计费的数字不会发生变化,这具有两面性。请根据你自己的数据进行建模。
Odoo 是更优选择的场景
- 你希望在同一个系统、同一个数据库中拥有会计、库存、制造、CRM 和网站。
- 出于数据驻留、成本或政策原因,你需要进行自托管。
- 你希望修改源码,并且拥有在升级过程中维护这些修改的内部实力。
- 你的会计工作属于内部业务管理,而不是你所售卖产品的一项功能。
- 你所在的国家/地区拥有强大且积极维护的 Odoo 本地化模块。
Odoo 的功能广度是真实的,没有任何会计 API 可以取代它。
Nordlet 适用的场景
- 是你的软件(而不是你的员工)在创建会计事件。
- 你需要在一个账号下为许多公司维护账套,而无需按实体支付订阅费。
- 你需要平台能够依赖的强制不变量(invariants):平衡过账、连续编号、锁定期间、不可变历史、幂等写入。
- 你希望针对稳定的领域契约进行集成,而不是内部数据模型。
- 你的欧盟增值税合规义务跨越多个国家/地区,且你希望自己维护这套逻辑。
明确说明其限制:Nordlet 目前处于早期访问(early access)阶段并正在对接设计合作伙伴;采用托管式而非自托管;合作伙伴记录仅包含咨询、群组和状态,没有销售漏斗,也没有网站构建器或营销功能;薪资功能目前仅限立陶宛;目前提供三个国家/地区的国内申报包——立陶宛(FR0600)、德国(UStVA)和波兰(JPK_V7M)——OSS 和 Odoo 会计算但不会代为提交。
在提交决策前我们建议验证的事项
- 确认你实际需要的 Odoo 计划。 如果外部 API 访问需要自定义层级,请根据你的用户数对该层级进行定价评估,而不是入门层级。
- 询问任何计划保留的 Odoo 集成的 RPC 迁移时间表,以防范官方宣布移除当前端点的影响。
- 对两者进行重试测试。 发送两次相同的请求并计算生成的条目数。
- 测试期间锁定。 关闭一个期间,然后尝试向其中过账。
- 检查你的具体国家/地区。 对于 Odoo,查看哪个本地化模块以及其维护活跃度;对于 Nordlet,查看目前针对这些国家/地区存在哪些 VAT 输出。
- 对三年内的总成本进行建模,包括自托管的托管与升级工作量,以及按量计费下的请求量增长。
FAQ
Odoo 是免费的吗?
Odoo 发布了仅限单个应用程序的免费层级,且社区版是开源的。对于平台集成而言,相关成本通常是托管、升级、本地化维护以及外部 API 访问所需的付费层级,而不是许可证本身。
Odoo 可以用作市场平台的嵌入式会计后端吗?
它可以集成,有些团队也确实这么做了。需要考虑的事项是:外部 API 在数据模型级别工作,API 访问与特定的定价层级绑定,当前的 RPC 端点计划被替换,以及你需要承担正确使用会计模型的责任。请根据你自己的需求进行验证,而不是盲目假设。
Nordlet 具备 Odoo 的所有功能吗?
不具备。Nordlet 专注于会计及周边业务——发票、总账、银行、库存、资产、生产、薪资、报表、欧盟税务。制造功能涵盖物料清单、工艺路线、工作中心、按工序记录的生产订单、质量检查和设备维护,但不包含 Odoo 所提供的需求和产能规划。合作伙伴记录提供咨询、群组和状态,而没有销售漏斗,也没有网站构建器和营销工具。
哪一个对欧盟增值税(EU VAT)更好?
这取决于国家/地区。Nordlet 提供各国家/地区的欧盟增值税税率、VIES 验证、带前期更正的 OSS 和 Odoo 申报计算、i.SAF 登记册以及 EN 16931 UBL,其中立陶宛是本地化支持最深入的国家/地区包。Odoo 的覆盖范围来自本地化模块,其深度和维护因国家/地区而异,因此针对任何特定国家/地区的诚实回答是去检查该国家/地区的模块。
我可以自托管 Nordlet 吗?
标准计划不支持。自定义层级列出了自携云(BYOC)支持,如果自托管是一项硬性要求,可以围绕此进行沟通。