Unified.to
All articles

Best Unified API for Accounting Integrations in 2026


June 10, 2026

Unified.to's Accounting API covers 46 integrations across 19 normalized objects — invoices, bills, journals, payments, contacts, purchase orders, expenses, and financial reports — with 300 readable properties and write support documented per integration in a published capability matrix.

Invoice writes are supported on 23 of 46 integrations, bill writes on 13, and journal entry writes on 12 — including every major ledger: QuickBooks Online, QuickBooks Desktop, Xero, NetSuite, Sage Intacct, Zoho Books, MYOB, and Microsoft Dynamics 365 Business Central. Because the platform is pass-through, every write hits the ledger directly and confirms or fails immediately — no sync queue between your request and your customer's books.

Evaluating accounting unified APIs has a specific failure mode: every vendor claims "read and write financial data," and almost none of them will show you which objects are writable on which platforms before you've signed. The standard advice is to run a bake-off — create an invoice, update it, create a bill, apply a payment, read it all back — across QuickBooks, Xero, and NetSuite on each vendor. That advice exists because the answer isn't published anywhere.

This post covers what the data shows, why writing to ledgers is architecturally different from writing to any other system, and where each platform in this category actually fits.

Why writing to a ledger is different

An accounting system is the system of record for someone's money. A duplicate write into a CRM creates a redundant contact; a duplicate write into QuickBooks double-counts revenue. The failure modes are specific and well known to every finance team that has approved an integration:

Duplicates and idempotency. A timeout, a retry, a replayed job — and the same invoice posts twice. Reconciliation breaks quietly, weeks later.

Period-close locks. Accountants lock closed periods. An integration that posts into a locked period either fails mid-run or — worse — succeeds and reopens an audited month.

Drift between your write and the ledger. On a sync-based platform, a write enters an asynchronous job queue: your application believes the bill exists, the cache says it exists, and the actual ledger confirms it later — or doesn't. Exactly-once posting becomes your problem to verify.

Tax and currency divergence. QuickBooks and Xero calculate tax on different bases with different rounding. Pre-computed totals pushed into the ledger create cent-level mismatches that auditors notice.

Pass-through architecture changes the shape of this problem. On Unified.to, a write request routes directly to the source API: the ledger's own validation — double-entry balancing, period locks, tax calculation, duplicate detection — runs at write time, and your application gets the ledger's answer immediately. There is no intermediate store to drift from the books, because there is no intermediate store. Unbalanced journal? The source system rejects it and you see that error now, not in a sync log tomorrow. The same architecture means no customer financial data rests in the integration layer — relevant for any product handling other companies' books.

What the capability matrix shows

The published numbers, per integration. First the major ledgers:

IntegrationReadable propertiesWritable propertiesWebhook event types
QuickBooks Online2248020
Xero1875218
Odoo15010518
NetSuite14610220
Zoho Books1346918
QuickBooks Desktop1216013
Microsoft Dynamics 365 BC1185528
Sage Intacct1135722
MYOB1017216
Sage Accounting993316
Freshbooks87366
Two things in that table are rare in this category. QuickBooks Desktop — still running a large share of US SMB accounting — has 121 readable and 60 writable properties; most unified APIs skip Desktop entirely. And NetSuite, the platform every vendor lists and few support deeply, carries 102 writable properties and 20 event types.

Then the writes that matter, by object, with field counts on the core ledgers:

ObjectIntegrations with writeQBOXeroNetSuiteSage IntacctZoho Books
Invoice23/4612 fields1115159
Bill13/468815148
Journal entry12/4643547
Contact22/46107136
Expense12/46
Journal entry write is the depth signal worth checking on any vendor: it's the operation that touches the general ledger directly, the one sync platforms most often gate or route through async jobs, and the one finance teams scrutinize hardest. It's supported here across every major ledger, with the source system enforcing that lines balance.

The read-only objects are read-only by design: financial reports, balance sheets, trial balances, and cash flow statements are computed by the ledger, not written to it. And one object-model note that prevents a misreading: the Transaction object is a ledger-line read abstraction — entering transactions happens through the objects accountants recognize: invoices, bills, journals, and expenses, which is where the write support lives.

The full per-field grid — every object, every integration, every property — is in the capability matrix. No other accounting unified API publishes one. The matrix is the bake-off, already run.

Data freshness: what "real-time" means here

Accounting use cases split sharply on freshness. Lending models tolerate daily data. Payment reconciliation, cash application, and anything a finance team compares against their live QuickBooks screen do not.

PlatformArchitectureDefault freshness
Unified.toPass-throughEvery read hits the source ledger at request time; no cache to age
CodatSync-and-cacheSync frequency defaults to None per data type until configured; daily/weekly/monthly available; hourly is a premium feature
MergeSync-and-cachePeriodic syncs per model
RutterSync-basedBi-directional sync on schedules
The practical version: if your product shows an "open invoices" view and your customer has QuickBooks open in the next tab, a cached integration is visibly behind by hours. A pass-through read returns what the ledger says right now — because it asked the ledger right now. The same applies to write confirmation: posted means posted in the books, not posted to a queue.

Codat vs. Rutter vs. Merge vs. Apideck: which fits which product?

Codat is the accounting-data specialist for financial institutions — and increasingly, explicitly so. Their positioning has moved from "universal SMB data API" to advisory intelligence for commercial banks, with packaged lending, underwriting, and spend-insights products on top of accounting, banking, and commerce connectivity. For a lender or bank underwriting SMB credit on historical financials, Codat's solution depth is the right evaluation.

For a B2B SaaS product whose need is reading and writing invoices, bills, and journals across customers' ledgers, you'd be buying a banking-intelligence platform to use its connectivity layer — one with cache-based freshness, async write semantics, and a roadmap pointed at banks.

Rutter unifies commerce, payments, and accounting with a fintech and lending orientation and an aggressive ERP list. Strong fit for merchant-underwriting and commerce-finance products; same sync-based architecture trade-offs.

Merge lists around 10 accounting platforms inside its horizontal multi-category API, with documented AR/AP writes on the core trio. The right evaluation if you're already on Merge for HRIS or ATS and accounting is incremental.

Apideck publishes 20+ accounting connectors with a unified model spanning AP and AR objects, general-SaaS-oriented like us. The differences to test: per-platform write depth (their docs show supported platforms per endpoint rather than a field-level grid) and the 24-hour default virtual webhook cadence noted in our Apideck comparison.

Chift and regional players focus on European accounting tools for fintech use cases — worth a look for DATEV/Fortnox-heavy markets.

A category that includes where financial data actually lives

The 46 integrations include the ledgers — and also Stripe, Shopify, Amazon Seller Central, BigCommerce, Toast, Bill.com, Brex, Ramp, Expensify, and Concur. That's deliberate. The highest-volume accounting integration use case in B2B SaaS is reconciliation across this exact boundary: payouts, orders, fees, and expenses originating in commerce and spend platforms, posted into ledgers as invoices, bills, and journals. One category, one normalized object model, both sides of the entry — rather than an accounting API for the ledger and a separate commerce API for everything feeding it.

It's the same pattern as building with Unified's Payments API: the financial data layer doesn't stop at the general ledger, and the integration layer shouldn't either.

How to choose

Choose Codat if you're a lender, bank, or credit platform underwriting on SMB financial data — their packaged lending solutions are built for exactly that buyer.

Choose Rutter if you're a fintech underwriting commerce merchants and need commerce + accounting data in one fintech-oriented model.

Choose Merge if accounting is a secondary category on a platform you've already adopted for HR or ATS.

Choose Unified.to if you're a B2B SaaS product writing into your customers' books — invoicing, AP automation, expense sync, e-commerce reconciliation — and you want write depth you can verify per field before building, writes that confirm at the ledger, reads that reflect the ledger now, and no customer financial data resting in the integration layer. The same platform carries the other 27 categories when your roadmap gets there.

Start your 30-day free trial

Book a demo

Frequently asked questions

Which unified API supports writing invoices, bills, and journal entries to QuickBooks, Xero, and NetSuite? Unified.to supports writes on all three objects across all three ledgers — invoice writes on 23 of 46 accounting integrations, bill writes on 13, journal entry writes on 12 — with per-field support documented in the published capability matrix. Codat, Merge, Apideck, and Rutter also support core AR/AP writes; none publishes a per-platform, per-field grid to verify depth before building.

How is pass-through different from Codat's sync architecture for accounting data? Codat syncs accounting data into its own cache on configurable schedules (sync frequency defaults to none per data type; hourly sync is a premium feature) and routes writes through asynchronous jobs. Unified.to routes every read and write directly to the source ledger at request time: reads return the ledger's current state, writes are validated by the ledger's own rules — double-entry balancing, period locks, tax calculation — and confirm or fail immediately.

Does Unified.to support QuickBooks Desktop? Yes — 121 readable and 60 writable properties with 13 webhook event types. QuickBooks Desktop still runs a significant share of US SMB accounting and is one of the most commonly missing integrations across unified APIs.

How are duplicate writes prevented? The ledger's own validation runs at write time, because the write executes against the source API directly — there's no intermediate queue replaying jobs. Your application receives the ledger's response synchronously, so retry logic operates on confirmed state rather than on a cache's belief about it.

All articles