HubSpot Shopify Integration: Synced Objects, Revenue Reporting, Setup and Design Decisions
HubSpot Shopify integration explained: what the native app syncs, why store orders stay out of deal reports, historical sync, B2B and multi-store limits.
Paul Maxwell, PhD
AUTHOR
GET WEEKLY REVOPS INSIGHTS
No spam. Unsubscribe anytime.
A store connects Shopify to HubSpot through the HubSpot Shopify integration, customers and orders arrive, and three problems can follow. The revenue attribution report shows none of the store's revenue, because it reads closed-won deals and the store's purchases arrived as orders. A reporting recipe copied from HubSpot's own documentation returns charts with no purchases in them, because it is built on an ecommerce deal pipeline that the current app never fills. A business that imported its order history by file before connecting finds those orders twice, because order sync does not deduplicate.
This article sets out what the native integration syncs and how to design around it. It starts with the object pairs and their matching rules, then the initial sync that carries history, then the difference between an order and a deal, worked through on a sample store. Carts, dashboards and the native app's limits follow, then costs, design decisions, a setup procedure ending in verification, symptoms, questions and the limits of the evidence.
Four terms carry the argument. The Shopify (Data Sync) app is HubSpot's native connector, built on its data sync engine. The order object records what was purchased and how it will be fulfilled; HubSpot describes it as the operational side of a purchase, not billing or revenue recognition. The cart object stores e-commerce carts, including abandoned carts from Shopify. A deal records a sales opportunity with a pipeline, a stage, an amount and a close date. Whether Shopify works with HubSpot is three questions: whether records arrive, which object they arrive as, and which reports read that object. The connection article answers the first two; only the reporting documentation answers the third.
Objects the HubSpot Shopify Integration Syncs
HubSpot's Shopify connection article lists five object pairs: customers, companies and products sync in both directions, while orders and abandoned checkouts sync one way into HubSpot. A separate article documents a one-way product variant sync, which writes each variant as its own HubSpot product.
| Shopify record | HubSpot destination and direction | Matching rule and documented limits |
|---|---|---|
| Shopify recordCustomers | HubSpot destination and directionContacts, both ways | Matching rule and documented limitsMatched on email; by default only customers with an email sync; a deletion in either system leaves the other record |
| Shopify recordCompanies | HubSpot destination and directionCompanies, both ways | Matching rule and documented limitsShopify Plus only; matched on name after capitals, special characters and punctuation are stripped |
| Shopify recordProducts | HubSpot destination and directionProducts, both ways | Matching rule and documented limitsMatched on product name, normalised the same way; deleting a Shopify product leaves the HubSpot product |
| Shopify recordProduct variants | HubSpot destination and directionProducts, Shopify to HubSpot | Matching rule and documented limitsMatched on SKU or not at all; requires product sync |
| Shopify recordOrders | HubSpot destination and directionOrders, Shopify to HubSpot | Matching rule and documented limitsLinked to a contact and a cart; read-only in HubSpot; not deduplicated; no contact where the customer has no email |
| Shopify recordAbandoned checkouts | HubSpot destination and directionCarts, Shopify to HubSpot | Matching rule and documented limitsNot deduplicated; seven fields removed and three added on 1 April 2025 |
| Shopify recordMetafields | HubSpot destination and directionNone | Matching rule and documented limitsNot supported by the Shopify Data Sync app |
Per the connection article, installation needs Super Admin or App Marketplace permissions and adds the HubSpot tracking code to the store. The base sync is listed for all plans, custom mappings need Data Hub Starter or above, and changes sync within ten minutes after the initial sync.
Historical Orders and the Initial Sync
History arrives through the initial sync, not a separate import: the engine indexes every existing record in both systems and passes each through the sync, and an incremental sync then handles changes. The data sync article states that syncs with millions of records may take several days, that saving the sync restarts the initial sync, and that HubSpot emails when it completes. The filter on the Limit screen sets how far back history reaches, and it acts once: a record that has synced keeps syncing whatever its later values.
Sequence is therefore the main design question for history. Order and cart sync do not merge duplicates, so orders imported by file before the connection sync again as new records, and connecting first avoids them. Contacts follow a different rule: the engine treats the first record returned with a given email as syncable and the next as a duplicate. Shopify holds one customer per email address within a store, so that rule matters only where two stores share a customer, a case covered under native limits below. Matching reads email alone, and the sync documentation describes no merge of records already in HubSpot, so existing duplicates survive the sync; the cleanup set out under HubSpot duplicate management belongs before it starts.
Orders, Deals and the Reports That Read Each
The connection article pairs Shopify orders with the order object, and its table contains no deal pair. That placement decides which reports can see store revenue, because HubSpot's reporting divides along the same line. The orders article draws the line itself: deals, quotes, payment links, payments, subscriptions and invoices are the objects it names as managing pricing, billing and revenue, and orders are not among them.
Revenue attribution reads deals only. A deal enters the report only when it sits in a closed-won stage, has at least one associated contact, and has known values in Amount, Create date and Close date (attribution reporting). The revenue counted is the deal's Amount. An order is not a deal, so no order reaches the report whatever its value; the wider coverage question is treated in HubSpot attribution reporting.
HubSpot's advanced eCommerce reporting article opens by instructing the reader to create an ecommerce pipeline on the deal object with five stages: Checkout pending, Checkout abandoned, Checkout completed, Shipped and Canceled. Its loyalty score, purchase history, shipping and abandoned-cart recipes read deals. The current Shopify app writes nothing to that pipeline, so for a natively connected store those recipes find no purchases until something else creates the deals; the loyalty score still counts page views and visits, and scores every customer as though no purchase had closed.
The Product history card is one surface that reads both objects. Order totals convert to the company currency at the rate configured for the order's created date, and where the order's currency is not configured the rate defaults to one (orders).
The finding is checkable against those documents: the native integration puts store revenue on the object HubSpot reserves for fulfilment, and every deal-based view, from revenue attribution to HubSpot's own ecommerce recipes, reports none of it. Accounts of the integration that place each order on a deal in an ecommerce pipeline describe a model the current connection article does not contain. The placement is reasonable, since a deal carries a sales process and a checkout has none; the defect arises when a deal report is read as the whole business.
Shopify Revenue in HubSpot Reports on Sample Data
The figures below are sample data, built so the arithmetic can be recomputed, and they describe no client. The sample business sells direct to consumers through one Shopify store at an average order value of $120, and runs a wholesale team that works deals in HubSpot.
| Revenue source | Records and value in the quarter | Eligible for revenue attribution |
|---|---|---|
| Revenue sourceShopify orders, customer has an email | Records and value in the quarter9,090 orders, $1,090,800 | Eligible for revenue attributionNone: orders are not deals |
| Revenue sourceShopify orders, customer has no email | Records and value in the quarter210 orders, $25,200 | Eligible for revenue attributionNone: orders are not deals |
| Revenue sourceWholesale deals, closed won, contact associated | Records and value in the quarter42 deals, $504,000 | Eligible for revenue attribution$504,000 |
| Revenue sourceAll sources | Records and value in the quarter$1,620,000 | Eligible for revenue attribution$504,000, or 31.1% |
The store's $1,116,000 is 68.9% of the quarter, and none of it is eligible. The alternative writes one deal per order through an order-based workflow, a type that requires Revenue Hub Professional or Enterprise, using the Create record action. The action creates each deal in a closed-won stage of a separate pipeline, copies the order total into Amount and sets Close date. The new deal is associated with the enrolled order by default, and the contact association is added in the action. The 210 orders without a contact still yield deals without a contact, which the report excludes, so eligible revenue becomes $504,000 + $1,090,800 = $1,594,800, or 98.4%.
That design adds 9,300 deals a quarter, so 9,300 of the quarter's 9,342 closed-won deals are checkout records, and every pipeline, forecast and win-rate view has to exclude their pipeline. Eligible is also narrower than attributed: an eligible deal is credited only to interactions HubSpot tracked for its contacts, which the sample does not model.
Contacts carry a second calculation. The sample store holds 24,000 customers, 1,800 without an email, so the default contact sync writes 22,200; 5,400 match existing contacts by email and 16,800 are created. Integrations create contacts as non-marketing by default, and only marketing contacts receive marketing email and count toward the Marketing Hub contact tier. Setting all 16,800 as marketing contacts adds 16,800 to the count that sets the tier.
Abandoned Carts, Ecommerce Dashboards and Contact Record Data
Abandoned checkouts become cart records, which can be segmented and associated with contacts and orders. The cart module puts a customer's abandoned items into an automated marketing email. It requires Marketing Hub Professional or Enterprise, works only in a cart-based workflow, is capped at 250,000 recipients an hour, and cannot be A/B tested. With variant sync on, the email shows the exact size or colour left in the cart. It reaches marketing contacts only, so a customer never set as marketing receives no cart email.
The Ecommerce dashboard is created from the Feature Discovery tab of the Shopify app in Connected Apps, as the connection article sets out. The Shopify Overview card shows total orders, average order value, product views and a sales graph on the contact record; portals connected after 1 November 2025 add it to the record layout themselves.
Native Limits: Wholesale Buyers, Multiple Stores and Custom Fields
In Shopify B2B the buyer is a company with its own locations and contacts, and catalogs, negotiated pricing and payment terms attach to a company location. HubSpot's company sync is available only on Shopify Plus, and companies match on normalised name, so two buyers trading under one name become one HubSpot company. The object table has no pair for company locations, catalogs or payment terms, so negotiated wholesale business runs better as deals worked in HubSpot, with the handoffs described in quote to cash.
Further stores connect through Account actions, then Manage accounts, on the Shopify app page. Cross-store matching is not documented, but the documented rules imply that a customer of two stores becomes one contact, and that products sold under one name in two stores converge on one HubSpot product, whatever each store charges. The Orders API defines a source store property, hs_source_store. The connection article does not say whether the sync fills it, so a synced order from each store has to be read before any store-level report is built.
Custom mappings need Data Hub Starter, Professional or Enterprise, and metafields are not supported at all. Per the field mappings article, fields holding several labelled values, such as phones and addresses, cannot map to custom properties. Dropdown options are copied once, so a new option reaches HubSpot only when the sync is saved and restarted.
Costs and Returns of the Native App
The app costs nothing to install: the Shopify listing shows a free plan, and HubSpot lists the integration for all products and plans. The costs sit around it: Data Hub Starter for custom mappings, Marketing Hub Professional for cart emails, Revenue Hub Professional for a deal-per-order workflow, Marketing Hub Enterprise for revenue attribution, and the contact tier for every customer set as marketing. Beyond licences, the native app fixes the data model, keeps orders read-only in HubSpot, and splits reporting across two objects.
It returns purchase history on the contact record, order and cart segments, and cart emails with variant detail, with no code to maintain. HubSpot adapts the connector to Shopify's API changes, as the April 2025 cart field change shows, and the sync health view reports failing and excluded records.
The case is strongest for one direct-to-consumer store whose customers are known by email, whose marketing runs in HubSpot, and whose revenue is read from Shopify or from order reports. It is weakest for wholesale-heavy businesses outside Shopify Plus, for several stores sharing product names, for data held in metafields, and for a board that expects store revenue in deal-based attribution.
Shopify and HubSpot Integration Design Decisions
The revenue object comes first, and the default is to leave orders as orders, reserving deals for work a person manages, such as a wholesale enquiry. A deal per order earns its cost only where revenue attribution over store revenue is a stated requirement and the portal holds Revenue Hub Professional and Marketing Hub Enterprise. Those deals then sit in their own pipeline, excluded from forecasts.
Contact direction and scope come second. Data sync offers three directions per object. A two-way contact sync writes new and updated HubSpot contacts into Shopify as customers, so a portal holding wholesale prospects syncs contacts one way or filters the HubSpot side. Only sync contacts with an email address is on by default, and keeping it on reduces duplicate contacts, as the connection article advises. An order from a customer created without an email arrives without a contact whatever the setting.
Marketing status comes third, set by segment because each marketing contact counts toward the tier. Variant matching comes fourth: Match on SKU where products already exist in HubSpot, and Do no matching when they sync for the first time.
The last decision is whether the native app suffices. The firm writing this article is a HubSpot Solutions Partner that builds custom commerce integrations, which is an interest in how the two routes compare. The native app wins on cost, on maintenance through Shopify's API changes, on sync health tooling and on cart module compatibility. A custom integration on the Orders API wins where metafields must reach HubSpot, where deals must carry an order's own line items, or where orders need a reliable store identifier; the design questions either route raises are treated in HubSpot integration architecture.
Setup and Verification Procedure
- Record a baseline in Shopify: customers with and without an email, products and variants, and orders by month and currency within the history filter. In HubSpot, count orders and carts already imported by file.
- Confirm Super Admin or App Marketplace permissions, Data Hub Starter if any custom mapping is planned, and an exchange rate in HubSpot for every currency the store sells in.
- Delete or exclude orders and carts imported by file, since the sync will not merge them.
- Click the Marketplace icon, select HubSpot Marketplace, search for Shopify, click Install, enter the store's Shopify URL and click Install app.
- In Settings, open Integrations, Connected Apps, Shopify, and on the CRM syncs tab click Set up your sync. Sync contacts first, with direction, email setting and history filter decided in advance.
- Sync products, then add variants through Sync more data, with the matching choice above.
- Sync orders, then carts, and wait for the email confirming the initial sync.
- Add the Shopify Overview card if needed, create the Ecommerce dashboard, and set marketing status by segment.
- Verify against the baseline on the CRM syncs tab, in Object view. With contacts syncing one way into HubSpot, excluded contacts should equal Shopify customers without an email plus any outside the filter; a two-way sync also excludes HubSpot contacts without an email. HubSpot orders should equal Shopify orders inside the filter, with orders lacking a contact equal to orders whose customer has no email. For one closed month, orders placed in the company currency should total exactly what Shopify reports; foreign-currency orders should differ only by the gap between HubSpot's configured rates and Shopify's. Then compare five orders' line items with Shopify field by field. Any difference the documented rules do not explain is a setup defect.
Sync Symptoms and Their Causes
Revenue attribution shows no store revenue. The purchases are orders and the report reads closed-won deals, so the fix is the revenue object decision, not a report setting.
Charts built from the advanced eCommerce recipes show no purchases. The recipes read a deal pipeline the native app does not populate, so they are rebuilt on orders or fed by a process that writes deals.
Orders appear twice after order sync starts. They were imported by file before the connection, and order sync does not deduplicate, so the imported copies are deleted.
Orders arrive without a contact. The Shopify customer had no email, the only contact matching key the sync uses.
Foreign-currency order totals differ from Shopify's converted figures by a factor close to the exchange rate itself. The currency has no exchange rate in HubSpot, so the rate defaulted to one and each total was counted unconverted; configuring the rate corrects the conversion.
Frequently Asked Questions
Is Shopify a HubSpot supported integration? HubSpot builds and documents the connector, and the Shopify App Store lists it under the developer name HubSpot (Data Sync), launched on 10 October 2023.
Is the HubSpot CRM Shopify integration free? The app installs at no charge and the base sync is listed for all HubSpot plans; the paid subscriptions around it are named under costs.
Does the Shopify HubSpot integration create deals? Orders sync to the order object and abandoned checkouts to the cart object, and no deal is created unless an order-based workflow or a custom integration writes one.
Does the HubSpot integration with Shopify import historical orders? The initial sync passes every existing Shopify order that meets the sync filter into HubSpot, so the filter sets how far back history goes.
Can a HubSpot and Shopify integration connect more than one store? Additional stores connect through Manage accounts; cross-store matching of customers and products needs testing before store-level reporting.
Does a Shopify integration with HubSpot sync metafields? Metafields are not supported by the native app, and custom field mappings need Data Hub Starter or above.
What does a Shopify and HubSpot integration need for wholesale buyers? Company sync requires Shopify Plus and matches on normalised name, and B2B company locations, catalogs and payment terms have no documented pair.
Evidence Limits and Documentation Date
This article covers the native Shopify (Data Sync) app, not third-party connectors or Shopify POS. Product facts are as documented in September 2026; the connection article showed a last update of 22 June 2026 and is the document to recheck before a design is fixed.
The documentation conflicts twice. The connection article says product variants cannot sync, while the variant article of 8 June 2026 documents a one-way variant sync. The portal settles it, since the sync exists wherever Sync more data offers Product Variants. The cart email article requires a cart-based workflow, while the workflow object types article lists no cart type, so the cart workflow's tier gate is documented only through the email article.
Three further limits apply. Cross-store matching is inferred from documented rules, not documented directly. The Shopify listing showed a 1.0 rating from eight reviews on 27 September 2026, too few to support any statement about reliability. The sample business is invented to make the arithmetic checkable, and no frequency of any symptom above has been measured.
In Summary
The HubSpot Shopify integration syncs customers, companies and products both ways, and orders, abandoned checkouts and variants one way into HubSpot. Customers match on email, products and companies on normalised names, and metafields do not sync. History arrives through the initial sync, bounded by a filter set before the first save, and because order sync does not deduplicate, the connection precedes any file import.
Store purchases arrive as orders, while revenue attribution and HubSpot's ecommerce recipes read deals. In the sample quarter that left $1,116,000 of $1,620,000 outside revenue attribution; a deal-per-order workflow would bring $1,090,800 back at the price of 9,300 checkout records a quarter in the deal pipeline. Orders left as orders remain the right default for checkout volume, provided each deal-based report states that it excludes the store, and store revenue is read from order reports reconciled to Shopify month by month.