Xero for WooCommerce allows you to create invoices in Xero for all sales on your WooCommerce site, and also tracks and sends data on items, shipping, discounts and tax to your records to keep everything in balance.
Requirements ↑ Back to top
cURL and curlSSL need to be installed on your server. Ask your host if they have these modules installed.
Installation ↑ Back to top
- Download the .zip file from your WooCommerce account.
- Go to: WordPress Admin > Plugins > Add New, click Upload Plugin, select the file you downloaded and click Choose File.
- Install Now and Activate the extension.
More information at: Install and Activate Plugins/Extensions.
Setup and Configuration ↑ Back to top
Xero’s API uses OAuth 2.0 to validate all connections. This is a new authentication method required since February 2020. The previously authenticated integrations ( OAuth 1.0a ) will continue to work until November 2020. Everyone using Xero plugin will have to switch to OAuth 2.0 before that date. If you have the old OAuth Xero setup and would like to migrate to the new OAuth 2.0 just follow the instructions below and the migration will happen automatically. No extra steps required.
To set up the connection between your WooCommerce shopping cart and Xero account, there are two steps:
- You will need to create a private Xero application in your Xero portal
- Then you will need to connect your Xero application to WooCommerce
Note: Per limits set by Xero, a single Xero app will only support a maximum of 25 OAuth connections and a connection to two(2) organizations.
Step 1: Create a new application in Xero Developer portal ↑ Back to top
Go to the Xero Developer portal My Apps ( you may need to log in using your xero.com credentials ) section and click on the “New app” button:
Upon logging and clicking the “New app” button you will be presented with the following screen:
Fill in the form:
- App name – this is the name of your application, choose an easy to remember name.
Note: Do not include a symbol in the app name or connection may fail.
- OAuth 2.0 grant type – this should be set to Web app
- Company or application URL – URL to your shop or main page.
- OAuth 2.0 redirect URI – you can find this URI inside your WooCommerce Xero Settings inside the wp-admin panel. See below.
Note: if you are doing a fresh install your settings will look as on the next screenshot. If you previously had a WooCommerce Xero integration set up you should still see the old settings fields – they will be removed once you will finish this setup guide.
When everything is ready create your app ( Create App button ). You will be taken to the next screen:
Your Xero application is now created. Don’t close this page yet you will need it for the next step.
Step 2: Connect your Xero application to WooCommerce
- Copy the Client id, go back to your WooCommerce Xero admin settings page and paste it into the Client id field
- Next, go back to your Xero application and click Generate a secret. Copy the secret and paste it in the Client Secret field. The client secret key is visible only once so if you lose it you will need to generate it once again.
- Go back to your Xero Application and click Save ( your secret is no longer visible in Xero application ). Go to your WooCommerce Xero admin panel and also click Save.
You should now see that the “Sign in with Xero” button is now Active:
Once you click the button you will be taken to the login.xero.com site where you will be asked to grant access for your application:
On the next screen, you will be informed about the scope of required permissions and asked to accept. If you have more than one organization defined in Xero portal you will be able to choose which one you want to connect:
After clicking connect you will be taken back to the WooCommerce Xero page that will confirm the status of the connection.
You are now connected and may continue with the rest of the setup.
Set Up Default Account Codes ↑ Back to top
Invoices and payments sent to Xero need to be associated with account codes in your company’s Chart of Accounts. This is a required part of setup. Find the Chart of Accounts via Accounting > Chart of Accounts or Accounting > Advanced in your Xero dashboard:
Xero provides a standard set of account codes that you can modify as necessary (default codes will vary by country):
Note: The Tax Rate associated with the Xero account needs to match the tax rate setup in WooCommerce.
- Sales Account – This account collects all sales of items in your store.
- Shipping Account – This account collects all shipping charges.
- Fees Account – This account represents the fees created by the WooCommerce Fees API.
- Payment Account – This account collects all payments made. This account either needs to be Account Type “Bank” or have “Enable Payments to this account” checked in the Edit Account Details popup.
- Rounding Account – This account collects all the rounding corrections.
Account codes must be entered at WooCommerce > Xero within your site:
Important: All Account Code fields must be entered in order to send invoices to Xero. Read more about setting up account codes at: Settings: Chart of Accounts.
Miscellaneous Settings ↑ Back to top
This controls when the invoice is created or updated in Xero.
- Manual: merchant will send the invoice manually using the Order Actions menu
- On creation: as soon as order is created, invoice is created in Xero
- Payment completion: once the payment clears, the invoice will be created in Xero
- On order completion: once order is set to status of ‘Completed’, the invoice will be created/updated
Recommended: Payment Completion.
Xero will mark the associated invoice as PAID based on this setting.
- Manual: merchant will update the invoice
- Payment completion: invoice updated with payment once payment is received in WooCommerce
- Order completion: invoice updated with payment information once order status is changed to ‘Completed’
You may need to send payments manually if you synchronize payments in another way, such as the PayPal to Xero integration.
Important: once a payment is sent for an invoice and the invoice is marked PAID in Xero, it can no longer be modified via the API. This means that WooCommerce cannot make any changes to the invoice. Once the invoice is marked PAID in Xero, all changes must be made manually in Xero.
Match Zero Value Tax Rates
This allows you to explicitly match up a WooCommerce tax-exempt (0%) tax rate with a Xero tax-exempt (0%) tax rate. This helps avoid issues like tax-exempt line items showing up as Zero Rated EC Services.
Treat Shipping As
The costs associated with shipping line items in your WooCommerce orders can be treated either as Revenue or Expenses. You may need to toggle this setting based on your Xero Chart of Accounts settings to avoid errors.
Send Inventory Items
- Tick the box to send the WooCommerce product SKU to Xero as an Item Code field. This allows you to reduce inventory numbers defined in Xero when each item is sold.
- You must have a corresponding Inventory Item Setup in Xero for this to work properly.
- Note that this is not an “Inventory Sync” as this will only reduce the existing quantity of inventory items in Xero when a corresponding item is sold. It will not synchronize your Xero and WooCommerce inventories if the inventory quantity is adjusted in either system.
Orders with zero total
Tick the box for Orders with zero total to enable the export of invoices for orders that have a grand total of zero.
- Tick the box for the Debug option to enable logging for this extension.
- Log file is located at:
Usage ↑ Back to top
Orders placed in your WooCommerce store are copied to your Xero account as an approved invoice. When payment is completed (normally immediately), then a payment is added to the invoice making the invoice paid in full. A note is added to each order in WooCommerce for the invoice including the Xero invoice reference number (Invoice ID). Here is a sample Xero invoice with payment.
WooCommerce Order Fields Sent to Xero ↑ Back to top
These are the WooCommerce Order fields that are sent to the Xero invoice. Note: If the Billing Company field is used, it will be the main name on the invoice. Otherwise, Billing First Name and Billing Last Name are used.
- Billing First Name
- Billing Last Name
- Billing Email
- Billing Company
- Billing Address 1
- Billing Address 2
- Billing City
- Billing State
- Billing Postal Code
- Billing Country
- Billing Phone
- Order Date
- Order Number
- Order Item Data: Product name
- Order Item Data: Quantity purchased
- Order Item Data: SKU (if Send Inventory is enabled)
- Order Item Data: Product price
- Order Shipping Charge (Optional)
- Order Discount (Optional)
- Order Tax Total
- Order Total
Invoice Status is always AUTHORIZED. Tax Type depends on the WooCommerce setting.
Frequently asked questions ↑ Back to top
When are orders sent to Xero? ↑ Back to top
Invoices are created within Xero based on the Send Invoices setting found at WooCommerce >Xero.
When are payments sent to Xero? ↑ Back to top
Payments are sent to Xero based on the Send Payments setting found at WooCommerce >Xero. Note: when a payment is applied to a Xero invoice the order is marked PAID in Xero and cannot be modified any longer through the API.
Can I synchronize existing orders? ↑ Back to top
Yes, you can, but it’s a manual process. To achieve this, go to WooCommerce > Orders and select the order you want to sync. Select Actions and choose Send Invoice to Xero. Then select the “>” button on the right.
How do I know if an invoice has been sent to Xero? ↑ Back to top
Entries are added to the Order Notes area of the order page. There is one message for the invoice and one for payment.
What happens if the tax rate is not set up correctly? ↑ Back to top
In order for your tax rates in your Xero invoices to be as accurate as possible, it is essential that your tax rates and names in WooCommerce match the tax rates and labels in Xero. If these two tax rates differ you may receive errors when trying to generate invoices/payments.
Xero simply omits the tax rate in my invoices if items are tax exempt. ↑ Back to top
The default behavior of WooCommerce is to completely omit taxes from sending per line-item if the tax is either 0% or the item is not taxable. If you want the Xero line items to show a zero tax rate(0.000%) you can do the following:
- Make sure the Xero plugin is updated to at least version 1.7.17.
- Create a new WooCommerce 0% tax rate with a name that exactly matches your 0% rate in Xero. Xero creates a 0% tax rate upon account setup named Tax Exempt so it’s recommended to copy the name exactly.
- Enable the Match zero value tax rates setting on the WooCommerce > Xero settings page.
- Edit your tax-exempt products and make sure they’re set to Taxable as well as linked to the zero-rated tax class (or wherever you have the 0% tax rate setup).
- Go to WooCommerce > Settings > Tax and for the option Calculate Tax Based On, choose Customer Billing Address.
What happens if an invoice fails? ↑ Back to top
If creating the Xero invoice fails for any reason there will be a note added to the Order Notes section with the error message. Typical causes of failure:
- Missing account codes on WooCommerce > Xero settings page. Every account code field needs to be filled out there and matched up with an account from your Xero Chart of Accounts.
- The Xero keys set on the WooCommerce > Xero settings page do not match the ones corresponding to your app.
Can I use Xero with my multi-currency store? ↑ Back to top
Yes, if you have a Xero account with multi-currency capability(this usually requires an upgrade). If you receive an error in the Order Notes related to the currency not being supported, add additional currencies in Xero by going to Organization Settings, click on Currencies and add the currencies available in the store.
Can Stripe fees be synced to Xero? ↑ Back to top
Stripe fees do not sync to Xero with this extension at this time. However, it’s possible to sync Stripe fees with the Stripe + Xero integration provided by Xero.
Code Snippets ↑ Back to top
Note: This is a Developer level doc. If you are unfamiliar with code/templates and resolving potential conflicts, select a WooExpert or Developer for assistance. We are unable to provide support for customizations under our Support Policy.
What happens to the invoice when the associated order is refunded? ↑ Back to top
By default, the Xero integration will attempt to void the invoice once the order is totally refunded(when the order status changes to Refunded). Invoices which are marked PAID cannot be modified via the API and thus would have to be voided/modified manually at Xero.com.
If you wish to disable the automatic voiding of invoices when the associated WooCommerce order is refunded, add the following one-line code snippet to your child theme’s functions.php file or using a code snippets plugin:
add_filter( 'woocommerce_xero_disable_auto_void_invoices', '__return_true' );
How do I match the tax rate label to what is on Xero? ↑ Back to top
By default, a new tax rate label will be created on Xero during invoice creation. However, in some countries, this may or may not be the desired outcome. If you need to match the tax rate label from what you have entered in WooCommerce to what Xero already has in the system, you can use the following filter. Add the filter to your child theme’s functions.php file or using a code snippets plugin:
add_filter( 'woocommerce_xero_create_unique_tax_label', '__return_false' );
Once you have done this, whatever you have set in as your tax rate label in WooCommerce will match what is already existing in your Xero account.
Can I map products or product categories to different Xero account codes? ↑ Back to top
This is not yet an option in the Xero plugin, however, it is theoretically possible by creating a custom function that hooks into the
woocommerce_xero_line_item_account_code filter. Your custom function would need to check the category ID or product ID and return an integer representing the Xero sales account code(must be a Revenue/Sales account type). See the WooCommerce hooks documentation for help with utilizing WooCommerce hooks.
Troubleshooting ↑ Back to top
How do I see debug information? ↑ Back to top
To view debug information make sure the Debug checkbox option is checked in the Xero settings page. You can find Xero logs at WooCommerce > Status > Logs.
Why aren’t payments being exported? ↑ Back to top
If invoices are being created, but payments are not being created, make sure that the Xero account that is used for “Payment Account” has “Enable payments to this account” checked in the Edit Account Details popup.
I am getting an error sending invoices: “Item code ‘xxx’ is not valid” ↑ Back to top
If you get the following error in the order notes related to “Item Code”:
ERROR creating Xero invoice: ErrorNumber: 10 ErrorType: ValidationException Message: A validation exception occurred Detail: Item code ‘XXXX′ is not valid
Please check your Xero configuration and make sure the inventory item is setup correctly. Here’s a doc on how to set up inventory items in Xero.
I am getting an error sending invoices: “TaxType code ‘xxx’ cannot be used with account code ‘yyy’ ↑ Back to top
You may see the following error in the order notes:
ERROR creating Xero invoice: ErrorNumber: 10 ErrorType: ValidationException Message: A validation exception occurred Detail: The TaxType code ‘xxx’ cannot be used with account code ‘yyy’.
If so, this is related to the shipping account being set to the wrong type in the WooCommerce Xero settings: it must match the account setting in Xero. You can set it in the WooCommerce > Xero settings option Treat Shipping As: You must also be using at least version 1.7.7 of the plugin.
Line items without VAT applied appear as Zero Rated EC Services in Xero invoices ↑ Back to top
See the section named Xero simply omits the tax rate in my invoices if items are tax-exempt for information on how you can force the Xero integration to match up with a specific tax rate for zero-rated line items.
I am getting an error for payments ↑ Back to top
ERROR creating Xero payment. ErrorNumber:10| Error Message:Account type is invalid for making a payment to/from
Make sure that the account you specified for “Payment Account” in the Xero settings has “Enable Payments To This Account” checked in Xero. This will need to be either a Bank account type or a Revenue/Sales account type.
Error: XERO: Invoice not created. OAuth Error: token_rejected | The organization for this access token is not active
This error happens when the API application was created with the wrong organization. Go to https://developer.xero.com/myapps?privateAppCreation=true and click on the application you created to connect to your WooCommerce site. If the Selected Organization is “Demo Company” you’ll need to delete this application and recreate another one.
When you recreate the application, on the option “Please select which organization your application can access:” be sure to select the correct organization.
Error: ERROR creating Xero invoice: ErrorNumber: 10 ErrorType: ValidationException Message: A validation exception occurred Detail: Invoice not of valid status for modification ↑ Back to top
This is typically because there is already an invoice on Xero end which is marked as Paid (might be due to test orders sent from your staging environment to Xero during site development, or invoices created within Xero itself). You can add invoice prefix to Xero settings and test again to confirm that.
Questions and Support
Something missing from this documentation? Do you still have questions and need assistance?
- Have a question before you buy this extension? Please fill out this pre-sales form – please include the name of this extension in your query.
- Already purchased and need some assistance? Get in touch with a Happiness Engineer via the WooCommerce.com Support page and choose this extension name from the “I need help with” dropdown