The short version

"Direct" almost never means someone typed your URL from memory. It's the label your CRM slaps on a lead when the campaign that actually drove them got lost somewhere between the click and the contact record. This post covers the five real reasons leads get dumped into "Direct," how to fix each one, and how to check how bad your own leak is.


Open your CRM, group your leads by source, and look at the pile marked "Direct." For most B2B teams it's the second- or third-biggest "channel" in the whole database.

Here's the uncomfortable truth: almost none of those people typed your URL from memory. Real direct traffic, someone keying in yourcompany.com unprompted, is rare, and it's mostly people who already know you. What's actually in that bucket is leads from your ads, your emails, your LinkedIn posts, and your content, whose original source got stripped away before it reached the contact record. "Direct" isn't a channel. It's the label your CRM uses when the trail went cold.

And it's expensive, because it distorts every budget decision you make. Your paid campaigns look worse than they are (their conversions leaked into "Direct"), "Direct" looks like a mysteriously productive channel you can't invest in, and you end up cutting the wrong things. The classic version of this: a team kills a paid campaign for "low ROI," not realizing half its conversions were sitting in the Direct pile the whole time.

Before we get into the fixes, it's worth seeing the size of the problem in dollars, plug in your own numbers:

What's your "Direct" traffic really costing you?

Most "Direct" leads are misattributed, real campaigns whose source got lost. Enter your numbers, then unlock the revenue you can't currently trace.

Revenue you can't attribute to a campaign ≈$0/ year 0"Direct" leads / month 0hidden customers / year $0unattributed / month

🔒 Your result is ready

Enter your email to reveal it, we'll send you the breakdown plus the fixes.

See exactly where yours is leaking

Run the free 10-second attribution audit on your site, or let Trakt capture the source on every lead automatically.

Audit my site free Fix it with Trakt →

Estimates only, based on the figures you enter. Real direct traffic exists, but for most B2B teams it's a small fraction of the "Direct" bucket.

So let's go through the five reasons leads get mislabeled as Direct, worst offender first, and exactly how to fix each.

1. Your forms don't capture the campaign (the big one)

This is the single most common cause. A visitor arrives carrying their campaign in the URL, utm_source=linkedin, utm_campaign=q3-demo, maybe a gclid. They fill out your form. Unless that form has hidden fields that read those values off the URL and submit them with the form, every bit of campaign context is gone the moment they hit "Submit." The CRM gets a name and an email and nothing else, so it defaults them to Direct.

The fix: add five hidden fields to every lead form, utm_source, utm_medium, utm_campaign, utm_content, utm_term, that populate from the URL and write into the contact record. In HubSpot or Marketo, map them to contact properties so they persist. This one change moves the largest chunk of your "Direct" pile into its real channels.

2. The UTMs didn't survive the visit

Even if your form can capture UTMs, it only works if the parameters are still there when the person converts. And real buyers rarely convert on the first page. They click your ad, read a bit, leave, and come back two days later to fill out the form, by which point the URL is clean and the UTMs are long gone. The form captures nothing, and the lead lands as Direct.

The fix: persist the campaign data. On the first visit, write the UTMs into a first-party cookie that lasts around 90 days. On submit, populate the hidden fields from that cookie, not just the current URL. Now a lead who returns a week later still carries the campaign that first brought them in.

Every time someone shares your link in a Slack message, an email, a DM, or a PDF, and that link has no UTMs on it, the resulting click is invisible, it shows up as Direct. The same happens with your own owned channels if you're sloppy: an email newsletter link without UTMs, a link in your LinkedIn bio, a QR code pointing at a bare URL. You drove that traffic; you just didn't label it.

The fix: tag every link you control with UTMs, and standardize how you do it so the whole team is consistent. This is the part that quietly falls apart the moment one person shares a link the "quick" way, which is why standardized, shareable tracking links across the team matter more than any single UTM.

4. Referrer stripping from apps and secure pages

A lot of "Direct" is actually a technical quirk. When someone clicks a link inside a mobile app (LinkedIn, Instagram, a native email client) or moves from a secure page to a non-secure one, the browser often passes no referrer information at all. Analytics has nothing to attribute the visit to, so it files it under Direct. This is why so much genuinely social and email-driven traffic hides in the Direct bucket.

The fix: don't rely on the referrer, rely on UTMs you control (see #3) plus persistence (see #2). If the campaign data is riding in the URL and getting captured and stored, referrer stripping stops mattering, because you're not depending on the browser to remember where the click came from.

5. Redirects and rebuilds that drop the parameters

Sometimes the UTMs are on the link, but they get eaten in transit. A redirect chain (a shortened link, a /go/ redirect, a forced HTTP-to-HTTPS bounce, a trailing-slash rewrite) can strip query parameters before the visitor lands on the page with the form. The click was tagged; the parameters just didn't make it to the finish line.

The fix: test your actual redirect paths. Click a fully tagged link, follow it all the way to the form, and check whether the UTMs are still in the URL when you arrive. If they vanish after a redirect, fix the redirect to preserve query strings.

How to tell how bad yours is

You don't have to guess. Two quick checks:

First, in your CRM, pull the percentage of leads (and, more importantly, closed-won deals) tagged Direct, "none," or empty. Anything above ~20% usually means a capture leak, not a genuinely loyal audience.

Second, audit the site itself, whether your forms capture and keep source data at all. We built a free attribution audit that scans your page and scores exactly this in about ten seconds, and the deeper mechanics are in our guide on tracking the Facebook Pixel end to end, which walks through the same hidden-field-and-cookie setup that fixes reasons #1 and #2.

Shrinking "Direct" for good

Every fix above comes down to the same principle: don't let the campaign live only in the URL, because the URL is fragile. Capture it onto the lead the moment they convert, keep it there through the visit, and tag everything you own. Do that, and "Direct" shrinks back down to what it should be, a small slice of people who genuinely already knew you, while your ads, email, and social finally get credited for the pipeline they've been quietly producing all along.

That capture-and-keep work is exactly what Trakt automates. It scans your site, injects the hidden source fields into your existing forms, persists the UTMs in a first-party cookie, and writes the campaign onto the contact when it syncs to your CRM, so leads arrive attributed instead of defaulting to Direct. No per-form developer tickets, no tagging schema that breaks the first time someone shares a link.

Scan your site and see what's leaking→ trakt.pro (free while in early access)

A few common questions

Does "Direct" traffic mean someone typed my URL directly? Rarely. A small amount is genuine, but most "Direct" is misattributed traffic, leads from ads, email, or social whose source was stripped before it reached your CRM, usually because the form didn't capture it or the UTMs didn't persist.

Why are my paid leads showing up as Direct? Almost always because the campaign data didn't make it onto the contact record: no hidden UTM fields on the form, UTMs that don't persist across the visit, or a redirect that drops the parameters. The click was tagged; the capture failed.

How do I reduce Direct traffic in HubSpot or Salesforce? Add hidden UTM fields to your forms and map them to contact properties, persist UTMs in a first-party cookie so returning visitors keep their source, and tag every link you own. That combination moves most of the "Direct" pile into its real channels.

FAQ

<strong>Does "Direct" traffic mean someone typed my URL directly?</strong>

Rarely. A small amount is genuine, but most "Direct" is misattributed traffic, leads from ads, email, or social whose source was stripped before it reached your CRM, usually because the form didn't capture it or the UTMs didn't persist.

<strong>Why are my paid leads showing up as Direct?</strong>

Almost always because the campaign data didn't make it onto the contact record: no hidden UTM fields on the form, UTMs that don't persist across the visit, or a redirect that drops the parameters. The click was tagged; the capture failed.

<strong>How do I reduce Direct traffic in HubSpot or Salesforce?</strong>

Add hidden UTM fields to your forms and map them to contact properties, persist UTMs in a first-party cookie so returning visitors keep their source, and tag every link you own. That combination moves most of the "Direct" pile into its real channels.