What this means for your store
HubSpot writes UTM properties on contacts - utm_source, utm_medium, utm_campaign, utm_content, utm_term - from the landing URL when tracking fires. For DTC and wholesale sites, these fields often beat Original source because they keep the exact string from Google Ads, Meta, or a partner newsletter. First-touch values stick even when the buyer returns Direct a week later to finish checkout.
Scenario on a real storefront
Meta prospecting sends traffic to ?utm_source=facebook&utm_medium=paid_social&utm_campaign=summer_outdoor_launch for a US camping gear store. The shopper reads two blog posts, abandons cart, clicks a recovery email, then orders. UTMs on the contact still show the paid social click:
# Paid landing URL
https://gear.example.com/collections/tents
?utm_source=facebook
&utm_medium=paid_social
&utm_campaign=summer_outdoor_launch
&utm_content=video_hook_a
# HubSpot contact (first-touch UTM properties)
utm_source = facebook
utm_medium = paid_social
utm_campaign = summer_outdoor_launch
utm_content = video_hook_a
# SPA / headless - hidden fields on HubSpot forms (UTMs strip on client nav)
<input type="hidden" name="utm_source" id="hs_utm_source" />
# Report: Marketing → Reports → Custom
# Filter utm_campaign = summer_outdoor_launch
# Break down by lifecycle stage and deal amount
What to do next
- Group a campaign report by
utm_campaignand closed-won revenue - not form fills alone. - On Shopify → HubSpot flows, pass UTMs through checkout redirects; otherwise the contact is created as Direct after payment.
- Run UTMs from a shared spreadsheet; one typo in
utm_mediumsplits a channel into a dozen fake sources.
Bottom line
Tag every paid and partner landing URL, back up UTMs on SPAs with hidden form fields, and report utm_campaign through to revenue - not just top-of-funnel leads.