HubSpot + NetSuite integration
NetSuite holds the sales order, the fulfilment and the invoice, behind a licence almost nobody in sales will ever be given.
Native app
NetSuite HubSpot - Into HubSpot
- Two way
Is there a native NetSuite + HubSpot integration?
Yes. HubSpot publishes a NetSuite app itself, listed in the HubSpot App Marketplace as of September 2026, and it keeps customers and contacts in step with no build. It stops at the records that matter most in an ERP: sales orders, fulfilments and invoices. Reaching those means a keyed service over SuiteTalk REST, which we scope at 70 to 150 build hours.
- Recommended route
- Custom middleware
- Build effort
- 70 to 150 hours
- In the HubSpot App Marketplace?
- Yes, NetSuite by HubSpot
- Typical elapsed time
- 4 to 8 weeks
Marketplace checked September 2026.
Why teams connect NetSuite to HubSpot
NetSuite is usually the only place a company’s numbers are true, and a NetSuite licence costs enough that most sellers do not have one. So the people talking to an account cannot see what that account has already bought. They ask operations, operations exports a spreadsheet, and by the time it lands the renewal conversation has happened without it.
The request that reaches us is almost always narrower than “integrate NetSuite”. Show open orders on the company record. Flag accounts that are past due before a rep books a meeting. Stop sellers creating a customer finance has to merge next quarter. Each is a different object moving in a different direction, which is why the scoping conversation decides more here than the build.
A second pressure shapes the design. Finance teams running NetSuite have spent years cleaning their customer master, and they are right to be wary of a sales tool writing into it. So almost everything moves one way, into HubSpot, and only the fields a closed deal legitimately owns move back. That asymmetry is a decision about who owns the record rather than a limit of the API, and settling it early is what stops the rebuild.
What syncs
Six objects carry most of the value. The customer becomes a HubSpot company, the contact becomes a HubSpot contact, the sales order becomes a deal, and invoices, item fulfilments and items land beside them as custom objects and products. We leave everything else out of a first build.
Every one of those rows keys on the NetSuite internal id, held in a custom HubSpot property, and never on a name. Entity ids and customer names both change when finance reorganizes the master. The internal id does not, which makes it the only key that survives. Contacts are the exception: email is the practical match key there, with the contact internal id as the tie breaker when two people share an address.
Getting the direction of each object wrong is expensive to unwind later. NetSuite owns the customer, the order and the invoice, so those move into the portal and stay read only there. HubSpot owns the pipeline, the deal owner and the activity history. The single write back worth building on a first pass is a closed won deal creating or updating a customer, and even that is worth holding behind a review queue for the first month.
| | | Direction | Match key | Notes |
|---|---|---|---|---|
| Customer | Company | Two way | NetSuite internal id held in a custom HubSpot property | The entity id changes when finance tidies the master, the internal id does not. |
| Contact | Contact | Into HubSpot | Email, with the NetSuite contact internal id as the tie breaker | |
| Sales Order | Deal | Into HubSpot | Sales order internal id, with the document number as the readable label | Orders are read only in the portal. NetSuite stays the system of record. |
| Invoice | Custom object | Into HubSpot | Invoice internal id, associated to the order | |
| Item Fulfillment | Custom object | Into HubSpot | Fulfilment internal id, associated to the order | |
| Inventory Item | Product | Into HubSpot | Item internal id, with the item name shown to sellers |
Architecture
The runtime is a polling watermark sync, because SuiteTalk REST offers no event subscription to hook into. A service holds an OAuth 2.0 client, reads each record type on a schedule with a filter on the last modified date, and keeps a checkpoint per record type so a restart resumes instead of reloading.
Writes into HubSpot go through batch upserts keyed on the internal id in a custom property, and a separate pass then associates the order to the company and the invoice to the order. Splitting those two steps is what makes a replay safe. Running the same batch twice changes nothing, and running the association pass twice changes nothing either.
State lives in the service, not in either platform. A replay endpoint takes a record type and a time range and re-reads it. A reconciliation endpoint counts NetSuite records against HubSpot records for the same window and reports the difference rather than quietly correcting it. When counts disagree, a person looks.
What the API allows
- API style
- REST
- Authentication
- OAuth 2.0
- Webhooks
- No
- Changed-since filter
- Yes
- Sandbox
- On paid plans
- Rate limit
- Concurrent requests governed per account: 15 on service tier 1, plus 10 for each SuiteCloud Plus licence
Developer documentation docs.oracle.com
Three ways to connect
What decides the route here is how far past the customer record you need to go. HubSpot’s own NetSuite app keeps account and contact records in agreement, and for a team that wants nothing more it is the right answer and costs nothing to try. It syncs fields, so it does not carry a sales order, an item fulfilment or an invoice, and no amount of configuration will make it.
Once transactions are in scope the choice narrows to a service we build or a general purpose automation platform. That platform bills per task, so the cost tracks order volume rather than the value of the work, and it draws on the same account level concurrency budget as every other NetSuite integration. A dedicated service costs more to stand up and behaves predictably after that.
-
Custom middleware
RecommendedA keyed service over SuiteTalk REST is the only route that carries sales orders, fulfilments and invoices, and it lets us hold the concurrency budget the account can actually spare.
-
Native app
PossibleHubSpot's own NetSuite app keeps customer and contact records in agreement with no build, which is enough for a team that only wants the account record to be right.
-
Automation platform
AvoidA per-task automation platform bills against order volume rather than value, and it competes for the same account level concurrency budget as every other NetSuite integration in the business.
What breaks and how we prevent it
The shared concurrency budget
NetSuite governs concurrent requests at the account level, with a base allowance of fifteen on service tier 1 and ten more for each SuiteCloud Plus licence. That budget is shared with every other integration in the account, so a nightly job somebody else scheduled can starve ours. We hold our concurrency well under the allowance, back off on the governance error instead of retrying at once, and agree a run window with whoever owns the other jobs.
Query dates in the wrong format
Record collection filtering runs through the query module, which does not use the same date format as the rest of the API. A watermark on the wrong format returns everything or nothing, quietly. We assert that the first run of each record type returns a known record, and we alert on any scheduled run that comes back empty.
Sandbox drift between refreshes
A NetSuite sandbox is a purchased account refreshed from production on request, so its customizations wander away from the live account between refreshes. We build against it, refresh it before the cutover rehearsal, and keep a fail closed allowlist of account and portal ids in the service so a wrong token cannot write to the wrong place.
Fulfilments arriving before their order
An item fulfilment can reach us before its sales order does. The association pass tolerates a missing parent, requeues the row, and reports what is still unlinked when the run ends.
Our approach
- Scope. Discovery covers the object list, the direction of each object and the key. Most of it goes on the customer master and who may change it.
- Architect. We fix the key, the watermark, the batch size and the association order, then write them down so the build has nothing left to invent.
- Build. The service is written against a sandbox account, with the account and portal allowlist in place from the first commit.
- Validate. We run a full reload into a HubSpot sandbox, reconcile counts by record type, and walk the differences with the person who owns the ledger.
- Operate. Cutover is a token swap. After that we watch the run history, keep the replay and reconciliation endpoints available, and adjust the mapping as NetSuite changes.
Common questions
Is there a HubSpot-built NetSuite app?
Yes. HubSpot publishes a NetSuite app itself, and three other vendors list connectors of their own in the marketplace. The HubSpot app is a field level sync for account and contact records. It does not carry transactions, so sales orders, invoices and fulfilments still need a build.
Can NetSuite push a record to HubSpot the moment it changes?
Not on its own. SuiteTalk REST offers no event subscription to hook into, so a sync reads on a schedule and filters on the last modified date. Where a team genuinely needs a push, the documented route is a SuiteScript user event script on the record, calling our endpoint after the record is submitted. That adds a customization to maintain inside NetSuite.
How do you keep a NetSuite sales order from opening a second HubSpot deal?
Every order is written as a batch upsert keyed on its NetSuite internal id, stored in a custom HubSpot property. Running the same batch twice updates the same deal rather than creating another. The association to the company runs as a separate pass on the same key, so a replay cannot duplicate the link either.
What happens when the NetSuite concurrency limit is hit mid run?
NetSuite governs concurrent requests at the account level, so the allowance is shared with every other integration in the business. When we hit it the request is rejected rather than queued. The service backs off, retries with a longer wait, and records the run as incomplete so the next scheduled pass picks up from the last checkpoint.
Do we need a NetSuite sandbox before the build starts?
We strongly prefer one. A NetSuite sandbox is a separate account bought through your account manager and refreshed from production on request. Building against it means the first write to the live ledger happens during a rehearsed cutover rather than during development. Where no sandbox exists, we build read only first and gate writes behind an account allowlist.
Should NetSuite or HubSpot own the customer record?
NetSuite, in almost every engagement we scope. Finance has usually spent years cleaning that master and is right to be careful about a marketing tool writing into it. HubSpot owns the pipeline, the owner and the activity history. The one write back worth building early is a closed won deal creating or updating the customer.
How long does a NetSuite and HubSpot integration take to build?
Set aside 10 to 20 hours of discovery and 70 to 150 hours of build for four to six objects with watermarks, replay and reconciliation endpoints. Discovery is not padding. Most of it goes on agreeing the object list, the direction of each one and who is allowed to change the customer master.
Also in ERP and accounting
Related reading
Partnerships and accreditations
HubSpot accreditations
Industry specializations
Partnerships
Scope a NetSuite 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
- Setting Up Authentication docs.oracle.com
- Record Collection Filtering docs.oracle.com
- Concurrency Governance Limits Based on Service Tiers and SuiteCloud Plus Licenses docs.oracle.com
- Requesting a Sandbox Account for the First Time docs.oracle.com
- REST Web Services Supported Records docs.oracle.com
- SuiteScript 2.1 User Event Script Type docs.oracle.com