How to Set Up UTM Attribution Properly in Your CRM
In this episode of The Revenue Room, we walk through how to properly set up UTM attribution inside your CRM. It’s one of the most overlooked pieces of marketing infrastructure, and one of the first things we audit when we start working with a new business.
Most companies rely on the default attribution that GA4 and their CRM provide out of the box. It’s not necessarily wrong, but it’s rarely set up in a way you can fully trust when it’s time to make real decisions. Channels get mis-assigned, direct traffic balloons, last-touch dominates the story, and the data ends up patchy enough that nobody quite believes the dashboards they’re reporting on.
In this episode, we cover:
Why default GA4 and HubSpot attribution isn’t enough on its own
How to build a UTM framework with a single source of truth across your team
The hidden form field setup that captures UTMs against every CRM contact
Why your tracking code needs an expiry timer, and what goes wrong if it doesn’t
How to segment UTMs into first touch, last touch, and conversion touch buckets
Why first-touch UTMs should be locked and never overwritten
How to use self-reported attribution as a free-text layer to enrich your data
Why direct traffic is often misleading and what’s really happening underneath it
How to backfill historical CRM data so your dashboards aren’t patchy
Why UTMs should be set at the account level, never the ad level, with dynamic campaign tags
If you’re scaling paid media, running multi-channel campaigns, or trying to prove marketing’s contribution to revenue, this episode will help you build attribution infrastructure you can genuinely trust.

Transcript
The Revenue Room – Episode 020 Highlights
Host: Harry Hughes
Topic: A step-by-step walkthrough of setting up UTM attribution in your CRM: the framework, hidden form fields, the capture script, first, last and conversion touch, self-reported attribution, dashboards and backfilling.
Why the Defaults Aren’t Enough
GA4 and CRMs such as HubSpot assign sources automatically (HubSpot calls it original source). Harry’s view is that they aren’t wrong, but they can be made far more trustworthy. A proper UTM setup is one of the first things he audits, and one of the first things he builds, with a new client.
Step 1: Build a UTM Framework with One Owner
Keep a simple spreadsheet that generates every link from agreed campaign, source and term values
Give it a single owner
Without that, one person uses “Facebook paid”, another “paid Facebook” and a third “paid social”, and your reporting splits three ways
Step 2: Add Hidden Fields to Every Form
Audit the site for every place someone can submit details: demo requests, white papers, newsletter and webinar sign-ups, contact forms
Add the five UTM parameters as hidden fields on each one
Step 3: The Capture Script
A short script stores a visitor’s UTMs in cookies or local storage and injects them into the form on submission. Three things matter:
Set an expiry, for example 30 minutes. Otherwise someone who first arrived from a Facebook ad and converts a week later through Google is recorded as Facebook
If there are no UTMs, fall back to the referring URL, which helps identify organic search and direct
If nothing can be captured, record “not provided”, so you can tell missing data from blank fields
Step 4: First, Last and Conversion Touch
This is where most companies fall short. The sorting happens in CRM workflows, not in the form. You don’t need separate hidden fields for first and last.
First touch: filled the first time a contact enters the CRM, then locked and never overwritten
Last touch: overwritten each time the contact takes a new action
Conversion touch (optional): only filled by the action that creates an opportunity, such as booking a demo. Useful when there are many ways to enter the CRM
Add a workflow that copies the UTMs from the contact to the deal, so you can report on deal sources as well.
Step 5: Build the Dashboard
A simple version puts first touch on the left and last touch on the right, by source and campaign, viewed by week, month, quarter and year. You can go deeper by action (demo against white paper against webinar), without giving yourself too much to analyse.
It won’t solve attribution. UTMs aren’t always captured because of cookies, VPNs and ad blockers. It gives you another layer to read alongside in-platform data and GA4.
Reading Direct Traffic Properly
Direct will often be one of your largest sources. Plenty of people see an ad, an SMS or an email, don’t click, then type your address in two days later. A low number for paid social or SMS doesn’t mean it isn’t working.
Layer in Self-Reported Attribution
Ask “How did you hear about us?” on high-intent forms
Make it free text, not a dropdown, so people give real detail (a named person on LinkedIn, a YouTube ad, ChatGPT)
Use keyword-based workflows to sort answers into buckets, and review the unmatched ones each month
Harry doesn’t accept that the extra field hurts conversion in any way that matters. Someone unwilling to answer is probably low intent anyway.
Backfill Your Historical Data
For an established business, export existing contacts and map their native source data into the new first-touch fields, renamed to match your new framework. It is slow work, but it stops your dashboards being patchy and means the next conversion fills last touch correctly.
Set UTMs at Account Level
Set UTMs at account level in LinkedIn, Meta and Google, not at ad level
Hard-code the source and use dynamic parameters for the campaign name
Make sure every link carries UTMs, including emails, QR codes at trade shows and organic posts
Key Takeaways
One UTM framework, one owner
Hidden fields on every form, with an expiry on the capture script
Lock first touch and let last touch overwrite
Add free-text self-reported attribution
Don’t read direct traffic at face value
Backfill historical data
Set it up early, because the longer you wait the more data you lose
