Shopify + HubSpot Integration
Customers, orders, and abandoned carts flow from Shopify into HubSpot as contacts, deals, and line items. Lifecycle stage and list membership can flow back as customer tags. Shopify stays the commerce record; HubSpot owns the conversation.
- mode:
- Bidirectional (configurable)
- latency:
- Near real-time
- maturity:
- Production-tested
what syncs
What syncs, which way, and how fast
Every row is a real data flow with a real trigger. The frequency column is what you should expect in production, not a best case.
Customers
- dir:
- Shopify → HubSpot
- frequency:
- Near real-time
Email is the dedupe key. Guest checkouts create contacts too, which is the usual cause of a sudden contact-tier overage in month one.
Orders
- dir:
- Shopify → HubSpot
- frequency:
- Near real-time
Becomes a deal in a dedicated e-commerce pipeline with line items attached. Keep it out of your sales pipeline or forecasts become fiction.
Products
- dir:
- Shopify → HubSpot
- frequency:
- Hourly
Populates the HubSpot product library so deal line items carry real SKUs and revenue reporting by product works.
Abandoned carts
- dir:
- Shopify → HubSpot
- frequency:
- Near real-time
The commercial reason most brands connect these systems. Fires the recovery workflow with the actual cart contents.
Lifecycle / tags
- dir:
- HubSpot → Shopify
- frequency:
- Every 15 min
Writes back as customer tags or metafields for segment-based merchandising. Needs Operations Hub or a custom worker.
Fulfillment status
- dir:
- Shopify → HubSpot
- frequency:
- Near real-time
Custom property on the deal so Service Hub agents answer "where is my order" without opening Shopify admin.
architecture
How it actually works
The native app covers a real amount of ground. The honest architecture question is not how to build everything from scratch, but exactly where the native app stops and a custom worker has to start.
HubSpot native Shopify app
Handles standard customer, order, product, and abandoned-cart sync. Free with any paid HubSpot tier. Start here always: building this yourself is wasted money.
Private app for custom objects
Where the native app runs out. A HubSpot private app with scoped tokens writes the custom properties it will not map, such as subscription state or B2B company tier.
Shopify webhooks + queue
For anything beyond the native scope. Queued rather than direct so a HubSpot 429 does not lose the event.
HubSpot Workflows
The automation layer: cart recovery, post-purchase sequences, win-back. Deliberately in HubSpot, not in code, so marketing can edit without a deploy.
Reverse sync worker
Polls HubSpot lists and writes Shopify customer tags. Only built when segment-driven merchandising is actually needed.
failure modes
What breaks, and what happens when it does
Every integration fails eventually. The difference between a good one and a bad one is whether it fails safely and tells you.
Contact tier overage from guest checkouts
The HubSpot bill jumps a tier a month after connecting, with no new marketing activity.
handling
Every guest checkout becomes a marketing contact by default. We set non-marketing contact defaults and filter one-time guest buyers at the sync boundary, so you pay for an audience you can actually mail.
Deals polluting the sales pipeline
Forecasts break because 4,000 web orders sit alongside twelve real B2B opportunities.
handling
E-commerce orders go to a separate pipeline with their own stages, excluded from forecasting. Obvious in hindsight, routinely missed in default installs.
HubSpot API rate limits during backfill
A historical import runs for days, or dies partway with half the orders present.
handling
Backfills use the batch endpoints with concurrency capped under the tier limit, checkpointed by cursor. Historical import runs as a separate one-off job so it never competes with live sync.
Duplicate contacts from email variants
One customer appears three times and each copy has part of the order history.
handling
Emails are normalised before upsert and matched on the HubSpot contact id where one exists. Merge candidates are queued for review rather than auto-merged, because a wrong merge is much harder to undo than a duplicate.
Custom property mapping needs a higher tier
A field that has to sync turns out to need Operations Hub Professional.
handling
We check field-level requirements against your tier during the audit and tell you the licence cost before build. If the tier upgrade is not worth it, the private app writes those properties directly instead.
field mapping
A real slice of the mapping
This is an abridged Order → HubSpot Deal mapping, shown so you can sanity-check it against your own system.
Order → HubSpot Deal
shopify → hubspot
order.namedeal.dealnamePrefixed for scanability
order.total_pricedeal.amountorder.created_atdeal.closedatefinancial_statusdeal.dealstageMapped, not copied
line_item.skuline_item.hs_skucustomer.emailcontact.emailDedupe key
fulfillment.tracking_numberdeal.tracking_numberCustom property
The native app covers most of this. Custom properties and the reverse write-back are where scope and licence tier get decided.
implementation
Timeline and cost
typical duration
2 to 5 weeks
included in scope
- Native app install and full field mapping
- Separate e-commerce pipeline and lifecycle model
- Abandoned cart and post-purchase workflows
- Contact tier protection and guest-checkout filtering
- Reporting dashboards for revenue and campaign attribution
- Team training session and documentation
what moves it up
- Historical order and customer backfill
- Reverse sync of segments into Shopify tags
- B2B company-level association and tiering
- Subscription or membership state sync
- Service Hub ticket and order-context build-out
questions
Questions buyers actually ask
Is the native HubSpot Shopify integration good enough on its own?
For a lot of brands, yes. The native app syncs customers, orders, products, and abandoned carts with no code, and it is free with any paid HubSpot tier. You need custom work when you have to write data back to Shopify, sync a custom object such as subscription state, or backfill years of order history. Install the native app first and only pay for the gap.
Why did our HubSpot bill increase after connecting Shopify?
Because every guest checkout became a marketing contact. HubSpot prices on marketing contacts, so a store doing a few thousand orders a month can cross a tier within weeks. The fix is to default synced buyers to non-marketing and only promote them when they opt in. Set this before the first sync rather than after the invoice.
Can data flow from HubSpot back into Shopify?
Yes, but it is not part of the native app. Lifecycle stage, list membership, and lead score can be written to Shopify customer tags or metafields, which is what makes segment-based merchandising possible. It requires Operations Hub Professional or a small private app, and it is the most common reason a HubSpot project needs custom development.
Should Shopify orders become deals or custom objects?
Deals in a dedicated e-commerce pipeline for most brands, because deals get native revenue reporting and workflow support. Use custom objects when order volume is high enough that deal records become unwieldy or when your sales team needs the deal object kept clean. Either way, keep web orders out of the pipeline you forecast from.
How long does a historical import take?
Plan for days, not hours, on any store with real history. HubSpot batch limits mean a few hundred thousand orders is a multi-day job, so we run it as a separate checkpointed backfill alongside live sync. If you only need recent context, importing the last 24 months is usually cheaper and just as useful.
Do we need Shopify Plus for this integration?
No. The HubSpot integration works on any Shopify plan. Plus only matters if you also need the B2B objects, such as company-level associations for wholesale buyers. That is a separate requirement from the CRM sync itself.
shopify + hubspot
Find out if you need custom work at all
Tell us what you need HubSpot to do. If the native app covers it, we will say so. If it does not, you get a scope and a fixed price.