Unified.to
All articles

Best Unified API for Accounting Integrations in 2026


June 10, 2026

Updated June 2026

Unified.to's Accounting API covers 47 integrations across 19 normalized objects — invoices, bills, journals, contacts, expenses, credit memos, purchase orders, and the computed statements (reports, balance sheets, trial balances, profit and loss, cash flow) — with 301 readable properties and write support documented per integration in a published capability matrix.

Invoice writes are supported on 23 of 47 integrations, bill writes on 13, and journal entry writes on 11 — 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.

The alternatives sort by what you're building. Codat is the accounting-data specialist for banks and lenders. Rutter fits commerce-plus-accounting fintech. Merge is the multi-category default when accounting sits next to HRIS or CRM. Apideck and Truto are the other pass-through options. The right choice depends on write depth, freshness, and whether the vendor will show you which fields are writable on which ledgers before you sign.

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 pass-through platform, the write executes against the source API and returns the ledger's own confirmation synchronously: the bill exists in the books, or you have the ledger's error. On a sync-and-cache platform, an intermediate store sits between your write and the ledger, and write-confirmation semantics vary by vendor — some expose idempotency controls, some process writes through background jobs, some don't document the model at all. Ask each vendor how a write is confirmed and how duplicates are prevented, because the answer is the difference between "posted to the books" and "accepted into a queue."

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, and the posture an enterprise security review is built to find: SOC 2 Type II, GDPR, CCPA, HIPAA, and PIPEDA, regional data isolation across US, EU, and AU, and — on higher tiers — credentials held in your own secrets manager rather than the vendor's.

What the capability matrix shows

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

IntegrationReadable propertiesWritable propertiesWebhook event types
QuickBooks Online2245620
Xero1874318
Odoo15010318
NetSuite1469620
Zoho Books1345618
QuickBooks Desktop1215013
Microsoft Dynamics 365 BC1185228
Sage Intacct1134822
MYOB1016016
Sage Accounting992116
Freshbooks87316
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 50 writable properties; few unified APIs publish Desktop's field-level support. And NetSuite, the platform every vendor lists and few support deeply, carries 96 writable properties and 20 event types.

The third column — webhook event types — points at a second architectural difference. Most accounting platforms don't offer native webhooks: the ledger has no built-in way to tell your application that an invoice was paid or a transaction posted. Unified.to closes that gap with virtual webhooks — change detection at a configurable interval, as frequent as every minute, delivered to your endpoint with the changed records in the payload, no follow-up fetch and no polling logic in your application. Where a ledger does provide native webhooks, those pass through on the same interface, so your code doesn't branch on which delivery path an integration uses. For reconciliation, it means a payment applied or a journal posted arrives as an event, not on the next scheduled sync.

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

ObjectQBOXeroNetSuiteSage IntacctZoho
Invoice9914147
Bill5615135
Journal31415
Contact9612-5
Expense45755
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 across every major ledger here, with the source system enforcing that lines balance — deep on NetSuite and Zoho Books, and limited to a single writable field on Xero and Sage Intacct, because that's what those ledgers' own APIs expose. The grid shows you which, per integration, before you build. (Contact writes show the same shape: broad across most ledgers, unavailable on Sage Intacct, which the matrix marks rather than hides.)

The read-only objects are read-only by design: financial reports, balance sheets, trial balances, profit and loss, 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 a per-field write capability matrix: which fields are writable, read-only, and required on create, per integration.

Three properties rarely travel together in this category: a pass-through architecture with no customer financial data at rest, deep normalization out of the box rather than per-tenant mapping you build yourself, and a published per-integration write capability matrix. Apideck and Truto are pass-through, but neither publishes per-field write support, and Truto leaves normalization to per-tenant JSONata. Merge normalizes well and publishes field presence, but it's sync-and-cache and doesn't mark which fields are writable. Codat and Rutter store the data. Among the platforms in this comparison, only Unified.to holds all three at once — and delivers events on the same pass-through architecture through virtual webhooks, on ledgers that have no native webhooks of their own.

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.

Does pass-through add latency?

A pass-through read costs whatever the source ledger costs to answer, plus a small, bounded hop through the integration layer. The hundreds of milliseconds sometimes attributed to "real-time architecture" are mostly the source system's own response time: NetSuite, QuickBooks, and Xero are not uniformly fast, and a cached architecture hides that latency by serving an older copy.

The figures circulating in 2026 vendor comparisons — roughly 800ms to 1.5s of "pass-through overhead" — carry no published methodology and bundle the source API's latency with the integration layer's. They also tend to appear in material from vendors whose own architecture is pass-through, where the same number would apply. The honest decomposition: the unified layer adds a bounded hop; the variable cost is the ledger, and it's the same ledger you'd be calling directly.

For accounting specifically, that trade is rarely the deciding one. Correctness is. A write confirmed against a cache is a belief about the ledger; a write confirmed against the ledger is the ledger's answer.

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

One objection runs through every "code-first" pitch in this category: that a unified model flattens to the lowest common denominator and hides the platform-specific fields you actually need. Unified.to answers it in the architecture — raw passthrough reaches any source-specific endpoint, and the metadata API reads and writes custom fields and objects, so normalization is the default, not the ceiling. With that established, here's where each platform fits.

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. The architecture underneath is sync-and-cache: Codat's own docs default automatic sync to None until you configure it, recommend daily as the baseline, and gate hourly behind a premium tier — scheduled-sync freshness, with a roadmap pointed at banks.

Codat vs Unified.to

Rutter unifies commerce, payments, accounting, and ads across 60+ platforms with a fintech and lending orientation: a strong fit for merchant-underwriting and commerce-finance products. Its accounting model normalizes source data into Rutter's own store, with passthrough as an escape hatch for source-specific fields. What it doesn't publish: a per-platform, per-field write matrix, a documented write-confirmation model, or a sync cadence. Rutter is the right answer for commerce-finance products reading against a normalized store that don't need per-field write support verified before building.

Merge is the multi-category default: accounting alongside HRIS, ATS, CRM, and ticketing. On accounting it covers a focused ledger set — QuickBooks Online, NetSuite, Xero, Sage Intacct, Sage Accounting, FreshBooks, and Zoho Books — with documented writes on core objects. Architecture is sync-and-cache. Merge publishes per-model field coverage per integration — which fields exist on each ledger — but not which of those fields are writable versus read-only. The right evaluation if you're already on Merge for HRIS or ATS, accounting is incremental, and reads against a scheduled cache fit your freshness needs.

Merge vs Unified.to

Apideck publishes 48 accounting connectors and shares Unified.to's posture: real-time pass-through, no third-party data persisted. Two differences decide it. First, structure: Apideck runs accounting and e-commerce as separate unified APIs with separate object models, so reconciliation across the commerce-to-ledger boundary spans two integrations and two schemas — where Unified.to models the ledgers and the commerce and spend platforms feeding them in one category and one object model. Second, disclosure: Apideck documents supported operations per endpoint and per-connector resources, but not which fields are writable per platform. Apideck is the right answer when an embedded marketplace UX is the requirement and your accounting and commerce needs stay in separate lanes.

Apideck vs Unified.to

Truto is the closest architectural peer here after the pass-through line: a pre-built normalized accounting API across 11 providers, real-time pass-through, with explicit AI-agent positioning. The differentiator it leads with is per-tenant schema customization through JSONata, which trades deep out-of-the-box normalization for manual mapping control. Write support is documented at the resource level — expenses are writable, accounts are readable — but there's no per-platform, per-field write capability published, and the catalog is smaller. Truto is the right answer when per-tenant schema control matters more than catalog size or normalization you don't maintain yourself.

Truto vs Unified

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 47 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 evaluate any unified accounting API

Six questions cut through the marketing, regardless of which vendor you pick:

  1. Is the per-field write capability published? Not "do you support writes," but which fields are writable, read-only, and required on create, per integration. If it isn't published, you'll discover it during implementation.
  2. Which objects can you write, on the specific ledgers your customers run? Invoice and bill writes are broadly supported; journal and contact writes vary sharply by ledger. Get the per-integration answer in writing.
  3. Pass-through or sync-and-cache, and where does financial data rest? One keeps customer books out of the integration layer; the other puts the vendor inside your customers' compliance scope. Neither is wrong; one extends your enterprise security reviews.
  4. How is a write confirmed? Synchronously against the ledger, or accepted into a queue and reconciled later? Ask how duplicates are prevented and what your retry logic operates on.
  5. What's the freshness model? Live reads, or scheduled syncs with cadence tied to tier? For reconciliation against a live ledger, the difference is correctness, not just speed.
  6. Are premium ledgers surcharged? NetSuite and Sage Intacct are where some pricing models add per-ledger fees or throttles. Check before your heaviest customers land on them.

If a vendor's answer to the first question is no, the rest are whatever they need to be to close the deal.

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.

Start your 30-day free trial

Book a demo

Frequently asked questions

What is the best unified API for accounting integrations? It depends on the workload. Unified.to fits B2B SaaS products writing into customers' ledgers — invoicing, AP automation, expense sync, e-commerce reconciliation — that want per-field write depth verifiable before building and no financial data stored in the integration layer: 47 integrations on a pass-through architecture with a published capability matrix. Codat fits banks and lenders underwriting on SMB financials. Rutter fits commerce-plus-accounting fintech. Merge fits read-heavy, multi-category products. Apideck and Truto are the other pass-through options, neither with a published per-field write matrix.

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 47 accounting integrations, bill writes on 13, journal entry writes on 11 — 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 until configured, and hourly sync is a premium feature. 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 50 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