HubSpot + QuickBooks Online integration
QuickBooks Online holds the invoice, the payment and the customer file that one bookkeeper guards while everyone else queues to ask about it.
Native app- Into HubSpot
- Two way
Is there a native QuickBooks Online + HubSpot integration?
Yes. The QuickBooks Online app in the HubSpot App Marketplace is HubSpot's own as of September 2026, and for most finance teams it is the right first move at 8 to 24 hours of mapping and validation. It stops when invoice status has to drive a workflow, or when a customer exists twice under two spellings.
- Recommended route
- Native app
- Build effort
- 8 to 24 hours
- In the HubSpot App Marketplace?
- Yes, QuickBooks Online by HubSpot
- Typical elapsed time
- 1 to 2 weeks
Marketplace checked September 2026.
Why teams connect QuickBooks Online to HubSpot
A QuickBooks Online company file is usually run by one or two people, and everybody else in the business queues up to ask them questions. Has this customer paid. Are they on hold. Did we ever bill for the second phase. The answers sit in QuickBooks, the questions come from sales and service, and the distance between them is a message and a wait.
That is a small problem until the company grows past the point where one person can answer. Then it turns into three visible costs. Sellers discount for an account that is ninety days overdue. Service keeps working for a customer finance has already stopped invoicing. Somebody creates a second customer record because the first one was spelled differently, and the bookkeeper spends a morning merging them back.
Connecting the two systems is less about moving data than about moving the answer to where the question gets asked. Almost every engagement we scope here lands in the same place: finance keeps the ledger, HubSpot gets a read only view of it beside the deal and the company, and the only thing that ever moves the other way is a closed won deal that legitimately creates a customer. That shape is small enough that the packaged app often covers it, which is why this page spends as much time on when not to build as on how.
What syncs
Five objects cover almost every QuickBooks engagement. The customer becomes a HubSpot company, invoices and payments land as custom objects beside it, items become products, and estimates become deals where quoting genuinely happens in QuickBooks rather than in HubSpot.
Invoices belong on a custom object, not on the deal. A deal is a pipeline record with a stage and a close date, and an invoice is an accounting document with a balance. Forcing one into the other gives you a pipeline full of closed deals that reopen every time finance issues a credit note.
The key is the QuickBooks id, stored in a custom HubSpot property, on every object. Display names are the obvious match key and the wrong one, because bookkeepers rename customers as a matter of routine. Payments key on their own id and associate to the invoice they settle, so a part payment against three invoices resolves correctly instead of landing on whichever one was read first.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Customer | Company | Two way | QuickBooks customer id held in a custom HubSpot property | The display name changes when the bookkeeper tidies the ledger, the id does not. |
| Invoice | Custom object | Into HubSpot | Invoice id, with the document number shown to sellers | A custom object keeps invoices off the deal, which is a pipeline record. |
| Payment | Custom object | Into HubSpot | Payment id, associated to the invoice it settles | |
| Estimate | Deal | Into HubSpot | Estimate id | Only worth mapping where quoting happens in QuickBooks rather than HubSpot. |
| Item | Product | Into HubSpot | Item id, with the name as the readable label |
Architecture
The packaged route has no architecture you control. The app authorizes against one company file, syncs the fields it supports on its own schedule, and holds its state where you cannot see it. That is the trade, and for a single company file with a stable mapping it is a good one.
A built service is a webhook queue with a sweep behind it. QuickBooks posts an event when an entity changes, the endpoint verifies it and writes the entity id onto a queue, and a worker reads the full record and upserts it into HubSpot as a batch keyed on the QuickBooks id. Associations run as a separate pass, so a replay is safe.
The sweep is what makes it trustworthy. Once a night the service asks change data capture for everything that moved in the last day and reconciles it against what the queue processed. Webhooks get lost. A watermark sweep behind them turns a silent gap into a logged difference.
What the API allows
- API style
- REST
- Authentication
- OAuth 2.0
- Webhooks
- Yes
- Changed-since filter
- Yes
- Sandbox
- Yes
- Rate limit
- 500 requests per minute per company file, and 10 requests per second per company file and app
Developer documentation developer.intuit.com
Three ways to connect
The question that decides this one is whether finance data needs to be visible or actionable. If sellers just need to see the invoice and the balance before a call, HubSpot’s own app does that with no service to host and no on-call rotation, and we will tell you so.
It stops being enough at three points. When invoice status has to trigger something, because the app syncs fields rather than firing events. When there is more than one company file, because each one authorizes separately. And when finance needs a field the mapping does not carry. A per-task automation platform is the route we steer away from here: every invoice and payment becomes a billable run, so the bill grows with the ledger while the value does not.
-
Native app
RecommendedHubSpot's own QuickBooks Online app puts customers, invoices and products in the portal with no service to host, and it is the honest first answer for a team that wants finance data visible rather than actionable.
-
Custom middleware
PossibleA keyed service earns its cost once invoice status has to trigger a workflow, once more than one company file is in play, or once the native field mapping cannot carry what finance cares about.
-
Automation platform
AvoidA per-task automation platform turns every invoice and payment into a billable run, so the cost grows with the ledger while the value stays flat.
What breaks and how we prevent it
Duplicate customers from name matching
Duplicate customers are the most common failure and the most expensive to unpick. They come from matching on a name. We key on the QuickBooks customer id held in a custom property, and we run a duplicate report over the first week’s writes rather than assuming.
Expired tokens and removed apps
Silent disconnection is hard to notice. A token expires or an admin removes the app, and the sync stops without anything looking wrong. We treat an empty run as a failure, alert on it, and hold the last good watermark so the catch up reads only the gap.
Change data capture’s thirty-day limit
Reaching for the wrong read is common. Change data capture looks back at most thirty days and returns at most a thousand objects, so it is a nightly sweep, not a first load. The initial load is a paged query, run once, with its own checkpoint.
500 requests a minute per file
Throughput bites at cutover. Intuit allows 500 requests a minute against a company file and 10 a second per file and app, and a batch should carry around thirty payloads. A first load that ignores those numbers gets throttled halfway through and leaves the portal half populated. We pace the load, honour the throttle response, and resume from the checkpoint.
Our approach
- Scope. We check how many company files exist, which finance fields sellers need, and whether any workflow has to fire on invoice status. That last answer decides whether the packaged app is enough. Budget 4 to 8 hours of discovery and 8 to 24 hours of setup and validation for the native route.
- Architect. We agree the field mapping and which side owns the customer record before anything is connected, and we name the trigger that would send this to a build.
- Build. We install and authorize the app, review the mapping rather than accepting defaults, and wire the HubSpot workflows that use it.
- Validate. We connect a sandbox or test company first, reconcile customer and invoice counts against a QuickBooks report, and check that nothing writes back what finance owns.
- Operate. We watch for a sync going quiet, re-check the mapping when the chart of accounts changes, and escalate to a build when the app runs out of room.
Common questions
Does the HubSpot QuickBooks Online app sync invoices both ways?
No. The app brings finance records into the portal so sellers can see them. It is not a route for editing an invoice from HubSpot, and you should not want one. QuickBooks is the book of record, and a sales tool that can rewrite a posted invoice is an audit problem rather than a feature.
How quickly does a QuickBooks Online invoice appear in HubSpot?
That depends on the route. A custom service can subscribe to webhooks and act within seconds of the invoice being saved. The packaged app runs on its own schedule instead, so the honest expectation is minutes to hours. If a workflow has to fire the moment an invoice posts, budget for the build.
What does QuickBooks Online change data capture actually return?
It returns the full payload of every entity that changed inside a look-back window, which reaches back at most thirty days, and a response carries at most one thousand objects. Deleted records come back with a deleted status rather than vanishing. It is the right tool for a nightly sweep and the wrong one for a first load.
Why does one QuickBooks customer turn into two HubSpot companies?
Almost always because something matched on the display name. Bookkeepers rename customers, add a trading name, or fix a spelling, and a name based match then treats the same customer as new. We key every write on the QuickBooks customer id in a custom property, so a rename updates the existing company instead of creating a second one.
What happens when a QuickBooks Online connection stops working?
The sync goes quiet rather than loud, which is the dangerous part. Tokens expire, an admin disconnects the app, or a company file is closed. We treat a run that returns nothing as a failure rather than a success, alert on it, and keep the last successful watermark so the catch up reads only what was missed.
Can we test a QuickBooks Online integration without touching the live books?
Yes. Intuit gives every developer account a sandbox company with sample data, and webhook endpoints are configured separately for sandbox and production. We build and rehearse there first. Cutover is then a token swap against the real company file, with a portal allowlist in the service so the wrong credentials cannot write to the wrong place.
How many QuickBooks Online API calls will a nightly sync use?
Fewer than most people expect, if it is built to read changes rather than everything. Intuit allows 500 requests a minute per company file and 10 a second per company file and app, a query returns at most one thousand entities, and a batch request should hold about thirty payloads. A changed-only nightly sweep sits well inside that.
How long does a QuickBooks Online and HubSpot setup take?
The packaged route runs to 4 to 8 hours of discovery and 8 to 24 hours of setup and validation. Most of that is reviewing the field mapping and reconciling counts against a QuickBooks report, not configuration. Calendar time is usually a week or two, and the long pole is getting an administrator on both sides in the same room to authorize the connection.
Also in ERP and accounting
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Scope a QuickBooks Online 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.
Where these facts come from
- Set up OAuth 2.0 developer.intuit.com
- API call limits and throttles developer.intuit.com
- Change data capture operation developer.intuit.com
- Configure webhooks developer.intuit.com
- Sandbox and tools developer.intuit.com