RevOps HQ

HubSpot ERP Integrations

An ERP integration fails for one reason more than any other, and it is not technical. Two systems end up writing the same field, nobody decided which one wins, and the number a salesperson quotes stops matching the number finance invoices.

The ERP owns money. It owns the invoice, the recognised revenue, the payment date, the credit position and the tax determination, and it owns them because it is the system an auditor will be shown. HubSpot owns the relationship: who is being spoken to, what was promised, which stage the work is at and why the last attempt was lost.

Almost every difficult question in this category resolves once that line is drawn per field rather than per system.

15 systems in this category, 8 of them documented in a published case study.

What an ERP integration is actually deciding

Three questions come before any connector is chosen, and the answers hold whichever one is selected.

Identity first. No two commercial systems share an identifier space, so a customer in the ERP and a company in HubSpot are the same organisation only because something asserts it. Where that assertion is a name match, it will eventually match the wrong one.

Then ownership, field by field. A value written by both sides without a stated winner is a value that will disagree, and the disagreement surfaces during a commercial conversation rather than during a data review.

Then observability. The integration failures that cost trust are the silent ones: an expired credential or a paused schedule, where records stop moving and both systems continue reporting themselves healthy.

Which system owns each field, and the direction the value travelsSeven fields, each listed once. Two vertical axes represent the CRM and the finance system. For each field a connector runs from the axis of the system that owns it to the axis of the system that receives it: company name, deal amount and account owner flow from the CRM to finance; billing address, payment terms and invoice status flow from finance to the CRM. Industry is drawn as a dashed line with no arrowhead at either end, because no system owns it — which means it is written by whichever integration ran most recently. The conflict policy for each field is stated on the right.FIELDCONFLICT POLICYCRMFINANCECompany nameSales maintains it; finance mirrorsBilling addressInvoice of record winsPayment termsContractual; read-only in the CRMDeal amountUntil invoiced, then finance owns itInvoice statusOne direction onlyAccount ownerNo finance equivalentIndustryOwned by neither — decide, or it flapsA dot marks the owning system, the arrowhead the receiving one. One owner per field: a field with two would flap.

Which system authors each field, and where the boundary between them falls

Entities on each side of the boundary, and the key joining each pairOn the left, HubSpot objects: company, contact, deal and line item. On the right, the finance system's customer, contact, invoice and invoice line. Each pair is joined by a named key — a stored external identifier for company to customer, email address for contact to contact, a purpose-built identifier for deal to invoice because no native key exists, and a mapping table for line items. Only the email address existed already; the other three keys had to be created. Company to customer and contact to contact are one to one; a deal may produce several invoices, and a line item several invoice lines.HUBSPOTSYSTEM OF FINANCIAL RECORDJOIN KEYCompanydomain · hs_object_idContactemail · hs_object_idDealamount · closedateLine itemproduct · quantityCustomerdisplay name · idContactemail · idInvoicetotal · due dateInvoice lineitem · quantityquickbooks_customer_id1 : 1email address1 : 1no native key — created1 : Nproduct mapping table1 : NOnly one of these four keys existed already. The three that had to be created are the three that break.

The objects on each side of the boundary and the associations that cross it

Systems in this category

QuickBooks

Invoices and payments against the deal, with identity reconciled before anything syncs.

NetSuite

Order-to-cash across the boundary, with field ownership decided per object.

Sage Intacct

Recognised revenue and project accounting read back to the account record.

Xero

Invoice status and payment date surfaced without leaving the deal.

Dynamics 365 Business Central

Customer, item and order records mapped to HubSpot objects rather than mirrored wholesale.

Acumatica

Project and inventory data joined to the opportunity that produced it.

SAP

A bounded interface across a system with its own change-control regime.

Odoo

Modules selected per requirement instead of syncing the whole estate.

Epicor

Manufacturing and distribution records exposed to the commercial team read-only.

Infor

Industry CloudSuite data surfaced against the account it belongs to.

BILL

Payables and receivables state visible where the relationship is managed.

Avalara

Tax determination left with the system that owns it, referenced rather than copied.

Ramp

Spend against an account joined to the revenue it supports.

Brex

Card and expense data reconciled to the customer record.

Maxio

Subscription billing and revenue schedules read against the deal.

Documented engagements

Each of these is a published study of one build, with the object model, the decisions taken and what the approach does not establish.

Common Questions

Frequently Asked Questions

Frequently, and it is the first thing assessed. Where the packaged connector's assumptions match the business it costs least, is maintained by the vendor, and fails in ways thousands of other portals have already reported. Custom work is warranted where the object model cannot be expressed in it: project-level costing, a regulatory constraint on where data may travel, or a second system writing to the same field.

Both, for different fields on the same organisation. Legal entity, billing address, payment terms and credit status belong to the ERP because finance is accountable for them. Owner, lifecycle stage, source and every activity belong to HubSpot. What cannot hold is one field written by both without a conflict policy.

No, and syncing it wholesale is the commonest way to make a portal unusable. The useful question is which fields a commercial decision depends on. An invoice status and a payment date change how a renewal conversation runs; a general ledger account code does not.

A field added on one side that nobody mapped, a credential that expired without an alert, and volume growth that pushed a sync past an API limit it was never measured against. All three are prevented by monitoring rather than by design.

Further reading

Long-form already published on the argument this category turns on.

Related categories

A system in this category that is not listed

The directory shows range rather than limits. A scoped build is quoted from the object model on each side and the fields that have to cross between them.

HubSpot services

Onboarding, implementation, integration, migration, administration and training, each scoped and priced before the work begins

WEEKLY PROGRAM

RevOps Office Hours

A recurring weekly RevOps operating program. Live support plus hands-on HubSpot implementation work.

$1,500/mo
Monthly Operating Program
  • 1 live Office Hours session per week
  • 4 hours of hands-on implementation work per month
  • Hours allocated against priorities agreed at the start of each period
  • Recurring monthly cadence