HubSpot shows Offline Sources for my contacts. Why, and how do I fix it?
By Motabar Javaid · · 5 min read
Short answer: HubSpot sets a contact's Original Source to Offline Sources when it didn't see that person arrive through a tracked visit to your website. The usual reasons are contacts created by import, by hand, through an integration, or through a form that isn't a HubSpot form and doesn't pass along the HubSpot tracking cookie. For web leads, the fix is making sure every form submission includes the hubspotutk cookie, the page URL and your UTM values.
If your HubSpot source report shows a big slice of "Offline Sources", that's a problem for anyone trying to decide where to spend the marketing budget. Those leads came from somewhere. HubSpot just can't tell you where.
The good news is that this one is usually very fixable, at least for new leads.
How HubSpot decides a contact's source
HubSpot's tracking code sets a cookie called hubspotutk in the visitor's browser. Every page view gets logged against that cookie, along with where the visitor came from.
When that visitor submits a form, HubSpot connects the cookie to the new contact record. It looks back at the first visit and sets Original Source from it: Organic Search, Paid Search, Social Media, Email Marketing and so on.
If there's no cookie to connect, there's no visit history, so HubSpot falls back to Offline Sources.
Find out where your offline contacts come from
Before fixing anything, check the property Original Source Drill-Down 1 on your offline contacts. It tells you how the record was created. You'll typically see values like:
- IMPORT: uploaded from a spreadsheet
- CRM_UI: created by hand by someone on your team
- INTEGRATION or API: created by another tool or a custom integration
Build a quick report or a contact list filtered to Original Source is Offline Sources, broken down by Drill-Down 1. That tells you which of the fixes below matter for you.
Imports and manually created contacts being offline is expected. The ones to worry about are leads that came through your website but still show up as offline.
The common causes for web leads
1. Forms that aren't HubSpot forms
Website builders, WordPress form plugins, Typeform, Webflow forms and custom forms don't know about the HubSpot cookie unless someone makes them send it. If the form pushes the contact into HubSpot through an integration or the API, the contact gets created without any visit history.
2. Forms API submissions without the hutk
The HubSpot Forms API accepts a context object with the visitor's hutk (the value of the hubspotutk cookie), the page URL and the page name. Plenty of custom integrations leave it out. The submission still works, the contact is still created, but the source is lost.
3. The tracking code isn't on every page
If the HubSpot tracking code is missing from the landing pages people arrive on, HubSpot never sees the first visit. Check that it's installed sitewide, including landing pages built in other tools.
4. Cookie consent blocks the tracking code
If your cookie banner holds back the HubSpot script until a visitor accepts, and they never accept, the cookie never gets set. That's correct behaviour from a privacy point of view, but it means some share of contacts will always lack a source unless you also capture UTMs in the form itself.
5. Middleware that doesn't map the fields
Zapier, Make and other connectors often create contacts with just name and email. Even if your form captured UTMs in hidden fields, they won't reach HubSpot unless they're mapped to properties in the automation.
How to fix it
- Use HubSpot forms where you can. They handle the cookie automatically.
- For other forms, send the
hutkwith the submission. If you post to the Forms API, read thehubspotutkcookie in the browser and include it incontext.hutk, along withpageUriandpageName. - Capture UTMs in hidden fields as a backup. Store
utm_source,utm_medium,utm_campaign,utm_term,utm_content, and click IDs likegclidandfbclidin custom contact properties. Keep the values from the first page of the visit, because UTMs disappear from the URL once someone clicks to another page. - Don't let later submissions overwrite the first touch. Use separate "first" and "latest" properties, or a workflow that only copies values into the first touch fields when they're empty.
- Map every field in your integrations. If a tool sits between your form and HubSpot, make sure each hidden field reaches its HubSpot property.
- Check the tracking code and consent setup on every template, and test a real submission from a tagged link.
What about the contacts that are already offline?
You can't rebuild a source HubSpot never saw. But you can often recover part of it:
- If your forms captured UTMs in hidden fields, you can report on those fields directly.
- If you send GA4 or ad platform data to a warehouse like BigQuery, you can sometimes match leads to campaigns by email, form submission time or click ID.
- For imported lists, add a custom "lead source" property during import, such as "Webinar list, March" or "Trade show", so they're at least grouped meaningfully.
Joining HubSpot and campaign data in BigQuery is exactly how I've helped teams tell high intent paid leads apart from cold ones. The HubSpot and BigQuery sales attribution case study shows how that worked for one SaaS team, and my marketing analytics service covers the details.
Test it end to end
Once you've made changes:
- Open a private browser window.
- Visit your site using a link with test UTMs, like
?utm_source=test&utm_medium=test&utm_campaign=offline-fix. - Browse to a second page, then submit your form.
- Find the new contact in HubSpot and check Original Source, Drill-Down 1 and your UTM properties.
If the contact shows the right source and your UTM fields are filled in, you're done. If not, the step that broke tells you which fix to look at.
Frequently asked questions
Why are my HubSpot contacts showing Offline Sources?
Because HubSpot didn't see them arrive through a tracked website visit. Imports, manual entry, integrations and non HubSpot forms that don't send the HubSpot tracking cookie all lead to Offline Sources.
Can I change a contact's Original Source in HubSpot?
Original Source is set by HubSpot from its own tracking, so the better approach is to capture first touch UTM values in your own custom properties and report on those alongside it.
Do I need UTM hidden fields if I already use HubSpot forms?
It's still a good idea. HubSpot forms keep the source when the cookie is present, but visitors who decline cookies won't have one. Hidden UTM fields give you a backup that doesn't depend on the cookie.