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 API

Scope this integration Book a scoping call Estimate the cost

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.

Objects that sync between Xero and HubSpot
Source object HubSpot object 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.

The build we add when HubSpot's app runs out of room: Xero posts signed events for contacts and invoices, the service queues their IDs, reads them back in batches and upserts HubSpot on Xero's IDs. A nightly If-Modified-Since sweep collects payments, items and quotes, which raise no events.

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.

  • Custom API integration

    Possible

    A 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

    Avoid

    HubSpot'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

  1. 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.
  2. 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.
  3. Build. We install the app, switch on the contact sync, then products, then invoices and payments, and wire the HubSpot workflows that use them.
  4. Validate. We rehearse against Xero’s demo company, then reconcile contact, invoice and payment counts against Xero reports.
  5. 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.

Partnerships and accreditations

  • HubSpot Elite Solutions Partner
  • HubSpot Custom Integration Accreditation
  • HubSpot CRM Data Migration Accreditation
  • HubSpot Solutions Architecture Design Accreditation

HubSpot accreditations

  • HubSpot Onboarding Accreditation
  • HubSpot Academy Accreditations

Industry specializations

  • HubSpot Healthcare Industry Specialist
  • HubSpot Financial Services Industry Specialist
  • HubSpot Manufacturing Industry Specialist
  • HubSpot Quote to Cash Capability

Partnerships

  • Anthropic Solutions Partner

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.

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.

  • Xero

Type any system and its version, such as Sage 300 or Sage 50. Press Enter or a comma after each one.

Add more detail (optional)

Optional. A sentence or two about the workflow is enough.

We use these answers to scope the work and for nothing else. Privacy policy.

Prefer to talk it through first? Book a technical scoping call

Talk to the people who build these

  • Nijat
  • Sean
  • Prash

Book a scoping call