Running WooCommerce without accounting integration means your finance team is manually re-entering every order, refund, and payment into Xero. At low volume, this is tedious. At scale, it is a source of errors, delayed reporting, and reconciliation nightmares at tax time. Connecting WooCommerce to Xero eliminates this manual layer entirely.
This guide covers the full integration: choosing the right connector, setting up the connection, configuring invoice and payment sync, handling multi-currency, mapping products to Xero accounts, and getting real-time P&L data without waiting for your accountant to run end-of-month reports.
WooCommerce-Xero Connector Options: What Works in Practice
Several plugins connect WooCommerce to Xero. They differ in sync frequency, field mapping depth, and support quality. Here is an honest comparison.
| Plugin | Sync Frequency | Key Strengths | Price |
|---|---|---|---|
| Xero for WooCommerce (WooNinja) | Real-time on order events | Deep field mapping, multi-currency, manual sync option | ~$79-$149/year |
| WooCommerce Xero Integration (Codisto) | Real-time | Simple setup, good for standard stores | ~$49/month (bundled) |
| MyWorks Sync | Real-time + scheduled | Bidirectional sync, product/inventory mapping | ~$99/year |
| Zapier / Make | Polling (5-15 min delay) | No-code, flexible | Varies by plan |
For most WooCommerce stores, the WooNinja Xero plugin or MyWorks Sync are the recommended choices. Zapier works for low-volume stores but the polling delay means your Xero data is always slightly behind. For stores doing significant daily order volume, real-time sync matters.
Setting Up the Xero API Connection
Before installing any plugin, you need to create a Xero app to get OAuth credentials. This takes about 10 minutes.
Step 1: Create a Xero App
- Go to developer.xero.com and sign in with your Xero account
- Navigate to My Apps and click New App
- Name the app (e.g., “WooCommerce Integration”) and select Web App as the integration type
- Set the redirect URI to your WordPress site (most plugins provide this exact URL in their settings)
- Save and note your Client ID and Client Secret
Step 2: Connect the Plugin to Xero
- Install and activate your chosen Xero plugin in WordPress
- Navigate to the plugin settings and enter your Client ID and Client Secret
- Click Connect to Xero – you will be redirected to Xero’s OAuth consent screen
- Select the Xero organization you want to sync with and grant access
- You are redirected back to WordPress with a success message
The OAuth token is stored in your WordPress database and automatically refreshes. You should not need to reconnect unless you revoke access from the Xero developer portal.
Order and Invoice Sync Configuration
Getting the invoice sync right is the most important part of the integration. Misconfigured sync creates accounting errors that are painful to fix retroactively.
When to Create Invoices in Xero
You have two main options: create invoices on order placement or on order completion (shipped/fulfilled). The right choice depends on your revenue recognition policy:
- Create on order placement: Better if you recognize revenue when payment is received. Invoices appear in Xero as soon as customers pay.
- Create on fulfillment: Better if your accountant wants revenue recognized only after goods are delivered. More accurate for businesses with long fulfillment lead times.
For most ecommerce businesses, create on order placement (paid) is the right setting. It gives you real-time payment tracking without creating pending invoice clutter in Xero.
Invoice Status Mapping
| WooCommerce Order Status | Xero Invoice Status | Notes |
|---|---|---|
| Processing (paid) | AUTHORISED + Payment applied | Marks invoice as paid in Xero |
| On Hold | DRAFT or skip | Depends on your workflow |
| Completed | No change (already paid) | No action needed if created on processing |
| Refunded | Credit Note | Must be configured explicitly |
| Cancelled (after payment) | VOIDED + Refund | Requires refund handling setup |
Configure your status mapping before processing any live orders. Changing it after the fact means historical orders do not match your Xero configuration, and reconciliation becomes difficult.
Product Account Mapping
Every line item in a WooCommerce order needs to map to a Xero account code. Without proper mapping, all revenue lands in a default account, which makes category-level financial reporting impossible.
Account Mapping Options
- Global default: All products map to one revenue account (e.g., 200 – Sales). Simple but no category breakdown.
- Category-level mapping: Each WooCommerce product category maps to a different Xero account. Allows revenue reporting by product type.
- Product-level mapping: Individual products each have their own Xero account. Maximum granularity, significant maintenance overhead.
For most stores, category-level mapping is the right balance. Set up separate Xero accounts for your main product categories and map WooCommerce categories to them. This gives you P&L breakdowns by product type without the overhead of product-level configuration.
Shipping and Fee Mapping
Configure these Xero accounts separately:
- Shipping revenue: Map to your freight/shipping income account (or a sub-account of sales)
- Discounts and coupons: Map to a discount account so you can see the revenue impact of promotions
- Transaction fees: Map to bank charges or payment processing fees account
- Tax collected: Map to your tax liability account (not a revenue account)
Tax Configuration and Compliance
Tax handling is where WooCommerce-Xero integrations most often go wrong. WooCommerce calculates tax rates based on customer location and product tax class. Xero has its own tax rate configuration. You need to make sure these align.
Xero Tax Rate Mapping
Most plugins allow you to map WooCommerce tax classes to Xero tax rates. Common setup for UK/AU/NZ stores:
- WooCommerce standard rate (20% VAT / 10% GST / 15% GST) → Xero Tax Rate: “20% (VAT on Income)” or regional equivalent
- WooCommerce reduced rate → Xero reduced rate (if applicable)
- WooCommerce zero rate → Xero “Zero Rated Income”
- WooCommerce tax exempt → Xero “Tax Exempt”
For US stores selling across multiple states, proper tax handling requires a tax compliance tool like TaxJar or Avalara sitting between WooCommerce and Xero. The tax amounts calculated by WooCommerce need to match what is reported to Xero – and for multi-state US sales, this is complex enough to warrant dedicated tooling rather than manual mapping.
Multi-Currency Configuration
If you sell in multiple currencies, your Xero integration needs additional configuration. Xero supports multi-currency natively (on most plans), but your plugin needs to pass the correct currency codes and exchange rates.
How Multi-Currency Sync Works
- WooCommerce processes the order in the customer’s currency (e.g., EUR, GBP, USD)
- The plugin creates the Xero invoice in the same currency as the WooCommerce order
- Xero applies its own exchange rate (either live rate or manual override) to convert to your base currency for reporting
- Your P&L shows all transactions in your base currency, regardless of which currency the customer paid in
The main configuration decision: use Xero’s automatic exchange rate (updated daily) or lock in exchange rates manually. For most stores, the automatic rate is fine. For businesses where currency risk matters (large orders, long payment terms), manual rate locking gives you more control.
Currency Mismatch Issues
A common problem: WooCommerce sends an order in EUR but Xero is not configured for EUR. The invoice sync fails with a currency error. Fix by enabling each required currency in Xero under Settings > Currencies before processing orders in that currency.
Payment Reconciliation and Bank Feed Matching
The goal of reconciliation is matching payments in your bank statement to invoices in Xero. A properly configured WooCommerce-Xero integration makes this largely automatic.
Payment Account Setup
Each payment method in WooCommerce should map to a different Xero account:
- Stripe / credit cards: Map to a Stripe clearing account (not your main bank). Stripe payouts then reconcile from clearing to bank.
- PayPal: Map to a PayPal account in Xero (Xero treats it like a bank account)
- Bank transfer / BACS: Map directly to your operating bank account
- Buy Now Pay Later (Klarna, Afterpay): Map to a BNPL clearing account to handle the delay between customer payment and merchant payout
Mapping Stripe payments directly to your bank account (instead of a clearing account) creates reconciliation problems because Stripe batches and nets payouts. The bank statement shows one Stripe payout covering multiple orders. Setting up a Stripe clearing account in Xero lets you match individual invoices as they are paid, then reconcile the Stripe payout to the clearing account as a batch.
Bank Feed Matching Rules
Once your bank feed is connected in Xero, create matching rules to automate reconciliation:
- Rule: transactions from Stripe reference STRIPE PAYOUT → create transaction on Stripe Clearing account
- Rule: transactions from PayPal reference PAYPAL TRANSFER → reconcile to PayPal account
- Rule: transactions matching customer name or order reference → match to Xero invoice
With these rules active, most daily transactions auto-reconcile without manual intervention. Your bookkeeper handles exceptions rather than routine matching.
Refund Handling
Refunds are the most error-prone part of ecommerce accounting integrations. When a WooCommerce order is refunded, the integration needs to create a corresponding credit note in Xero and reverse the payment application.
How Refund Sync Should Work
- Refund is issued in WooCommerce (partial or full)
- Plugin creates a Xero credit note for the refunded amount, referencing the original invoice
- If the refund was processed to the original payment method, the credit note is applied against the invoice, reducing the amount received
- The refund to the customer’s card appears in your bank feed and is reconciled against the credit note
If your plugin does not handle refund sync automatically, you need to create credit notes manually in Xero every time a WooCommerce order is refunded. Audit your integration’s refund behavior before going live – test with a small refund and confirm the credit note appears correctly in Xero.
Real-Time P&L and Financial Reporting
Once the integration is running correctly, you stop waiting for month-end reports and start seeing financial performance in real time. Xero’s reporting gives you:
- Profit and Loss: Revenue by product category, gross margin, operating expenses – updated as each order syncs
- Cash Flow Statement: Actual cash position based on when payments are received, not when invoices are raised
- Balance Sheet: Always current, no manual entry required
- GST/VAT Reports: Tax collected and owed, auto-populated from synced invoices
The practical benefit: you can check your P&L on any day during the month and get an accurate picture of performance. You are not waiting two weeks for your bookkeeper to manually enter last month’s orders before you can see whether you are profitable.
Custom Tracking Categories for Deeper Reporting
Xero’s tracking categories let you add a second dimension to financial reporting beyond account codes. Useful applications for WooCommerce stores:
- Track revenue by sales channel (website, marketplace, wholesale)
- Track revenue by geographic region or country
- Track profitability by product line or brand
Some WooCommerce-Xero plugins support passing custom tracking categories from WooCommerce order meta. If this reporting level matters to your business, check plugin support before committing to a specific connector.
Pre-Launch Reconciliation Checklist
Before enabling live sync, run through this checklist using test orders:
- Place a test order and confirm the invoice appears in Xero with correct line items, amounts, and tax
- Verify the invoice is in the correct currency if you are selling internationally
- Check that the invoice maps to the correct revenue account for the product category
- Issue a partial refund and confirm a credit note appears in Xero
- Issue a full refund and confirm the invoice is voided or fully credited
- Verify shipping charges appear as a separate line item on the invoice
- Confirm that discount/coupon amounts reduce the invoice total and are recorded in the discount account
- Check that tax is recorded in the liability account, not a revenue account
- Verify payment is applied to the correct payment account (Stripe clearing, PayPal, etc.)
Fix any discrepancies before going live. Correcting accounting errors after thousands of orders have synced is significantly more painful than testing carefully upfront.
Common Integration Problems and Fixes
Invoices Not Syncing
First check: is the Xero OAuth token still valid? Go to plugin settings and re-authenticate if the connection shows expired. Second check: look at the plugin’s sync log (most plugins have one) for specific error messages. Common causes include currency not enabled in Xero, account code not found, or tax rate mismatch.
Duplicate Invoices in Xero
This happens when the plugin triggers on multiple order status changes that are both configured to create invoices. Check your status mapping configuration – only one WooCommerce status should trigger invoice creation per order. Also check whether you have multiple sync plugins installed (a previous developer may have left one active).
Exchange Rate Discrepancies
If your Xero P&L shows different totals than WooCommerce reports, exchange rate timing is the likely cause. WooCommerce reports in the order currency at time of order; Xero converts using the rate at time of sync (which may be different). This is not an error – it is normal currency accounting. Your accountant will recognize this as a foreign exchange gain or loss.
Tax Appearing in the Wrong Account
Tax on the invoice is hitting your revenue account instead of your tax liability account. This is a tax rate mapping issue in the plugin settings. Check that your WooCommerce tax classes are mapped to the correct Xero tax rates (not “No Tax” or a rate that codes to the wrong account). Re-map and manually correct the affected invoices in Xero.
Maintaining the Integration Over Time
A WooCommerce-Xero integration needs periodic maintenance. Things that break it:
- WooCommerce major version updates (sometimes change order data structure)
- Xero API changes (rare, but they update their OAuth implementation periodically)
- New payment methods added to your store (need new account mapping)
- New product categories added (need Xero account mapping)
- Currency expansions (need to enable new currencies in Xero)
Set a monthly reminder to spot-check your sync: pick three recent orders in WooCommerce and find their corresponding invoices in Xero. Verify amounts, tax, and account codes match. Catching drift early prevents month-end reconciliation headaches. If you want a custom WooCommerce integration that handles your specific accounting setup – including syncing with QuickBooks or other accounting platforms – a tailored solution often handles edge cases better than off-the-shelf plugins.
Is a Custom Xero Integration Worth It?
Off-the-shelf plugins handle the standard case well. A custom integration makes sense when:
- Your WooCommerce order data has non-standard fields that need to map to Xero custom fields
- You have complex multi-entity accounting (multiple Xero organizations receiving data from one WooCommerce store)
- You need inventory sync alongside financial sync
- Your fulfillment workflow involves external systems (3PL, ERP) that also need to write to Xero
For stores with standard setups – single currency or straightforward multi-currency, standard product catalog, single Xero organization – a well-configured off-the-shelf plugin is sufficient and significantly cheaper than custom development. For stores with complex financial structures or unusual data requirements, custom development pays for itself in accountant time saved and error reduction. If you are in that territory, our team handles custom WooCommerce integrations including financial system connections.
Need Help With Your WooCommerce-Xero Integration?
If your current setup is producing reconciliation errors, missing edge cases, or you need a custom accounting integration that fits your specific workflow, we can help. We have built WooCommerce accounting integrations for stores from startup to enterprise scale.

