In Brief: The HubSpot-built Xero integration syncs four objects: Contacts, Products, Invoices, and Payments, and every one of them can be configured one-way in either direction or bi-directionally. Quotes are not supported at all. HubSpot explicitly recommends enabling Contact sync before Invoice sync, since invoices depend on matching contact records to sync correctly. Most of the friction we see comes from skipping that order, editing a HubSpot-created invoice inside Xero, or not checking the sync dashboard's Failing and Excluded counts once the initial setup is done.
Sales closes the deal in HubSpot. Accounting raises the invoice in Xero. On paper, that hand-off should be instant. In practice, it is one of the most common points of friction we see in B2B companies running both platforms, and most of the friction traces back to how the sync was configured on day one, not to anything wrong with either platform.
The HubSpot Xero integration is built on HubSpot's Data Sync framework, the same underlying system that powers most of HubSpot's app-to-app connections. It is not a single on/off switch. Each object gets its own setup: a sync direction, a rule for who wins when both sides disagree, and a field mapping table you control line by line. Getting that configuration right, and in the right order, is most of the work.
What This Xero-HubSpot Integration Actually Syncs
Four object types are available, and each is configured as its own sync with its own direction, chosen independently:
Quotes are explicitly excluded. HubSpot's own documentation for the integration states plainly that quotes will not sync, and points teams that need that capability toward a separate integration built directly by Xero. Order matters for the four objects that do sync: Xero requires the contact and the product on an invoice to already exist in Xero before that invoice can sync, so HubSpot's own setup guidance recommends configuring Contact and Product sync before Invoice sync. Skip that order and invoices can fail to sync or arrive with missing associations from day one.
How Each Sync Gets Configured
Every object sync includes a sync direction, a data conflict resolution rule, and a field mapping table, all configured separately per object. Contact sync adds a fourth setting on top of those: record matching. Payments is the exception, its sync configuration uses fixed defaults that can't be viewed or edited at all.
Sync direction is genuinely a three-way choice for Contacts, Products, and Invoices: data can sync bi-directionally, only into HubSpot, or only into Xero. For this client we set all three to bi-directional, since both sales and finance needed to create and edit records on either side.
Record matching, available on Contact sync, decides how HubSpot links an existing HubSpot contact to its Xero counterpart before syncing begins. The default is to match on email address; a "do no matching" option is also available, which treats every record as new rather than trying to link it to anything already in the other system, a much higher-risk setting for anyone bringing in an existing customer list. Get this wrong and the symptoms look a lot like what we've seen cause duplicate contacts in HubSpot more generally.
Data conflict resolution decides which system wins when a record has been edited on both sides since the last sync. This is a genuine choice for every configurable object, "Use HubSpot data" or "Use Xero data". We set HubSpot as the winner for Contacts, since sales owns that data day to day, and Xero as the winner for Invoices, since finance is the source of truth once billing starts.
Field mappings come extensively pre-built. Contact sync alone ships with mappings for name, company, email, phone, mobile, fax, website, and a full postal address, each individually editable or removable. Invoice sync maps invoice number, due date, invoice date, payment date, fees, taxes, discounts, status, currency, amounts, line items, and the associated contact, all by default. Custom mappings beyond the defaults require at least Data Hub Starter. PO Number is a common example: it isn't a default field on Xero invoices, so it has to be added as a custom field in Xero first and then mapped manually.
Once live, changes sync on different clocks depending on direction: updates made in HubSpot reach Xero within a few minutes, while changes made in Xero take up to 30 minutes to appear in HubSpot. A manual Sync now button is available on the CRM syncs tab for anyone who doesn't want to wait.
Where It Actually Breaks
Invoices Created in HubSpot Can Only Be Edited There
With Invoice sync running bi-directionally, it is easy to assume either side is fair game for edits. It isn't. An invoice created in HubSpot has to be edited from HubSpot, adding or removing a line item, changing pricing, or removing a payment directly in Xero will make that invoice fail to sync, with an error stating plainly that the modification can't be made through an external application. An invoice created in Xero has no such restriction and can be edited freely from either side.
Tax Rates Go Stale Without a Manual Refresh
Xero's tax rates are imported into HubSpot once, at the point outbound or bi-directional Invoice sync is first configured. Add a new tax rate in Xero afterwards, and it won't appear in HubSpot until someone manually re-saves the bi-directional sync configuration to trigger a fresh import. Teams that add a tax rate mid-year and never revisit the sync settings end up with invoices using the wrong rate, or failing outright. Credit card fees have a similar blind spot: if fees are turned on in payment settings, that fee never syncs to the Xero invoice, which usually means manual reconciliation unless the fee setting is turned off for Xero-synced invoices.
Quotes Don't Sync, Full Stop
This is not a configuration gap to fix, it is a hard limitation of the app. Any workflow that depends on a Xero quote showing up in HubSpot needs a separate integration entirely; this one will never carry that data across.
A Large Excluded Count Isn't Automatically a Problem
This is the actual sync overview dashboard from this client's rollout:
The sync dashboard tracks three numbers per object: In Sync, Failing, and Excluded. Excluded is easy to mistake for a failure, but it usually just means a record fell outside whatever matching or segment rules the sync is using, a HubSpot contact who has never been invoiced through Xero, for instance. Failing is the number worth watching closely, since those are records the sync is actively trying and failing to reconcile. We ran into the same dashboard-reading problem while auditing a HubSpot-Shopify sync that looked healthy on paper until we actually opened it up.
How This Compares to HubSpot's QuickBooks Online Integration
Teams evaluating both often assume the two native accounting integrations behave the same way. They largely do, with one clear gap. Both support bi-directional sync for Contacts, Products, and Invoices. QuickBooks Online adds a fourth object, Credit Memos, with its own two-way sync; Xero has no equivalent object at all. A business choosing between the two purely on integration depth will find QuickBooks Online's native integration the slightly more complete of the two, though which one actually fits depends on which accounting platform the finance team already runs.
| Capability | Xero Integration | QuickBooks Online Integration |
| Contact sync | Bi-directional | Bi-directional |
| Product sync | Bi-directional | Bi-directional |
| Invoice sync | Bi-directional | Bi-directional |
| Credit Memo sync | Not supported | Bi-directional |
| Quote sync | Not supported | N/A |
How We Approached the Integration
We followed HubSpot's own sequencing guidance rather than treating each object as independent:
- Configured Contact and Product sync first, and let them stabilize before enabling Invoice sync, since Xero requires both to already exist before an invoice can sync.
- Set all three configurable objects to bi-directional sync, with HubSpot winning conflicts on Contacts and Xero winning on Invoices, matching which team actually owns that data day to day.
- Documented the invoice editing rule for the client's finance team directly: edit HubSpot-created invoices in HubSpot, Xero-created invoices in Xero, never the other way around.
- Configured all tax rates in Xero before turning on bi-directional invoice sync, avoiding the manual re-import step entirely for the initial rollout.
- Set expectations with the client up front that Quotes would never sync, so no one built a process around data that was never going to arrive.
- Reviewed the sync dashboard weekly for the first month, treating Failing counts as the priority and Excluded counts as a number to understand, not automatically fix.
See What a Clean Sales-to-Billing Pipeline Looks Like
Explore HubSpot CRM DashboardsWhat Changed After Go-Live
Invoice sync came out the cleanest of the tracked objects, a direct result of configuring Contact and Product sync first as recommended. Product sync settled in with a modest failing count the team now checks weekly. Contact sync carries the largest excluded count by a wide margin, which reflects how much of the HubSpot contact database was never invoiced through Xero in the first place, not a problem with the sync itself. Payments needs no separate check since its configuration is fixed by default. What matters is that the client can now see the numbers that do vary at a glance, rather than discovering a mismatch only when a customer calls asking about a missing invoice.
Want Sales and Accounting Working From the Same Data?
Book a Free ConsultationThis is one of several native HubSpot integrations we've audited and rebuilt for clients. If this sounds familiar, our breakdowns of PrintIQ and Cvent integrations cover similar ground from different angles.
Frequently Asked Questions
Can I create an invoice in HubSpot and have it sync to Xero?
Yes, when Invoice sync is configured bi-directionally or outbound. Once created, though, that invoice can only be edited from HubSpot; making changes to it in Xero will cause it to fail to sync.
Do Xero quotes sync to HubSpot?
No. Quotes are explicitly excluded from this integration. HubSpot's own documentation points to a separate integration built by Xero for teams that need quotes to sync.
Why isn't a new Xero tax rate showing up in HubSpot?
Tax rates are imported into HubSpot only at the point outbound or bi-directional Invoice sync is first configured. A tax rate added in Xero afterwards needs the sync configuration to be manually re-saved before it will import.
Why does the sync dashboard show such a high Excluded count?
Excluded records are ones that fell outside the sync's matching or segment rules, often because that HubSpot contact has never been invoiced through Xero. It is not the same as Failing, which tracks records the sync is actively trying and failing to reconcile.
Why should Contact and Product sync be turned on before Invoice sync?
Xero requires the contact and the product on an invoice to already exist in Xero before that invoice can sync. Enabling Invoice sync before the other two are stable risks invoices failing or arriving with missing associations.
Can I add custom field mappings beyond the defaults?
Yes, but it requires at least Data Hub Starter. Below that tier, teams can turn default mappings on or off but cannot create new custom ones. PO Number is a common example that needs this, since it isn't a default Xero invoice field.
Is HubSpot's Xero integration the same as its QuickBooks Online integration?
Almost. Both support bi-directional sync for Contacts, Products, and Invoices. QuickBooks Online adds a Credit Memos object with its own two-way sync, which the Xero integration has no equivalent for.
Leave a comment