UTM Tracking & Attribution
How to use the protagx UTM Builder, why it matters, and how to wire everything
into HubSpot so every lead carries its source from click to closed deal.
Why UTM tracking matters
Most marketing teams send traffic from multiple channels — LinkedIn ads, email campaigns, organic posts, Google Ads — but have no reliable way to know which channel actually generated a pipeline opportunity. Without UTM parameters, every visitor who lands on your website looks the same inside your CRM.
UTM tracking closes that gap. By appending a short set of tags to every link you publish, you give your CRM a permanent record of where each contact came from, which campaign brought them, and which specific asset they clicked. That record follows the contact through the pipeline — from first touch all the way to closed-won deal.
With clean UTM data flowing into your CRM you can answer questions that are otherwise impossible: Is LinkedIn Ads generating deals, or just contacts? Is your outbound email sequence producing booked meetings at a better rate than paid search? Which campaign produced the most pipeline value this quarter?
None of that is measurable without consistent, disciplined UTM tagging on every link, in every channel, from day one.
How it works end-to-end
The system has three moving parts that work together automatically once configured:
The HubSpot tracking code is the bridge between the URL in your campaign and the contact record in your CRM. It reads UTM parameters automatically — but only if they are present and correctly formatted on the link that drove the visit.
Anatomy of a UTM URL
A tagged URL is your normal destination URL with a query string appended. Each parameter answers one specific attribution question:
https://yourdomain.com/page?utm_source=linkedin&utm_medium=paid-social&utm_campaign=product-launch-q2&utm_content=hero-cta-v1
| Parameter | Required | Answers the question | Example |
|---|---|---|---|
utm_source | Yes | Which platform sent the traffic? | linkedin, google, mailerlite |
utm_medium | Yes | What type of channel was it? | paid-social, email, organic |
utm_campaign | Yes | Which campaign does this belong to? | product-launch-q2 |
utm_content | Optional | Which specific ad, CTA, or step? | hero-cta-v1, step-2 |
utm_term | Optional | Which paid keyword triggered this? | crm-software-uk |
Naming rules — non-negotiable
UTM values are case-sensitive and exact-match. A single inconsistency creates a phantom source in your reports and silently breaks attribution for every contact that comes through that channel.
utm_source=LinkedIn and utm_source=linkedin are two different sources in HubSpot. Always use lowercase.%20 and produce unreadable URLs. Use hyphens to separate words: product-launch-q2.&, ?, #, or = inside parameter values. These break URL parsing entirely.Standard channel taxonomy
Use these values consistently across all channels. The quick-fill presets in the UTM Builder are pre-loaded with this exact taxonomy.
| Channel | utm_source | utm_medium | utm_campaign pattern | utm_content |
|---|---|---|---|---|
| LinkedIn Ads | linkedin | paid-social | [product]-[audience]-[quarter] | [ad-variant] |
| LinkedIn Organic | linkedin | organic-social | [topic]-[month] | — |
| HubSpot Sequence | hubspot-sequences | email | [sequence-name] | step-[n] |
| Broadcast Email | mailerlite | email | [newsletter-name]-[month-year] | cta-[position] |
| Google Ads | google | paid-search | [ad-campaign-name] | [ad-group] |
| Website / Organic | website | organic | [page-slug]-[cta] | [position] |
| Instagram Ads | instagram | paid-social | [campaign]-[quarter] | [creative-id] |
| Referral partner | referral | referral | [partner-name] | — |
HubSpot setup — 3 prerequisites
Step 1 of 3Before UTM data can flow into your CRM, three things must be in place. These are one-time configuration tasks that take less than an hour total.
-
1Install the HubSpot tracking code on every pageGo to Settings → Account Management → Tracking & Analytics → Tracking Code. Copy the embed snippet and place it in the
<head>of every page on your website — or in the global header component if using a CMS.
QA check: Visityoursite.com?utm_source=test&utm_medium=test, submit a test form, and confirm the contact record shows UTM properties populated within a few minutes. -
2Confirm HubSpot's built-in UTM contact properties are visibleGo to Settings → Properties → Contact Properties → filter "Analytics". You should see:
utm_source,utm_medium,utm_campaign,utm_content,utm_term,hs_analytics_source,hs_latest_source, and their drill-down variants.
These are populated automatically by the tracking code — no workflow needed. They exist natively in every HubSpot portal. -
3Create a custom "Lead Source" contact propertyGo to Settings → Properties → Contact Properties → Create property. Set field type to Dropdown select. Add these values:
LinkedIn Ads,LinkedIn Organic,Outbound Email Sequence,Broadcast Email,Google Ads,Organic / SEO,Website Direct,Referral,Event / Conference,Other.
This property will be written by your automation workflow (Step 2 below) and is the single field used across contacts, deals, and reports.
Automation workflow — auto-populate Lead Source
Step 2 of 3This workflow reads the UTM values stored on a new contact record and writes the correct Lead Source value. It runs once per contact, at creation, and requires no manual intervention after setup.
Automation → Workflows → Create workflow → Contact-based → Start from scratch
Set the enrollment trigger to Contact is created. Disable re-enrollment — this should fire once only. Then add the following if/then branches:
utm_source = linkedin AND utm_medium = paid-socialLead Source = LinkedIn Adsutm_source = linkedin AND utm_medium = organic-socialLead Source = LinkedIn Organicutm_medium = email AND utm_source = hubspot-sequencesLead Source = Outbound Email Sequenceutm_medium = email AND utm_source = mailerliteLead Source = Broadcast Emailutm_source = google AND utm_medium = paid-searchLead Source = Google Adshs_analytics_source = Organic Search OR utm_medium = organicLead Source = Organic / SEOLead Source is unknown / emptyLead Source = OtherMake attribution visible in the CRM
Step 3 of 3UTM data captured on a contact record needs to be surfaced where your team actually works — on the contact sidebar, on the deal card, and in the pipeline board view.
-
AAdd UTM properties to the contact sidebarOpen any contact → click the pencil/customise layout icon → Add property. Add:
Lead Source,Original Source,UTM Campaign,UTM Medium,UTM Source,Latest Source. Group them under a section labelled "Attribution" so they appear as a single scannable block. -
BCopy Lead Source to deal records via a second workflowCreate a second workflow: trigger = Deal is created. Action = copy associated contact's
Lead Source→ Deal'sLead Sourceproperty (which you create as a matching dropdown on deal records).
This is necessary because UTM contact properties do not automatically propagate to associated deals. Once this workflow is live, every new deal carries its lead source independently. -
CAdd Lead Source as a deal card property in pipeline viewGo to CRM → Deals → Board view → Edit cards → Add property → Lead Source. This surfaces the source on every deal card in your pipeline board — making attribution visible without opening individual records.
Building an ROI attribution dashboard
Once lead source data is flowing cleanly into contacts and deals, you can build a dedicated attribution dashboard in HubSpot. Go to Reporting → Dashboards → Create dashboard → "Attribution & Lead Source" and add these five reports:
| Report | Type | What it shows |
|---|---|---|
| Contacts by Lead Source | Bar chart | Volume of new contacts per channel, rolling 30 days |
| Deals created by Lead Source | Bar chart | Pipeline count and deal value attributed per channel |
| Conversion rate by Lead Source | Funnel / table | Contact → deal → closed-won rate per channel — the core ROI comparison |
| Contacts over time by Lead Source | Line chart | Week-on-week trend of each channel's contribution |
| Sequence engagement | Table | Per-sequence: enrolled, replied, meeting booked — email ROI at a glance |
QA checklist — verify before going live
Run through each of these checks after completing setup. Every item must pass before you can trust your attribution data.
- Submit a test form from a UTM-tagged URL — confirm UTM properties appear on the contact record within 5 minutes
- Confirm the Lead Source workflow fires and sets the correct value for at least 3 channel branches
- Check that
Lead Sourceappears in both the contact sidebar and the deal sidebar - Send a test sequence email with a UTM link, click it, submit a form — confirm
Lead Source= Outbound Email Sequence - Confirm the Lead Source deal workflow fires and copies the value from contact to deal on creation
- Confirm the attribution dashboard loads and shows data segmented by Lead Source
- Test the UTM Builder tool — generate a URL, copy it, and verify it produces a correctly structured tagged link with no uppercase or spaces