You ran the campaign. Traffic came in. Leads showed up in the CRM.

And then someone asked which campaign drove those leads, and the answer was "direct traffic" or a blank field or a shrug.

That's broken attribution. It's not a data problem. It's a plumbing problem. And it happens in the same three places, every time.


The three places your attribution data dies

Attribution doesn't just disappear. It gets dropped at specific handoff points, and once you know where, the fix becomes obvious.

1. The click to the landing page

UTM parameters live in the URL. If someone clicks your Meta ad and lands on yoursite.com/demo?utm_source=facebook&utm_medium=paid&utm_campaign=q2-retarget, those parameters are in the address bar, for now.

They die here when:

  • Your landing page does a redirect that strips the query string
  • Your site loads in a way that rewrites the URL (some page builders do this)
  • The visitor navigates to a second page before filling out a form, and the UTMs don't follow them

This is less common than the next two failure points, but it happens, especially with redirects and subdomains.

2. The landing page to the form

This is where most attribution data dies, and it's invisible unless you know to look for it.

When someone fills out a form on your site, the form submits whatever fields it contains. If there's no hidden field configured to capture utm_source, that value never gets sent anywhere. It doesn't fail loudly. The form just submits without it.

Your CRM receives the lead. The lead source field is blank or defaults to "direct." Nothing breaks. Nothing throws an error. The data just doesn't exist.

This is the gap Trakt was built to close, automatic hidden field injection means every form on your site captures UTM data without anyone touching the form builder.

3. The form to the CRM

Even when hidden fields exist, the data can still drop between the form and the CRM.

This happens when:

  • The form integration doesn't map the hidden field to the correct CRM property
  • The CRM property isn't set up to receive free-text (a dropdown field won't accept "facebook")
  • A Zapier or Make workflow connects the form to the CRM but doesn't pass the UTM fields through
  • The form tool and CRM use different field naming conventions (utm_source vs UTM Source vs Lead Source)

By the time a lead lands in Salesforce or HubSpot, it may have passed through 3–4 different systems. Each one is a place where UTM data can be dropped, reformatted, or silently ignored.


What "direct traffic" actually means in your CRM

Here's something worth knowing: when your CRM shows a lead came from "direct," it doesn't mean they typed your URL directly. It means the source data was unavailable.

Every lead that comes through a broken attribution pipeline ends up in "direct." That bucket is a graveyard of misattributed paid traffic, email clicks, social referrals, and affiliate leads, all lumped together because the plumbing failed somewhere upstream.

If your "direct" bucket is large (and for most B2B companies it is), you're not seeing traffic that can't be tracked. You're seeing tracking that broke before the data reached you.


The five most common scenarios where attribution breaks

Scenario 1: Facebook ads with no hidden fields

You're running Meta campaigns. Traffic flows to a landing page. The landing page has a contact form. The form has no hidden fields. Every lead that comes in shows as "direct" or has no source data.

Fix: Add hidden fields for utm_source, utm_medium, utm_campaign, utm_content, utm_term, and configure them to read from the URL parameters on page load. Or use Trakt, which does this automatically across every form on your site →

Scenario 2: HubSpot forms not capturing UTMs

HubSpot has a "Original Source" property, but it uses its own attribution logic, not UTM parameters. If you want UTM data in your contact properties (so you can see it in deals, reports, and CRM), you need to add hidden fields manually for each UTM value and map them to custom contact properties.

Most HubSpot users skip this step and wonder why their UTM reports are empty.

Detailed walkthrough: How to pass UTM parameters into HubSpot forms →

Scenario 3: Multi-step forms losing UTMs between steps

Single-page forms are relatively easy to configure. Multi-step forms, the kind where step 1 collects name/email and step 2 asks about company size, often lose UTM data between steps because each step is a separate form submission or page load.

You need to pass UTM values as hidden fields on every step, or store them in a session cookie that persists across the steps.

Scenario 4: Page redirects stripping query strings

A common setup: your ad points to landing-page.com/offer, which redirects to yoursite.com/offer. If the redirect isn't configured to preserve query strings (a 301 redirect passes them, but many URL builders and link shorteners don't), UTMs die at the redirect.

Workaround: test every redirect in your funnel by clicking through your actual ads and checking what URL you land on.

Scenario 5: Zapier workflows dropping UTM fields

Your form tool sends data to Zapier. Zapier creates a contact in your CRM. But the Zap only passes the fields you explicitly mapped when you set it up, and when you set it up, you hadn't added hidden UTM fields yet.

The fix: edit the Zap, add the UTM fields from your form tool, map them to the corresponding CRM properties, and run a test with a real submission.


Why this matters beyond vanity metrics

Lost attribution isn't just a reporting inconvenience. It affects real decisions.

When a channel shows $0 in attributed revenue, it looks like it's not working. You cut the budget. But the leads were there, they just weren't tagged. You killed a channel that was performing because the data said it wasn't.

The inverse happens too. When attribution is broken, "direct" often looks like your biggest source. So you over-invest in SEO or brand while your paid campaigns go unmeasured and under-resourced.

For agencies: if you can't show clients where their leads come from, every renewal conversation is harder. Attribution is a retention tool.

For founders: if you're running paid spend without form-level attribution, you're flying with your eyes closed. You know traffic costs money. You don't know which traffic turns into revenue.


The complete fix: what needs to be in place

Getting attribution right requires three things working together:

1. Clean UTM parameters on every link you send

Every ad, every email, every social post that drives traffic to your site needs UTMs. This sounds obvious, but most teams are inconsistent, different people build links differently, campaigns get launched without UTMs, and the data is fragmented from the start.

A UTM builder with team-level templates solves this. Build your first UTM in the free Trakt builder →

2. Hidden fields on every form

Every form that generates leads needs hidden fields for utm_source, utm_medium, utm_campaign, and ideally utm_content and utm_term. These fields read the URL parameters on page load and submit with the form.

Most form builders support hidden fields. The tedious part is setting them up on every form and keeping them updated as your forms change. Trakt automates this by scanning your site and injecting fields automatically.

3. Clean CRM field mapping

The hidden field data needs to land somewhere useful. That means custom CRM properties for each UTM value, mapped correctly from your form tool, with a consistent naming convention across your stack.

Once all three are in place, every lead in your CRM has a source. Every deal has an origin. And the question "which campaign is actually driving revenue" has an answer.


How to diagnose your current setup

Before fixing anything, run this quick audit:

  1. Click one of your live paid ad links and land on the form page
  2. Look at the URL in your browser: do you see UTM parameters?
  3. Fill out the form with test data
  4. Find that test lead in your CRM
  5. Check the UTM/source fields: are they populated?

If step 2 works but step 5 shows empty fields, the problem is at the form level (missing hidden fields or broken CRM mapping). If step 2 shows the UTMs aren't in the URL, the problem is upstream, at the redirect or link level.


This article is the hub of a content cluster on form-level attribution. Here are the specific fixes:


Suggested CTAs:

  • In "The form to the form" section: "Or skip the manual setup, Trakt injects hidden fields across every form on your site automatically →"
  • Bottom of post: "Start with the free UTM Builder. Build your first tracked link in 30 seconds →"

Suggested internal links (from other articles to this one):

  • From Facebook cluster pillar: "...which is why form-level attribution matters as much as pixel setup"
  • From LinkedIn cluster: "...UTMs survive the click but often die at the form, here's why"
  • From HubSpot integration posts: "...for a complete picture of where attribution breaks, start here"