Integrations
Xero integration: what to sync and what to leave
Send Xero what your accountant needs to close the books, and little more. Most failed Xero integrations try to mirror everything, and then spend their time arguing with the people who use Xero every day.
By itmarkerz Technologies. Updated 30 October 2026.
What to sync
We run a live Xero sync on a UK billing platform, alongside QuickBooks Online and Sage. This table is a starting position for a business that bills from its own system. Your accountant may change it, and that conversation is the most useful hour of the project.
| Data | Sync? | Why |
|---|---|---|
| Customers (contacts) | Yes, one way, with Xero’s ID stored on your side | Invoices need them. Match on your ID, not on the name |
| Invoices and credit notes | Yes, once issued | This is the core of the integration. Drafts stay on your side |
| Payments and fees | Yes, if you collect in your system | Stops finance entering them twice |
| Chart of accounts and tax rates | Read only, for your mapping screen | Xero owns these; your app should never edit them |
| Products and price lists | Usually no | Line descriptions and account codes are usually enough |
| Purchase bills | Only if your system handles them | Otherwise they’re finance’s work, and not your concern |
| Bank transactions | No | Bank reconciliation belongs in Xero, with Xero’s tools |
| Manual journals | Rarely | Use only if your accountant asks for summary posting |
| Xero reports | Rarely | Build your operational reports from your own data |
The limits you are designing around
| Limit | Value |
|---|---|
| Concurrent calls | 5 |
| Calls per minute | 60 |
| Calls per day, Starter tier | 1,000 |
| Calls per day, Core and above | 5,000 |
| App-wide calls per minute | 10,000 |
| Connections, Starter / Core / Plus / Advanced | 5 / 50 / 1,000 / 10,000 |
Sources: Xero’s API limits and pricing tiers. Exceeding a limit returns HTTP 429, with an X-Rate-Limit-Problem header naming which one and Retry-After saying how long to wait. Responses also report how much allowance remains. Read these rather than hard-coding a delay.
Sixty a minute sounds like plenty until a first sync of several years’ invoices, or a month-end bill run. Do the arithmetic with your real volumes. A customer with a few hundred invoices a day on the Starter tier is close to its cap once you add contacts and payments. So queue calls per organisation, group what Xero lets you group, and fetch only changed records where the endpoint supports it.
The failures to design for
- Lock dates. Accountants lock periods after closing. A back-dated invoice or credit note will then be rejected. Your system must hold it, say why in plain language, and let finance decide the new date.
- Missing mapping. A new product needs an account and tax code. Stop that one document and tell finance rather than posting to a guessed code.
- Duplicate contacts. “Acme Ltd” and “ACME Limited” are the same customer to a person, and different to an API. Store Xero’s contact ID once matched, and offer a matching screen for the first import.
- Retry after a timeout. Xero may have created the invoice even though your request timed out. Check using your unique invoice number before you create it again.
- A connection that stops working. Connections end when someone revokes access or leaves the company. Detect it, pause the queue, keep the data, and ask a named person to reconnect.
- Someone edits an invoice in Xero. Finance can change a document you posted. Agree whether they may, and how your system finds out, or the two sets of figures will drift.
Check it every day
Even a good sync needs a daily check. Compare the totals of what you sent with what Xero holds, per day and per customer, and raise any difference. The platform we built for a UK client runs nightly balance checks for this reason. A sync with no such check can be wrong for months, and the first to notice will be your accountant at year end.
For how Xero fits with Stripe, QuickBooks and Sage, see the UK finance integration map.
Where we run a Xero sync
UK telecom billing and revenue-assurance platform for resellers and MSPs: CDR rating, locked bill runs, Stripe card and Direct Debit collection, full receivables and ledger, Xero/QuickBooks/Sage sync, supplier-invoice reconciliation. Laravel + Next.js, two and a half years and ongoing.
- Sector
- Telecom & IT services
- Region
- UK
- Stack
- Laravel, Next.js
- Engagement
- Long-term engineering partner, 2.5 years and ongoing
Questions
What are the Xero API rate limits?
Per connected organisation: 5 concurrent calls, 60 calls a minute, and a daily limit of 1,000 on the Starter tier or 5,000 on higher tiers. There is also a limit per minute across all of your app's connections, documented as 10,000. Xero returns HTTP 429 when you exceed one.
Does a custom integration for one company need a paid Xero tier?
It depends on your connections and usage. Xero's Starter tier currently allows 5 connections and has no monthly fee, but with the lower daily limit. Check the current pricing page, because Xero's tiers have changed before and may do so again.
More on integrations
- Stripe Direct Debit, Xero, QuickBooks and Sage: a UK finance integration mapEach system by method, sync direction, limits and how it fails.
- Stripe Bacs Direct Debit: pending states, failures and reconciliationThe timeline, the events, what each failure means and how to match payouts.
- Connecting to Sage 50: why we ship a daily journal fileWhen a file beats a live connection, and how to make it safe to import.
- Three ad APIs, one modelAdapters for Facebook, Instagram and Google without merging what doesn't match.
- A bot on the same API as your websiteWhy a Telegram bot shouldn't have its own business logic.
Connecting your system to Xero?
Tell us what you bill from and how your accountant works. We will tell you what we would sync, and what we’d leave alone.
We reply within one business day (IST).