{
  "slug": "xero",
  "url": "https://apps.sectorgrowth.com/integrations/xero/",
  "name": "Xero",
  "vendor": "Xero",
  "aliases": [
    "Xero Accounting",
    "Xero accounting software"
  ],
  "website": "https://www.xero.com/ca/accounting-software/",
  "category": {
    "slug": "erp-and-accounting",
    "name": "ERP and accounting",
    "url": "https://apps.sectorgrowth.com/categories/erp-and-accounting/"
  },
  "summary": "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.",
  "answer": "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.",
  "nativeApp": {
    "status": "hubspot-built",
    "name": "Xero",
    "developer": "HubSpot",
    "verifiedAt": "2026-09-28"
  },
  "api": {
    "style": "rest",
    "auth": "oauth2",
    "webhooks": "partial",
    "changedSince": "yes",
    "sandbox": "yes",
    "rateLimit": "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",
    "docsUrl": "https://developer.xero.com/documentation/api/accounting/overview"
  },
  "objects": [
    {
      "source": "Contact",
      "hubspot": "contact",
      "direction": "two_way",
      "key": "Email, which is how HubSpot's app matches contacts",
      "notes": "A Xero contact is often a whole business; a build keys it to a company on ContactID instead."
    },
    {
      "source": "Invoice",
      "hubspot": "custom",
      "direction": "two_way",
      "key": "InvoiceID, with the invoice number shown to sellers",
      "notes": "HubSpot's app writes HubSpot's own invoice object; a build uses a custom object."
    },
    {
      "source": "Payment",
      "hubspot": "custom",
      "direction": "to_hubspot",
      "key": "PaymentID, associated to the invoice it settles",
      "notes": "Only payments created after the app connects reach HubSpot."
    },
    {
      "source": "Item",
      "hubspot": "product",
      "direction": "two_way",
      "key": "SKU or name, as HubSpot's app matches products",
      "notes": "Changing a SKU in HubSpot breaks the invoices that already carry it."
    },
    {
      "source": "Quote",
      "hubspot": "deal",
      "direction": "to_hubspot",
      "key": "QuoteID, with the quote number shown to sellers",
      "notes": "Outside HubSpot's app, which does not sync quotes."
    }
  ],
  "approaches": [
    {
      "kind": "native",
      "fit": "recommended",
      "why": "HubSpot'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."
    },
    {
      "kind": "custom",
      "fit": "possible",
      "why": "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."
    },
    {
      "kind": "ipaas",
      "fit": "avoid",
      "why": "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."
    }
  ],
  "connectionMethods": [
    "api"
  ],
  "effort": {
    "discoveryHours": [
      4,
      8
    ],
    "buildHours": [
      8,
      24
    ],
    "buildBand": "8 to 24 hours",
    "typicalElapsed": "1 to 2 weeks"
  },
  "pattern": "webhook-queue",
  "faqs": [
    {
      "q": "What does HubSpot's Xero app leave out?",
      "a": "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."
    },
    {
      "q": "Is the Xero Connector in the HubSpot marketplace a sync?",
      "a": "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."
    },
    {
      "q": "How often does HubSpot's Xero app pick up changes made in Xero?",
      "a": "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."
    },
    {
      "q": "How does a Xero integration avoid creating the same invoice twice?",
      "a": "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."
    },
    {
      "q": "How many Xero API calls can a HubSpot integration make?",
      "a": "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."
    },
    {
      "q": "Why would a Xero invoice fail to sync from HubSpot?",
      "a": "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."
    },
    {
      "q": "Can we test a Xero integration without touching the real books?",
      "a": "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."
    },
    {
      "q": "How long does it take to set up HubSpot's Xero app properly?",
      "a": "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."
    }
  ],
  "sections": [
    {
      "depth": 2,
      "text": "Why teams connect Xero to HubSpot",
      "anchor": "#why-teams-connect-xero-to-hubspot",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#why-teams-connect-xero-to-hubspot"
    },
    {
      "depth": 2,
      "text": "What syncs",
      "anchor": "#what-syncs",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#what-syncs"
    },
    {
      "depth": 2,
      "text": "Architecture",
      "anchor": "#architecture",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#architecture"
    },
    {
      "depth": 2,
      "text": "Three ways to connect",
      "anchor": "#three-ways-to-connect",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#three-ways-to-connect"
    },
    {
      "depth": 2,
      "text": "What breaks and how we prevent it",
      "anchor": "#what-breaks-and-how-we-prevent-it",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#what-breaks-and-how-we-prevent-it"
    },
    {
      "depth": 3,
      "text": "Balances that never touch UpdatedDateUTC",
      "anchor": "#balances-that-never-touch-updateddateutc",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#balances-that-never-touch-updateddateutc"
    },
    {
      "depth": 3,
      "text": "A refresh token lost in rotation",
      "anchor": "#a-refresh-token-lost-in-rotation",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#a-refresh-token-lost-in-rotation"
    },
    {
      "depth": 3,
      "text": "Webhooks disabled after a day",
      "anchor": "#webhooks-disabled-after-a-day",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#webhooks-disabled-after-a-day"
    },
    {
      "depth": 3,
      "text": "A thousand calls on Starter",
      "anchor": "#a-thousand-calls-on-starter",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#a-thousand-calls-on-starter"
    },
    {
      "depth": 2,
      "text": "Our approach",
      "anchor": "#our-approach",
      "url": "https://apps.sectorgrowth.com/integrations/xero/#our-approach"
    }
  ],
  "caseStudies": [],
  "guides": [
    "https://apps.sectorgrowth.com/guides/choose-a-hubspot-integration-approach/"
  ],
  "status": "published",
  "verifiedAt": "2026-09-28",
  "updatedAt": "2026-09-28",
  "authors": [
    {
      "name": "Prash",
      "role": "Lead of Technical Integrations and AI Solutions"
    }
  ],
  "sources": [
    {
      "title": "Connect HubSpot and Xero (Data Sync)",
      "url": "https://knowledge.hubspot.com/integrations/connect-hubspot-and-xero-data-sync"
    },
    {
      "title": "Xero - Accounting App for HubSpot | HubSpot",
      "url": "https://ecosystem.hubspot.com/marketplace/listing/xero-data-sync"
    },
    {
      "title": "Xero Connector - Accounting and Connector App for HubSpot | Xero",
      "url": "https://ecosystem.hubspot.com/marketplace/listing/xero-connector"
    },
    {
      "title": "Match records in data sync",
      "url": "https://knowledge.hubspot.com/integrations/match-records-in-data-sync"
    },
    {
      "title": "OAuth 2.0 API limits",
      "url": "https://developer.xero.com/documentation/guides/oauth2/limits/"
    },
    {
      "title": "Xero API webhooks",
      "url": "https://developer.xero.com/documentation/guides/webhooks/overview/"
    },
    {
      "title": "Accounting API HTTP Requests and Responses",
      "url": "https://developer.xero.com/documentation/api/accounting/requests-and-responses"
    },
    {
      "title": "Accounting API Contacts",
      "url": "https://developer.xero.com/documentation/api/accounting/contacts"
    },
    {
      "title": "Accounting API Invoices",
      "url": "https://developer.xero.com/documentation/api/accounting/invoices"
    },
    {
      "title": "Accounting API Payments",
      "url": "https://developer.xero.com/documentation/api/accounting/payments"
    },
    {
      "title": "Accounting API Quotes",
      "url": "https://developer.xero.com/documentation/api/accounting/quotes"
    },
    {
      "title": "Accounting API Items",
      "url": "https://developer.xero.com/documentation/api/accounting/items"
    },
    {
      "title": "Token types",
      "url": "https://developer.xero.com/documentation/guides/oauth2/token-types/"
    },
    {
      "title": "Idempotent requests",
      "url": "https://developer.xero.com/documentation/guides/idempotent-requests/idempotency/"
    },
    {
      "title": "Development accounts",
      "url": "https://developer.xero.com/documentation/development-accounts/"
    },
    {
      "title": "Xero Developer Pricing and Policies",
      "url": "https://developer.xero.com/pricing"
    },
    {
      "title": "About Xero",
      "url": "https://www.xero.com/us/about/"
    }
  ]
}