You ran a campaign. People clicked. Leads came in. Your CRM says they all came from "direct traffic."

They didn't. "Direct traffic" is what your CRM shows when it has no source data. It's not a channel, it's a signal that something broke between the click and the record.

Here's what's actually happening, and how to find and fix the break.


What "direct" actually means in your CRM

In most CRM systems (HubSpot, Salesforce, GoHighLevel), "direct" or "direct traffic" is a fallback value. It appears when:

  • No UTM parameters were present when the lead submitted the form
  • UTM parameters existed in the URL but weren't captured by a hidden field
  • Hidden fields captured the UTMs but the CRM mapping dropped them
  • The lead came through a channel that doesn't pass referrer data (email clients, Slack, many messaging apps)

In Google Analytics, "direct" has a similar meaning, it's the bucket for sessions where GA couldn't identify a source. But the two "directs" measure different things. GA's direct reflects session sources. Your CRM's direct reflects what was submitted in the form.

If your CRM shows 80% direct traffic, you don't have 80% of people typing your URL. You have 80% of your forms not capturing source data.


The 5 most common causes

If you're sending traffic from paid ads, email campaigns, or social posts without UTM parameters on the URLs, there's nothing to capture.

How to diagnose: Click one of your active ad links or email links. Does the URL in your browser have ?utm_source= in it?

How to fix it: Use a consistent UTM naming convention and add parameters to every link that drives traffic to your site. The Trakt UTM Builder → makes this fast and keeps your naming conventions consistent across the team.


Cause 2: UTMs exist but your forms have no hidden fields

The most common cause by far. Your links have UTMs. The UTMs show up in the URL. But the form has no mechanism to capture them, so they never get submitted.

How to diagnose: Open your landing page URL with UTMs in the browser, right-click the form, and inspect the HTML. Look for <input type="hidden"> elements. If you don't see any with UTM-related names, this is the problem.

How to fix it: Add hidden fields to your forms for each UTM parameter, configured to read from the URL query string on page load. Full instructions: Why UTM data disappears at form submission →


Cause 3: Redirect stripping the UTMs before the form page loads

Your ad URL redirects to your site. If the redirect doesn't preserve query string parameters, the UTMs are gone before the visitor even lands on the page with the form.

How to diagnose: Click your ad link and watch the full URL through the redirect. Does it end with UTM parameters, or do they disappear during the redirect?

How to fix it: Make sure your redirect is a 301 or 302 that preserves query strings. URL shorteners (Bitly, etc.) sometimes strip them, check your shortener settings or stop using a shortener for paid traffic links. Custom redirect rules on your server (Apache, Nginx) need to explicitly pass query strings through.


Cause 4: The visitor navigated to a different page before filling out the form

Your ad drives them to /landing-page. They click around. They find the form on /contact. The UTMs were in the URL of the first page, not the form page. If your site doesn't persist UTMs across pages (via a cookie or session storage), they're gone.

How to diagnose: Look at the conversion path in GA4 or your landing page analytics. Are people who fill out forms landing directly on the form page, or are they navigating from somewhere else first?

How to fix it: Store UTMs in a first-party cookie on the first page load, then read from the cookie when the form is submitted, regardless of which page the form is on. This is what Trakt does by default.


Cause 5: Hidden fields exist but CRM field mapping is broken

The form has hidden UTM fields. They're reading the URL correctly. The data is being submitted. But it's not showing up in the CRM lead record because the field isn't mapped to a CRM property, or it's mapped to the wrong one.

How to diagnose: Check the raw submission log in your form tool (HubSpot, Gravity Forms, Typeform, etc.). Find a recent lead that shows as "direct" in your CRM. Does the form submission log show UTM values for that lead? If yes, the problem is in the CRM mapping, not the form.

How to fix it: In your form tool, find the field mapping settings and verify that each hidden UTM field is mapped to the correct CRM property. In HubSpot native forms, hidden fields need to be explicitly mapped to contact properties. In Zapier integrations, you need to add UTM fields as mapped values in the Zap action step.


A quick diagnostic flowchart

Here's how to find your specific break in 5 minutes:

  1. Do your ad/email links have UTMs? No → fix the links first.
  2. Do the UTMs survive the redirect to your landing page? No → fix the redirect.
  3. Does your form page have hidden UTM fields? No → add them.
  4. Are the hidden fields reading from the URL correctly? No → fix the prefill configuration.
  5. Is UTM data showing in form submission logs? No → fix the hidden fields.
  6. Is UTM data in submission logs but not in CRM? Yes → fix the CRM field mapping.

That flowchart covers 95% of cases.


The real cost of "direct traffic"

Every lead in your "direct" bucket is a lead you can't attribute. For most B2B companies, that means:

  • Channels that are working look like they're not (because their conversions are being eaten by "direct")
  • Channels that aren't working look proportionally better
  • Budget decisions are being made on inaccurate data

If you're spending $10k/month on Google Ads and $5k on LinkedIn, and your "direct" bucket is absorbing half your form submissions, you may be misallocating six figures in annual spend based on a data plumbing problem.

Fix the plumbing first. Then let the data tell you where to put the budget.


The fastest fix

If you want to solve this across your entire site without configuring forms one by one: Trakt scans your site, injects UTM hidden fields into every form, and persists UTM data in a first-party cookie so it survives multi-page journeys. Your CRM starts receiving source data for every lead.

See how Trakt fixes this →