← All PostsBlog

Why Your Shopify Orders Show 'Offline Sources' in HubSpot (And How to Fix It)

By Tom Johnson · February 6, 2026
shopifyhubspotattributionutm-trackingmarketing-ops

You did everything right. You connected Shopify to HubSpot, installed the tracking pixel, and set up your attribution reports.

Then you opened those reports and every single Shopify customer showed up as "Offline Sources > Integration." Not Paid Social. Not Paid Search. Not the Facebook campaign you spent $8,000 on last month.

Just… Offline.

If you're an agency, this is the moment your client asks "so what are we actually getting for our ad spend?" and you realize you don't have a real answer. If you're an in-house marketer, it's the moment you realize the $800/month you're paying for HubSpot Marketing Hub isn't giving you the attribution data you bought it for.

Here's the thing: your reports aren't broken. They're working exactly as designed. The problem is that HubSpot never received the data they need in the first place.

Let me walk you through what's actually happening, and then I'll show you how to fix it.


What You're Paying For (That Isn't Working Right Now)

If you're on HubSpot Marketing Hub Professional or Enterprise, you have access to some genuinely powerful attribution reports. They're supposed to answer the questions that keep marketers up at night:

Which ad campaigns are actually driving Shopify revenue? What's the real cost per acquisition from Facebook versus Google? Which channels produce the highest-value customers? Where should you be putting more budget?

HubSpot has the reports built to answer all of this. Contact Create Attribution, Revenue Attribution, Traffic Analytics, custom reports by UTM source and campaign. These tools are a big part of why Marketing Hub costs what it costs.

But with Shopify as your storefront, every single one of those reports says the same thing: "Offline Sources" or "Direct Traffic." You're paying for attribution you can't actually use.


Why This Happens

When someone clicks your Facebook ad and lands on your Shopify store, everything starts out fine. The URL carries UTM parameters (utm_source=facebook, utm_medium=paid, utm_campaign=spring_sale). HubSpot's tracking pixel drops a cookie and records their browsing behavior. All the data HubSpot needs for attribution is right there in the browser.

Then the customer checks out. And the data vanishes.

Here's the problem. When a customer completes a purchase, Shopify's native HubSpot integration creates the contact in a way that can't carry UTM parameters or attribution data. It sends over the name, email, and order details — but nothing about where that customer came from.

As far as HubSpot is concerned, this contact just appeared out of nowhere. So it stamps them with the only label it can: "Offline Sources > Integration."

The UTM data was there. The tracking cookie was there. The browsing history was there. The native sync simply can't pass any of it to HubSpot.


The Moment Attribution Breaks

Here's how the data flows — and where it falls apart:

Step 1: Customer clicks your ad. They land on your Shopify store with UTM parameters in the URL — the data that tells HubSpot this visitor came from your campaign.

Step 2: Customer browses and adds to cart. HubSpot's tracking pixel records page views and creates a tracking cookie. UTM data is still in the browser. Everything is intact.

Step 3: Customer enters email at checkout. Shopify captures the email. The UTMs, the cookie, the browsing history — all still present. This is the last moment where correct attribution is possible.

Step 4: The native sync creates the contact in HubSpot. The native integration fires and creates the contact, but it can't pass UTM data or connect the browsing session to the new contact record. It sends the name and email — nothing else. Attribution is lost.

Step 5: HubSpot stamps "Offline Sources" — permanently. HubSpot sets Original Source to "Offline Sources" with drill-down "Integration." This property never updates once set. No workflow, no manual edit can change it.

The result: Every Shopify customer shows the same label. Your attribution reports can't tell you which ads, campaigns, or channels drove revenue.


What your HubSpot reports look like right now

ReportWhat You See
Traffic AnalyticsDirect Traffic — $47,200
Contact AttributionOffline Sources — 312 contacts
Revenue AttributionUnknown — $47,200
Campaign Performance(empty)

April 2025: It Got Worse

Shopify removed the landing_site and referring_site fields from their cart API. The minimal referral data that was syncing is now gone entirely.

📱
Step 1
Customer clicks your Facebook ad
They land on your Shopify store with UTM parameters in the URL — the data that tells HubSpot this visitor came from your ad.
✓ utm_source=facebook&utm_medium=paid&utm_campaign=spring_sale
🛒
Step 2
Customer browses and adds to cart
HubSpot's tracking pixel records page views and creates a tracking cookie. UTM data is still in the browser.
✓ UTMs + HubSpot cookie + browsing history
✉️
Step 3
Customer enters email at checkout
Shopify captures the email. The UTMs, the cookie, the browsing history — all still present. This is the last moment where correct attribution is possible.
✓ Email + UTMs + cookie — all present
💀
Step 4 — The Break
Shopify's native sync creates the contact in HubSpot
The native integration fires and creates the contact using a server-side API that cannot pass UTM data or the tracking cookie. It sends the name and email — nothing else.
✕ UTMs dropped. Cookie dropped. Attribution lost.
// What the native Shopify sync sends: POST /crm/v3/objects/contacts { "email": "customer@example.com", "firstname": "Jane", "lastname": "Smith" // No UTMs. No cookie. No attribution. }
🔒
Step 5 — Locked Forever
HubSpot stamps "Offline Sources > Integration"
HubSpot sets Original Source to "Offline Sources" with drill-down "Integration." This property never updates once set. No workflow, no manual edit, no API call can change it.
✕ Original Source: Offline Sources → Integration (permanent)
📊
The Result
Your attribution reports can't tell you anything
Every Shopify customer shows the same useless label. You can't tell which ads, campaigns, or channels are driving revenue.
📉

What your HubSpot reports look like

ReportWhat you see
Traffic AnalyticsDirect Traffic — $47,200
Contact AttributionOffline Sources — 312 contacts
Revenue AttributionUnknown — $47,200
Campaign Performance(empty)

The Root Cause: Two APIs, Two Outcomes

CRM Objects API

What Shopify's native sync uses

✕ Cannot pass tracking cookie
✕ Cannot pass UTM parameters
✕ Cannot attach browsing history
✕ Contact created as "Offline"

Forms API

What HubSpot's own forms use

✓ Accepts tracking cookie
✓ Passes UTM parameters
✓ Links browsing history to contact
✓ Sets correct Original Source
⚠️

April 2025: It Got Worse

Shopify removed the landing_site and referring_site fields from their cart API. The minimal referral data that was syncing is now gone entirely.


Why You Can't Fix It Later

This is the part that really stings. You might be thinking, "Okay, the Original Source is wrong. I'll just update it with a workflow."

You can't. HubSpot's Original Source property is locked the moment it's set. The first value it receives is the value it keeps forever. Once the Shopify integration creates a contact and stamps it as "Offline Sources," no workflow, no manual edit, and no automation will ever change it to "Paid Social."

HubSpot did this on purpose. Original Source is meant to capture the true first touch. The problem is that the Shopify integration is recording a first touch that never actually happened.


What This Is Actually Costing You

This isn't just a reporting annoyance. When your attribution data is wrong, your decisions are wrong.

You've seen the reports. Direct Traffic: $47,200. Offline Sources: 312 contacts. Revenue Attribution: Unknown. Campaign Performance: empty. You spent $12,000 on Facebook and Google ads last month. Those ads drove traffic, those visitors bought products, and Shopify's own analytics can confirm it. But HubSpot attributes $0 to paid campaigns and $47,200 to "Unknown." As far as your CRM knows, your marketing didn't do anything.

For agencies, this becomes a client retention problem fast. When you can't show a client which campaigns actually drove revenue, you're asking them to take your word for it. That works right up until someone questions the invoice.

For in-house teams, it's a budget problem. You know your ads are working because you can see conversions in your ad platforms. But the system your leadership team uses for decision-making says otherwise. And when budget season comes around, "trust me, the ads are working" isn't going to save your line items.


How UTM Bridge Fixes It

UTM Bridge solves this by getting the correct attribution data into HubSpot before the native Shopify sync has a chance to create the contact with the wrong source.

When a visitor lands on your Shopify store, UTM Bridge captures the UTM parameters and holds onto them throughout their browsing session — even if they come back days later. When that visitor places an order, UTM Bridge sends the attribution data to HubSpot so the contact is created with the correct Original Source. When Shopify's native sync runs afterward, it finds the contact already exists, adds the order data, and moves on without touching the attribution.

The contact gets the right source. Your reports get the right data. Nothing else changes.


Want to see what your attribution reports look like with real data?

Start your free trial. No credit card required. Setup takes about 10 minutes.

Start Free Trial →


What Your Reports Look Like After

Once attribution data is flowing correctly, the HubSpot reports you're already paying for start working the way they were designed to.

ReportWhat You See
Traffic AnalyticsPaid Social: $28,400 / Paid Search: $12,300 / Email: $6,500
Contact AttributionFacebook Spring Sale: 187 contacts / Google Brand: 89 contacts
Revenue AttributionSpring Sale Campaign: $28,400 / Brand Search: $12,300
Campaign PerformanceFull breakdown by source, medium, and campaign

Same dashboards. Same report templates. The only difference is that the data behind them is correct instead of "Unknown."

What this means in practice

If you're an agency, you walk into a client meeting with a HubSpot dashboard showing exactly which campaigns drove which Shopify sales. "Your Facebook Spring Sale campaign generated $28,400 in revenue from 187 new customers at a $21 CPA." That's a completely different conversation than "we think the ads are working."

If you're running marketing in-house, you can finally make budget decisions based on data. "Paid Social drives 3x the revenue per dollar compared to Paid Search. Let's shift $5,000/month and see what happens." Your CMO sees the numbers in HubSpot and signs off.

If you're in RevOps, your CRM data is clean for the first time. Contacts have correct attribution. Workflows can trigger based on actual traffic source. Lead scoring can weight contacts by acquisition channel. Everything downstream works better because the upstream data is finally correct.

Reports you can build right away

Once correct attribution is flowing, you can create reports in HubSpot like:

  • Revenue by channel: how much Shopify revenue came from Paid Social versus Organic versus Email
  • Campaign ROI: compare your ad spend to the revenue HubSpot actually attributes to each campaign
  • Customer acquisition cost by source: which channels deliver the cheapest customers
  • Time to purchase by source: do Facebook visitors buy faster than Google visitors?
  • Lifetime value by original source: which acquisition channels produce customers who spend the most over time

These templates already exist in HubSpot. They just need correct data to populate them. That's what UTM Bridge provides.


How It Works With Your Existing Setup

UTM Bridge works alongside HubSpot's native Shopify integration, not instead of it.

The native integration continues to do what it does well. It syncs customer records, order data, and product information. It keeps your CRM up to date with what's happening in Shopify. None of that changes.

UTM Bridge solves the one thing the native sync can't: getting attribution data into HubSpot correctly. Think of it as a complement. The native sync handles the "what" (who bought what, when, for how much). UTM Bridge handles the "where from" (which ad, campaign, or channel drove the sale).

What stays the same: Shopify's native sync continues to push orders, products, and customer data to HubSpot. Your existing workflows, deal pipelines, and automation keep working exactly as they do now. No changes to your Shopify theme or checkout flow.

What changes: New contacts get created with the correct Original Source (Paid Social, Paid Search, Email, and so on instead of Offline Sources). Your attribution reports start showing campaign data.

Setup takes about 10 minutes. Install the app, connect your HubSpot portal, and attribution starts flowing on the next order.


Common Questions

Does this work with the native Shopify-HubSpot integration? Yes. UTM Bridge works alongside the native integration. Shopify's sync keeps handling orders and customer data like it always has. UTM Bridge just makes sure the attribution is correct.

What if the contact already exists in HubSpot? If a contact already has an Original Source set, HubSpot won't overwrite it (that's by design). UTM Bridge also updates the Latest Source fields, so you'll always have the most recent attribution data available for reporting and workflows, even for returning customers.

What happens when I install UTM Bridge on a store that already has the Shopify-HubSpot sync running? UTM Bridge only affects new contacts going forward. Any contacts that were already created by the native Shopify sync will keep their existing Original Source (likely "Offline Sources"). UTM Bridge can't retroactively fix those because HubSpot's Original Source is permanent once set. However, even existing contacts will get updated Latest Source data on their next order. For new contacts from the moment UTM Bridge is installed, attribution will be correct from the start.

Do I need HubSpot Marketing Hub Pro? UTM Bridge works on all HubSpot plans. Basic attribution reporting is available on Starter. The custom reports and multi-touch attribution models that make this data really powerful require Professional or Enterprise.

What about the HubSpot tracking pixel? Isn't that enough? The tracking pixel records page views and creates a cookie, but it doesn't create contacts or connect browsing history to a contact record on its own. The native Shopify integration doesn't bridge that gap, and that's the core of the problem UTM Bridge solves.

What about other attribution tools? Most attribution tools rely on form submissions on your website to capture UTM data. The problem is that Shopify's checkout doesn't use HubSpot forms — it uses Shopify's own checkout system. So form-based attribution tools never have access to the checkout step where contacts are actually created. UTM Bridge takes a different approach that works within Shopify's checkout flow.