Xero ecommerce integration without guessing at the books

The store already takes orders. Xero already holds the invoices. The gap is the hand-off — contacts, invoices, payments, and which system is allowed to post. We will tell you what to connect, and what to leave alone.

Australian ecommerce team. We look at the store and the Xero organisation before anyone talks about a connector.

Still running a store that needs Xero?

The store still takes orders. Xero still does the books. That is why the two have been left talking through spreadsheets, or through a plugin nobody wants to touch.

Xero is cloud accounting — invoices, contacts, bank, payroll, connected apps. It was founded in Wellington in 2006, is NZ-incorporated, and listed on the ASX. Its FY24 annual report claims 4.2 million global subscribers across Australia, the UK, the US and more than 180 other countries. That is Xero’s global figure, not an Australian store count, and we will not dress it up as one.

You might recognise one of these:

  • Web orders sit in the store, and someone re-keys invoices into Xero
  • Contacts in Xero do not match the customer list on the site
  • An inventory product already posts to Xero, and a second store connector would double the invoices
  • A bought plugin worked until OAuth, scopes, or a Xero change broke it
  • You need credit notes and payments to follow the invoice, not just a one-way dump
  • You are not sure whether Xero is the right place to hold stock at all

You do not need a new storefront, or a rebuild pitch. You need a clear read on the Xero organisation you already have, and the store that has to talk to it.

Why these connections stall

Xero is a real accounting product with a public Accounting API. The stall is rarely “Xero has no API”. It is the gap between a working store and a Xero org that already has rules, apps, and a chart of accounts.

OAuth scopes

Not a warehouse

Double-post

Plugin rot

OAuth and scopes are the front door, not an API key in a config file.

The Accounting API is REST over HTTPS (https://api.xero.com/api.xro/2.0/). Auth is OAuth 2.0 — client id and secret. There is no basic API-key auth. Custom Connections (client-credentials) are available for AU, NZ, UK and US organisations. Apps created on or after 2 March 2026 use granular scopes. Older apps must migrate by 13 September 2027. A connector that still assumes the old scope model will fail on a new app, and will have a deadline on an old one.

Xero is the books. It is not the warehouse.

Ecommerce jobs that belong in Xero are invoices, credit notes, contacts, items as accounting items, payments, and optional repeating invoices. Live warehouse quantity usually lives in Cin7, Unleashed, or an ERP. Xero taking financials while another system holds stock is a normal AU/NZ pattern — Unleashed documents its own Xero integration on its site; that is Unleashed’s product, not ours. Pushing “stock on hand” into Xero as if it were a WMS is how you get a ledger that lies.

A second poster will double the invoices.

If Cin7, Unleashed, or Peach already syncs sales into Xero, the store must not post the same invoice again. The first design question is who is allowed to create the Xero Invoice. Get that wrong and the BAS is the thing that breaks, not the plugin.

Bought connectors rot on auth and mapping, not on “REST”.

Contacts, Items, Invoices, Payments, Credit Notes and Purchase Orders are the entities that matter. Mapping a SKU to a Xero Item, a guest checkout to a Contact, and a refund to a Credit Note is the work. A generic “Xero plugin” that only dumps a sales invoice and ignores credit notes, payments, or tax codes is how these jobs come back six months later.

None of that makes the store or the Xero file worthless. It does mean “turn on the Xero app on Monday” is usually the wrong first move.

How we work

We start with the store and the Xero organisation, not with a connector name.

1

Look at what you have

Store platform (nopCommerce, AbleCommerce, Shopify, or another CMS), how orders and refunds work today, which Xero organisation and which apps already have access, and whether inventory or ERP already posts invoices. We will tell you who should own the Invoice, and who should not.

2

Decide the job

There are three honest outcomes. We recommend one, not all three.

3

Do the work in stages

Contacts and items first, then invoices, then payments and credit notes. Staging against a Xero demo or a spare org beats a Friday post into the live file. Unused Xero apps and dead plugins do not come across.

4

Hand it back so the next person can run it

Source, the Xero app and scope list, and a short record of what posts where. Someone else should be able to see why an invoice appeared.

Three honest outcomes

  • Connect the store to Xero with a custom integration: upsert Contacts, map SKUs to Items, push Invoices and Credit Notes, record Payments. That is custom API work. We do not have a published CoSource App Store listing or certified Xero plugin.
  • Fix a broken connector when a plugin or middleware still almost works: re-auth on OAuth 2.0, move to granular scopes, stop the double-post, and repair the invoice and contact mapping.
  • Decide not to connect when an inventory or ERP product already owns the Xero posting, when Xero is the wrong system of record for the job, or when a vendor’s own Xero link is enough and the store should stay out of the ledger.

We will not tell you Xero is a warehouse. We will not tell you every store needs a first-party Xero plugin. If you already know you want a Xero-certified app-store product and nothing custom, that marketplace may be a better fit. If you want an honest fork in the road, talk to us.

What we need for the first call

A store URL and which Xero organisation is enough to start.

  • Which store: nopCommerce, AbleCommerce, Shopify, or another CMS — and whether it is B2B or B2C
  • What should land in Xero: invoices, contacts, payments, credit notes, items
  • Whether Cin7, Unleashed, Peach, or an ERP already posts to this Xero org
  • Whether the Xero app is an old scope set or a new granular-scope app
  • Who can create a Custom Connection if this is a single AU/NZ organisation
  • What “done” looks like: a working sync, a repaired plugin, or a clear picture first

The first call is 30 minutes. You leave with a recommendation you can take to a manager, not a connector estimate pulled from thin air.

Related work

Windsor Truck Bits is a published Australian nopCommerce store on the Peach inventory API, with Peach syncing accounting to Xero. Real-time stock and pricing sat in Peach; online orders created API invoices through that path. That is Peach-mediated Xero, not a first-party nopCommerce↔Xero connector we have published, and not a reason to assume every store should go through Peach. A direct Xero connection still starts with its own assessment. We will not pretend we have shipped a named standalone Xero plugin for every platform.

CoSource is a Sydney software firm and a nopCommerce Gold Partner. Ecommerce work includes custom development and CRM & ERP integration on nopCommerce, AbleCommerce, and Shopify. That is a capability, not a Xero case study.

FAQ

Can the store push invoices into Xero?
Yes. The Accounting API exposes Invoices, Credit Notes, Contacts, Items, Payments and Purchase Orders. The design question is whether this store should create the Invoice, or whether inventory or ERP already does.
Does Xero hold live warehouse stock?
No. Treat Xero as the financials. Stock truth for a retailer usually lives in Cin7, Unleashed, or an ERP. Mapping a Xero Item is not the same as running a warehouse.
Do you have a Xero App Store connector?
Not a published CoSource listing. Work on these jobs is custom API integration against the store you already have.
Is Windsor a Xero integration case?
It is a Peach case that also reaches Xero. Peach held stock and pricing and posted invoices; Xero was the accounting hop. Do not read it as a native store↔Xero build.
We already have a plugin and it broke after an auth change.
That is common. Bring the app id, what still posts, and whether invoices are doubling. Granular scopes are now the default for new apps, with a 13 September 2027 migration date for older ones.

Talk through the Xero connection you already need

Thirty minutes. Bring a store URL and which Xero organisation. We will tell you whether to connect, fix the connector, or leave Xero posting to the system that already owns it.

Book a free 30-minute discovery call