HubSpot + Xero integration
Xero keeps the invoices and payments of small businesses and their advisors. What HubSpot's own Xero app syncs both ways, and where a keyed build begins.
Connects by APIScope this integration Book a scoping call Estimate the cost
- Into HubSpot
- Two way
Is there an official Xero + HubSpot integration?
Yes. HubSpot publishes the Xero app itself, listed in the HubSpot App Marketplace as of September 2026, and it syncs contacts, items, invoices and payments, with invoices able to move both ways. For most small teams it is the right first step, at 8 to 24 hours of setup and validation. It stops when Xero contacts need to be HubSpot companies, when quotes matter, or when a paid invoice must trigger a workflow the moment it lands.
- Recommended route
- Marketplace app
- Build effort
- 8 to 24 hours
- In the HubSpot App Marketplace?
- Yes, Xero by HubSpot
- Typical elapsed time
- 1 to 2 weeks
Marketplace checked September 2026.
Why teams connect Xero to HubSpot
Xero is built for small businesses and the accountants and bookkeepers who work with them, so the person closest to the ledger may well sit at an accounting practice rather than inside the company. Sales lives in HubSpot. The questions that cross between the two are small and constant: did the customer pay the deposit, which invoice is overdue, was the second stage ever billed. Each one becomes an email to whoever keeps the books, and a wait.
HubSpot’s own Xero app goes further than showing invoices in the portal. Its two-way invoice sync is meant for small businesses that run their billing from HubSpot: a deal or a quote becomes a HubSpot invoice, the invoice lands in Xero, and payments recorded against it come back. For a team that bills from its CRM, that is most of the integration, and it installs rather than builds.
What decides the rest is the record model. A Xero contact is the party you invoice, often a whole business with up to five contact persons, and the app pairs it with a HubSpot contact on email. A business that sells to companies, reports on accounts, or quotes in Xero rather than in HubSpot eventually needs a company keyed on the Xero identifier instead, and that is where a build starts.
What syncs
HubSpot’s app already moves four of the five objects in the table: contacts, items, invoices and payments. Quotes are the gap, and the listing says so.
Keys are Xero’s own identifiers. Xero tells developers to reference contacts by ContactID rather than by name, warning that contact names may stop being unique, so a build stores ContactID and InvoiceID in custom HubSpot properties. Where HubSpot creates the Xero contact, the build writes the HubSpot record ID into ContactNumber, a field only the API can set and Xero shows as the contact code, so a retry finds the contact instead of making a second one.
The invoice feed needs one filter. Xero’s invoices endpoint returns sales invoices and supplier bills alike, telling them apart by type, and a bill’s number is not unique. A HubSpot sync reads sales invoices only and keys on InvoiceID. Payments key on their own ID and associate to the invoice they settle, so a part payment lands on the right document.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Contact | Contact | Two way | Email, which is how HubSpot's app matches contacts | A Xero contact is often a whole business; a build keys it to a company on ContactID instead. |
| Invoice | Custom object | Two way | InvoiceID, with the invoice number shown to sellers | HubSpot's app writes HubSpot's own invoice object; a build uses a custom object. |
| Payment | Custom object | Into HubSpot | PaymentID, associated to the invoice it settles | Only payments created after the app connects reach HubSpot. |
| Item | Product | Two way | SKU or name, as HubSpot's app matches products | Changing a SKU in HubSpot breaks the invoices that already carry it. |
| Quote | Deal | Into HubSpot | QuoteID, with the quote number shown to sellers | Outside HubSpot's app, which does not sync quotes. |
Architecture
HubSpot’s app is a data sync. It indexes both sides, then detects changes from HubSpot within a few minutes and changes from Xero every 30 minutes, with a Sync now button when that is too slow. Xero needs an invoice’s contact and products to exist first, so the syncs are switched on in order: contacts, then products, then invoices.
When a build takes over part of the work, its shape is a webhook queue. Xero posts events for contacts and invoices, signed with an HMAC-SHA256 hash in the x-xero-signature header. The endpoint checks the signature, answers inside five seconds, and queues the resource IDs. A worker reads them back in batches through the IDs filter, upserts HubSpot on ContactID and InvoiceID, then runs a separate association pass, so a replay changes nothing.
Payments, items and quotes raise no events, so a nightly sweep reads them with If-Modified-Since. The service renews its 30-minute access token with a refresh token that lasts up to 60 days, and saves the new pair every time.
What the API allows
- API style
- REST
- Authentication
- OAuth 2.0
- Webhooks
- Partial
- Changed-since filter
- Yes
- Sandbox
- Yes
- Rate limit
- Per connected organization: 60 calls a minute, 5 at a time, and 1,000 a day on the Starter tier or 5,000 a day on higher tiers, plus 10,000 calls a minute per app across all organizations
Developer documentation developer.xero.com
Three ways to connect
The question that decides this one is which system raises the invoice. If HubSpot does, through quotes, deals or subscriptions, HubSpot’s own app is built for that flow, and it is where we start. It handles six currencies, CAD and USD among them, and it does not import tax rates for multi-tenant Xero accounts, so check both before you commit.
A custom API integration earns its cost when the model has to change rather than the flow: Xero contacts kept as HubSpot companies, quotes in the pipeline, balances on the account, or a workflow that fires when a payment lands. Xero also lists a Xero Connector of its own, which lets HubSpot’s AI assistant and agents look up and create Xero records on request; it answers prompts rather than keeping records in step. The route we steer away from is a per-task automation platform, because payments, items and quotes raise no events and have to be polled.
-
Marketplace app
RecommendedHubSpot's own Xero app syncs contacts, items, invoices and payments with no service to host, and its two-way invoice sync lets a small team bill from HubSpot while Xero keeps the ledger.
-
Custom API integration
PossibleA custom API integration earns its place when Xero contacts must become HubSpot companies keyed on ContactID, when quotes or balances belong in the portal, or when a paid invoice has to fire a workflow at once.
-
iPaaS
AvoidHubSpot's own app already moves contacts, invoices and payments, so a per-task platform would repeat it, and for payments, items and quotes it can only poll, because Xero raises no event for them.
What breaks and how we prevent it
Balances that never touch UpdatedDateUTC
Xero says some changes leave a record’s UpdatedDateUTC alone: a contact’s balances and its customer and supplier flags, and fields such as the due date on a partly paid invoice. An If-Modified-Since read never returns those changes. We derive the open balance from invoices and payments, which do move, and refresh contact balances on a schedule of their own.
A refresh token lost in rotation
Every refresh returns a new refresh token, and the old one keeps working for a grace period of only 30 minutes. A crash between the refresh and the save, left longer than that, leaves the connection waiting for a person to authorize it again. One process owns the token pair, stores the new pair before using it, and alerts on the first authorization failure.
Webhooks disabled after a day
When deliveries fail, Xero retries every 15 minutes for 24 hours, then disables the subscription and emails the app’s collaborators. Events raised meanwhile are kept for up to 31 days and replayed in order once the subscription is re-enabled and passes intent to receive again. We keep the right people listed as collaborators, and our sweep does not wait for the replay.
A thousand calls on Starter
A single-client app starts on Xero’s Starter tier, which allows 1,000 calls a day per organization, against 5,000 on higher tiers. A build that makes one read per event can spend that early on a busy day. We batch reads through the IDs filter, page with up to 1,000 records a page, and honour Retry-After on a 429.
Our approach
- Scope. We confirm which system raises invoices, whether contacts or companies carry the account, and whether your currencies and tax setup fit the app. Budget 4 to 8 hours of discovery and 8 to 24 of setup.
- Architect. We agree the sync direction and the conflict winner per object, the custom mappings Data Hub allows, and the trigger that would send the work to a build.
- Build. We install the app, switch on the contact sync, then products, then invoices and payments, and wire the HubSpot workflows that use them.
- Validate. We rehearse against Xero’s demo company, then reconcile contact, invoice and payment counts against Xero reports.
- Operate. We watch failing records on the sync tab, fix SKU and email mismatches at the source, and move to a build when the app runs out of room.
Common questions
What does HubSpot's Xero app leave out?
Quotes, to start with: the listing says they do not sync. The app moves contacts, items, invoices and payments, but only payments created after you connect it, only open invoices raised in HubSpot flow to Xero, and invoices that use HubSpot's automated sales tax stay behind. It supports six currencies, and custom field mappings need Data Hub Starter or above.
Is the Xero Connector in the HubSpot marketplace a sync?
No. Xero publishes the Xero Connector as an MCP server for HubSpot's AI assistant and agents. It exposes tools such as listing contacts and invoices and creating an invoice, so an agent can answer a prompt about an account's unpaid bills. It keeps nothing in step between the two systems; the sync is HubSpot's own Xero app. Commercient also lists Xero SYNC, Data Lake, AI, MCP by Commercient, a third-party app.
How often does HubSpot's Xero app pick up changes made in Xero?
Every 30 minutes. HubSpot's documentation says changes from Xero to HubSpot are detected on that cycle, while changes from HubSpot to Xero are detected within a few minutes, and a Sync now button forces a run. If a workflow must react when an invoice is paid, a build that listens for Xero's invoice events acts when the event arrives rather than on a cycle.
How does a Xero integration avoid creating the same invoice twice?
Two ways, and a build uses both. Xero accepts an Idempotency-Key header on writes and returns the cached response if the same request comes again, but it keeps each key for only six minutes. For anything slower, the build looks before it writes: contacts by the HubSpot ID stored in ContactNumber, invoices by the Xero ID already held in HubSpot.
How many Xero API calls can a HubSpot integration make?
Xero limits calls per connected organization: 60 a minute, five at a time, and 1,000 a day for apps on the Starter tier or 5,000 a day on higher tiers, plus 10,000 a minute per app across all organizations. Every response carries headers with the calls remaining. A 429 names the limit that was hit, and Retry-After says how many seconds to wait.
Why would a Xero invoice fail to sync from HubSpot?
Usually for one of four reasons HubSpot documents. The contact on the invoice does not share its email with the customer in Xero. An invoice raised in HubSpot was edited in Xero. A product's SKU changed in HubSpot after it went on the invoice. Or the invoice uses HubSpot's automated sales tax, which the sync does not carry to Xero.
Can we test a Xero integration without touching the real books?
Yes. Every Xero login can open a demo company filled with sample data, which can be reset or moved to another country at any time and resets itself 28 days after creation, after which apps must reconnect. Xero connects it to an app exactly as it would a real organization, so we rehearse the whole sync there first.
How long does it take to set up HubSpot's Xero app properly?
Allow 4 to 8 hours of discovery and 8 to 24 hours of setup and validation. Most of it is sequencing and checking: contacts first, because Xero needs an invoice's contact and products to exist, then products, then invoices and payments, followed by a reconciliation of counts against Xero reports before anyone relies on the numbers.
Also in ERP and accounting
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Trust and compliance
We design integrations to support the security and privacy rules your business works under, and we build them on independently audited platforms.
-
SOC 2
We build to support SOC 2 security controls, on platforms that hold SOC 2 reports of their own.
-
ISO/IEC 27001:2022
We build to support your information security program under ISO/IEC 27001:2022.
-
HIPAA
We scope BAA needs in discovery, then design builds around them for covered entities and their business associates.
-
GDPR
We scope data-processing needs in discovery and design builds to support your GDPR duties.
About the GDPR at the European Commission (opens in a new tab)
-
PIPEDA
We design builds to support your accountability for personal information as it moves between systems.
-
CASL
We can build consent capture and sync that support your CASL consent records.
Our builds run on
How we build
- Sandbox first. We build and test in a sandbox before anything reaches production.
- Fail-closed allowlists. An integration runs only against the HubSpot accounts it is approved for.
- Least-privilege access. Each integration gets only the API scopes it needs.
- Secrets in a vault. Keys and tokens live in a secrets vault, never in plain text.
- Sensitive data scoped early. Discovery covers sensitive data, access controls and any BAA or data-processing needs.
- A compliance package for regulated industries: audit logging, field-level encryption and sensitive-data handling.
Scope a Xero integration
Send the systems, the direction and the record volume. We reply with a scope and an effort band within one business day.
Thanks, we will reply within one business day
Prash or Sean reads every one of these and comes back with a scope, or with the one question we need answered first.
Sources
- Connect HubSpot and Xero (Data Sync) knowledge.hubspot.com
- Xero - Accounting App for HubSpot | HubSpot ecosystem.hubspot.com
- Xero Connector - Accounting and Connector App for HubSpot | Xero ecosystem.hubspot.com
- Match records in data sync knowledge.hubspot.com
- OAuth 2.0 API limits developer.xero.com
- Xero API webhooks developer.xero.com
- Accounting API HTTP Requests and Responses developer.xero.com
- Accounting API Contacts developer.xero.com
- Accounting API Invoices developer.xero.com
- Accounting API Payments developer.xero.com
- Accounting API Quotes developer.xero.com
- Accounting API Items developer.xero.com
- Token types developer.xero.com
- Idempotent requests developer.xero.com
- Development accounts developer.xero.com
- Xero Developer Pricing and Policies developer.xero.com
- About Xero xero.com