The question every paid media team has to answer: which ad drove that lead?
Not "which channel." Not "which campaign cluster." Which specific ad, to which specific landing page, submitted by which specific person, and did they eventually become a customer?
Here's how to build that connection end-to-end.
Why this is harder than it should be
Ad platforms tell you how many clicks your ads got. They'll also tell you how many conversions, if you install their pixel and define a conversion event.
The problem with pixel-based conversion tracking: it lives in the ad platform's system, uses the ad platform's attribution model, and counts in the ad platform's favor. It's not the same as a lead in your CRM. It doesn't tell you whether that lead became a customer. And when you compare it to your CRM data, the numbers almost never match.
UTM-based tracking solves this differently. Instead of relying on the pixel, you tag your ad URLs with UTM parameters, capture those parameters at the form level, and store them in the lead record. Now the lead record itself says "I came from this campaign." No pixel required. No cross-referencing ad platform dashboards.
Step 1: Tag your ad links with UTMs
Every ad that drives traffic to your site should have UTM parameters on the destination URL. The five parameters:
utm_source, the platform (google, facebook, linkedin, tiktok)utm_medium, the channel type (cpc, paid-social, email)utm_campaign, the campaign name (q2-enterprise-retarget, product-launch-may)utm_content, the specific ad or creative (cta-demo, image-v2, carousel-a)utm_term, optional, useful for Google Ads keywords (project-management-software)
A well-tagged URL looks like this:
https://yoursite.com/demo?utm_source=linkedin&utm_medium=paid-social&utm_campaign=q2-enterprise-retarget&utm_content=cta-demo
Build your tagged URLs in the Trakt UTM Builder →. It keeps your naming conventions consistent, one of the most common reasons attribution breaks is inconsistent UTM naming (utm_source=LinkedIn vs linkedin vs li vs Linkedin).
Step 2: Capture UTMs at the form level
Once a visitor lands on your page with UTMs in the URL, those UTMs need to survive the form submission. That requires hidden fields on every form.
The hidden fields read the UTM values from the URL when the page loads, then submit them silently alongside the form.
This is the step most teams skip, which is why their CRM leads don't have source data. Detailed setup instructions by form platform: Why UTM data disappears at form submission →
Step 3: Store UTMs in the lead record
Your form captures the UTMs. Now they need to land in the right place in your CRM.
In HubSpot: create custom contact properties for each UTM parameter and map the form hidden fields to those properties. Full HubSpot walkthrough →
In Salesforce: create custom Lead fields (UTM Source, UTM Medium, etc.) and map them in your form integration or Zapier workflow.
In GoHighLevel: custom fields work the same way, create them, then map the form fields.
Once the UTM values are in the lead record, they follow the contact through your funnel. When the lead becomes an opportunity, the UTM data is there. When it closes, you can attribute that revenue.
Step 4: Persist UTMs across multi-page journeys
Here's a scenario that breaks step 2: your ad sends someone to your homepage. They browse, read a blog post, navigate to your pricing page, then fill out the contact form. The UTMs were in the URL of the homepage, not the pricing page.
If your site doesn't persist UTMs across page navigation, by the time they hit the form, the URL has no UTM parameters to read.
The fix is a first-party cookie. When a visitor first lands on your site with UTMs in the URL, store those values in a cookie. When any form on your site is loaded, check for the cookie and pre-populate the hidden fields from it, regardless of which page the form is on.
Trakt handles this automatically. It stores UTM values in a session cookie on first landing and injects them into hidden fields on any form page, even if the visitor has navigated away from the original landing page.
What you can do once it's working
Once UTM data is flowing into your CRM, here's what you can actually answer:
"Which campaign generated the most leads this quarter?" Filter contacts by utm_campaign. Count them. Done.
"Which ad creative drives the highest lead-to-close rate?" Filter closed won deals by utm_content. Compare conversion rates by creative variant.
"Our Google Ads are driving traffic but we're not sure they're generating pipeline." Filter opportunities by utm_source=google and utm_medium=cpc. If the pipeline exists, it'll show up.
"The CFO wants to know which channels to cut." Sort channels by closed revenue, not lead volume. Channels that drive low-quality leads will look worse once you're measuring by close rate, not just form fills.
The ad platform attribution problem
Here's something worth being explicit about: your ad platform's attribution and your CRM's attribution will never agree completely, and that's okay.
Facebook counts a conversion if someone saw or clicked your ad and converted within a 7-day window. Google's attribution depends on which model you're using. Neither of these reflects what actually happened in your sales process.
CRM-level UTM attribution reflects the actual form submission with the actual campaign tag. It's more conservative (it doesn't count view-through conversions), but it's also more accurate for understanding what's working.
When CFOs and CEOs ask about ROI, the CRM number is the one that matters. That's the number Trakt helps you build.
For agencies: per-client tracking without overlap
If you're managing paid campaigns for multiple clients, UTM hygiene is especially important. Every client's campaigns should have distinct, consistent UTM values that can't be confused with another client's.
Use a UTM naming convention that includes client code: utm_campaign=clienta-q2-retarget rather than just q2-retarget. Store UTM templates per client in Trakt's dashboard so whoever builds the links that week uses the correct naming convention.
