Xero WooCommerce Integration: Setup Guide

Adam Khaled
Founder, Web25


Adam Khaled
Founder, Web25

Quick answer: A Xero WooCommerce integration sends your store’s orders, customers and payments to Xero as invoices, so nobody retypes them. You can use the WooCommerce Xero extension, an app from the Xero App Store, or custom code. The right one depends on your order volume, whether stock matters to your books, and what Xero’s limits and fees allow.
If your orders arrive in WooCommerce and your accountant works in Xero, someone is probably typing orders into Xero or exporting spreadsheets. This guide explains how a Xero WooCommerce integration works, which way to build it, and what to check before you spend money.
A Xero WooCommerce integration moves each sale from your store into your accounting, so your books match what customers bought and paid. Xero is accounting software. WooCommerce is where the order starts.
The WooCommerce Xero extension, made by Woo, is one example. Its documentation says it sends billing details, product lines, shipping, fees and order totals, and that payments are applied to the matching invoice. That list is a good guide to what a typical integration covers.
| Data | Usual direction | Why it matters |
|---|---|---|
| Orders as invoices | WooCommerce to Xero | Every sale shows up in the books without retyping |
| Customers as contacts | WooCommerce to Xero | One contact per customer for invoices and statements |
| Payments | WooCommerce to Xero | Invoices show as paid and bank reconciliation is easier |
| Tax, shipping, fees and discounts | WooCommerce to Xero | Totals match, and so does the tax you report |
| Refunds | WooCommerce to Xero | Keeps the books correct after returns |
| Stock quantities | Depends on which system owns stock | Only matters if you track inventory in Xero |
Stock needs a decision. The extension’s documentation says it can send inventory item codes so Xero reduces tracked stock when products sell, and that this is not a two-way sync. Xero’s Items endpoint returns quantity on hand for items tracked as inventory, so custom code can read it. If you keep stock in WooCommerce, tell Xero only what your accountant needs.
There are three ways to connect WooCommerce to Xero: the WooCommerce Xero extension, an app from the Xero App Store, or custom code. Start with the simplest one that covers your real workflow, and move up only when it does not.
| Method | Best for | Watch out for |
|---|---|---|
| WooCommerce Xero extension | One store sending orders, contacts and payments to one Xero organisation | Per its documentation, it uses one payment account for all payment gateways, tax rates must match, and stock is not two-way |
| App from the Xero App Store | Reconciling sales and payouts, or syncing inventory, depending on the app | The collection lists 15 apps with different jobs, so read each listing for your region and check that it supports WooCommerce |
| Custom code | Custom fields, several stores, unusual refund or tax rules, or full control over errors and logging | Build and maintenance cost, and you handle tokens, rate limits and Xero’s changes yourself |
If the extension covers your flows, use it. There is no point paying for custom development to rebuild what a ready-made plugin already does.
Custom code starts to pay off when your process does not fit the standard one. Typical triggers are several WooCommerce stores feeding one Xero organisation, invoices that need extra fields, a different payment account per gateway, or an approval step before anything reaches the books.
Xero sets rules on how often you can call it, how long a login lasts and what an app costs. They shape the build, so read them before you pick a method.
| Rule | What Xero says | What to do about it |
|---|---|---|
| Call limits | Per organisation, 60 calls per minute, 5000 per day and 5 in progress at once. Per app across all organisations, 10,000 calls per minute | Queue calls, slow down when you get HTTP 429, and wait the number of seconds in the Retry-After header |
| Access token | Xero’s Node library describes a bearer token with a 30 minute expiration | Refresh the token before it expires, and request the offline_access scope so Xero issues a refresh token |
| Refresh token | The extension’s documentation says it expires after 60 days without use | Save the newest refresh token every time you refresh, and alert someone before it lapses |
| Scopes | Granular scopes apply to apps created on or after 2 March 2026, as the extension’s documentation and Xero’s developer blog explain | Request only what you need, such as invoices and payments, instead of one broad scope |
| Uncertified apps | The extension’s documentation says an uncertified app can connect to up to 25 Xero organisations, and an organisation can connect to no more than two uncertified apps | Check how many apps your Xero organisation already uses |
Fees depend on the route. Xero’s pricing page prices apps in tiers by the number of Xero organisations they connect. They run from a Starter tier with no charge, five connections and access to a demo organisation only, to Core at 35 Australian dollars a month for 50 connections, with higher tiers above that.
For one business connecting its own Xero organisation, Xero offers Custom Connections. They use the client credentials grant for a single organisation and cost five US dollars a month. The Xero FAQ says they are available for organisations in Australia, New Zealand, the UK and the US, and Xero’s page says you can test one against the Xero demo company for free. If your Xero organisation is elsewhere, ask whoever builds the integration which route Xero requires, and check the pricing page again before you commit, because the tiers started on 2 March 2026.
To set up a Xero WooCommerce integration, decide what Xero should receive, check your Xero plan and region, create a secure connection, map your accounts and tax rates, build the invoice and payment flows, plan for refunds, respect Xero’s limits, then reconcile and test before going live. The steps below follow that order.
List the data you want in Xero: invoices, payments, contacts and maybe stock. Then pick the trigger. The WooCommerce Xero extension lets you send invoices manually, when an order is created, when it is paid or when it is completed, and recommends sending after payment. Fewer unpaid or abandoned orders then reach your books.
Find out which country your Xero organisation is in, because that decides whether Custom Connections are available. If you sell in several currencies, the extension’s documentation says your Xero plan must include multi-currency accounting and each currency must be enabled in Xero. Ask your accountant which sales account, shipping account and bank account each flow should use.
Xero uses OAuth 2.0. You create an app in Xero’s developer portal, enter a redirect address, and authorise it for your organisation. With the WooCommerce extension, you copy the redirect URI from its settings screen into the Xero app. With a Custom Connection, you use a client ID and secret and your client authorises the connection by email.
Request only the scopes you need, including offline_access. For your own code, keep the client secret outside the website files and rotate it if anyone who had it leaves.
List how a WooCommerce record becomes a Xero record. The extension’s documentation says tax rates must match between the two systems or errors occur, so compare every tax rate in both before you test. Map shipping, fees and discounts to Xero accounts, and map each payment gateway to the right bank or clearing account. Our payment gateway API integration guide shows how payouts bundle charges, refunds and fees. If you send product codes, make every SKU unique and match it to a Xero item code.
Decide how customers match too. The extension looks for an existing Xero contact with the order’s billing email and creates one if it finds none. Your own code needs the same rule, written down.
Use a WooCommerce webhook, a message the store sends to another system when something happens, to start the flow when an order is paid. Each order should find or create the contact and create an invoice. Xero invoice numbers must be unique, and invoices have a Reference field, so store the WooCommerce order number in one of them.
Send an Idempotency-Key header with every write, because the Xero API definition describes it as a way to retry requests without the risk of duplicate processing. If a call fails halfway, a retry then cannot create the same invoice twice. Read the store through the WooCommerce REST API rather than the database.
Apply each payment to its invoice so Xero shows it as paid. Then plan refunds. The extension’s documentation says that when an order is fully refunded it tries to void the Xero invoice, and that a paid invoice cannot be voided through the API and has to be adjusted manually. For paid orders, decide with your accountant whether a refund should create a credit note instead.
Put calls in a queue that stays under 60 per minute for each organisation, with no more than 5 at a time. When Xero answers HTTP 429, wait the number of seconds in the Retry-After header. When you read data back, ask for pages of up to 100 invoices and use the If-Modified-Since header, so you fetch only what changed.
Store the newest refresh token after every refresh, and put an alert on any failed refresh. A sale spike, such as a promotion, is the moment these limits show up.
Add a scheduled job that compares recent WooCommerce orders with Xero invoices and reports any difference in count or total. Then test on the Xero demo company first, with real order shapes: a refund, a discount, a foreign currency order and a failed payment. Run the first live week with alerts on, and check the first invoices with your accountant.
Web25 has not published a Xero project yet. We did build a custom WooCommerce and POHODA integration for Mirael3D, a store selling 3D-printing filament. POHODA is accounting software popular in Slovakia and Czechia, so the job is close to this one. Web orders had to reach the accounting system without anyone entering them again.
The Mirael3D POHODA case study shows what mattered in practice:
This is one project on one pair of systems, so treat it as an example of method. Xero has its own limits and quirks, which is why steps 6 and 7 come before launch.
There is no honest single price, because the cost depends on a handful of factors you can list before you ask for a quote. A standard extension setup is a small job, and a custom sync with unusual rules is a larger one.
| Factor | Pushes the cost up when |
|---|---|
| Method | The extension, billed per plan, does not cover your flows, so custom code is needed |
| Xero route | Your Xero region rules out Custom Connections, so you fall under Xero’s app tiers |
| Number of flows | You sync contacts, invoices, payments, refunds and stock, not just invoices |
| Refund and tax rules | You have credit notes, mixed tax rates or several currencies |
| Stores and organisations | Several stores feed one Xero organisation, or one store feeds several |
| Order volume | Peak days push you close to Xero’s call limits |
| Monitoring | You want alerts, token care and someone to fix issues after launch |
The extension was listed at 98 euros for a one-year plan when we checked in October 2026. Budget for the time after launch as well. An integration touches your books, so it needs monitoring, and our guide to website maintenance packages covers how ongoing care is usually priced.
Most failures trace back to a check nobody made before launch.
If the WooCommerce Xero extension covers your flows, you may not need anyone to build anything, and we will say so. It is a ready tool made by Woo, and a developer only has to install and test it.
Web25 is our agency, and we build custom integrations between WooCommerce stores and accounting software, including Xero, then keep them monitored afterward. That fits when your process is unusual, when several stores feed one organisation, or when you want refunds, tax and errors handled your way. Our backend and API service page explains how we work, and you can tell us about your setup to see whether a plugin is enough.
The general method is in our guide to custom API integration services. The Shopify NetSuite integration guide and the Odoo WooCommerce integration guide walk through two other pairings. For a NetSuite ERP, see the NetSuite WooCommerce integration guide.
Not always. The WooCommerce Xero extension can create invoices, contacts and payments from your orders through setup screens, although someone still has to create the Xero app, map the accounts and test it. You need a developer when you have custom fields, several stores feeding one Xero organisation, special refund rules, or you want your own logging and error handling.
Only in a limited way. The WooCommerce Xero extension can send item codes so Xero reduces tracked stock when a product sells, but its documentation says this is not a two-way sync. Xero's Items endpoint does return the quantity on hand for tracked items, so custom code can read it. Decide which system owns stock before you build anything.
Not necessarily. The WooCommerce Xero extension creates an invoice for each order. Some apps in Xero's WooCommerce collection instead focus on reconciling sales and payouts. Which suits you depends on your volume, how you sell, and how your accountant likes to see the books, so ask your accountant before you choose.
Xero's documentation lists 60 calls per minute, 5000 per day and 5 in progress at once for each connected organisation. Across all organisations, an app has a limit of 10,000 calls per minute. If each order needs three calls, for example a contact, an invoice and a payment, the daily limit covers roughly 1,600 orders. Go over a limit and Xero answers with HTTP 429 and a Retry-After header.
The WooCommerce Xero extension was listed at 98 euros for a one-year plan when we checked in October 2026. Xero also prices apps by how many organisations they connect. Its pricing page lists a Core tier at 35 Australian dollars a month, and Custom Connections for a single organisation cost five US dollars a month in Australia, New Zealand, the UK and the US. Custom work adds build and maintenance time on top.
Xero refresh tokens expire when they are not used for 60 days, and the WooCommerce Xero extension's documentation says a store that has not talked to Xero for that long has to be authorised again. A scheduled job that touches the connection and an alert on failures prevent a silent break.
Find out which country your Xero organisation is in and whether your plan covers your currencies, then list the flows you need: invoices, payments, refunds and stock. Those answers tell you whether the extension is enough. Take them to your accountant or developer, together with the questions in the FAQ above.
Written by Adam Khaled, Founder, Web25. Last updated October 2026.

Agentic SEO means AI agents doing SEO work, not just suggesting it. What it is, what Google allows, the real risks, and when a small site should skip it.

Optimize WordPress for AI search in 8 checks: the Reading setting, robots.txt, bot-blocking hosts, one schema plugin, page builders, sitemaps and llms.txt.

Dynamics 365 ecommerce integration, step by step: find out which Dynamics 365 you run, pick a connector or custom API, plan for API limits and test first.