7 min readThe Subtraq team

It came from Instagram. Your report says otherwise.

You publish a story, you see the spike in visits, and the report puts everything under "direct." Nothing is broken on your end — the information that said "Instagram" simply never arrived. Here are the four places where it gets lost, and what you can measure instead.

There's an uncomfortable moment in the life of a campaign: looking at the report after a big publishing day, and seeing that the line that grew the most is called "direct."

The temptation is to look for a bug. There isn't one. "Direct" isn't a traffic source — it's the name for an empty bucket.

"Direct" doesn't mean "typed by hand"

A standard analytics tool files a visit into a channel by reading an HTTP header the browser sends with the request: Referer. This header contains the address of the page the visitor came from. When it says instagram.com, the visit goes into the "social" bucket. When it's absent, there's nothing to read, and the visit falls into the default bucket.

That default bucket is called "direct." It doesn't mean "someone typed your address" — it means "I don't know." Incidentally, the header name has been misspelled since the early web: the spec writes Referer with a single r, as noted in MDN's documentation. The detail is trivial, but it explains why you'll see both spellings everywhere.

Here's what that line actually contains:

What's in itIs it really "direct"?
A typed address, a bookmark, a saved linkyes
A click from an app's built-in browserno
A pass from a secure page to a non-secure oneno
A link pasted in a messaging app, a document, an SMSno
A QR code scan from a printed mediumno

Four out of five rows have nothing direct about them. They're simply untracked, and the report files them all in the same place.

The four ways information gets lost

The app's built-in browser

When you tap a link in Instagram, TikTok, or LinkedIn, the page doesn't open in your phone's browser — it opens in a window embedded in the app. That window is a browser, but the navigation doesn't start from a web page — it starts from a native interface.

So there's no originating page to declare. The header can arrive empty, or carry a value that looks like nothing useful. This is the most common case, and the one that hits hardest for accounts that live on the link in bio: all the audience from an Instagram profile or a TikTok account goes through this path.

The browser's referrer policy

Browsers have tightened things up, which is good for privacy. Today's default is strict-origin-when-cross-origin: for a request to another site, the browser only sends the origin — the hostname, never the path. And it sends nothing at all when going from an HTTPS page to a non-HTTPS one. MDN's documentation states this plainly on the Referrer-Policy header page.

Practical consequence: even when the referrer survives, it no longer says which post sent the visitor. It says instagram.com, period. The post, the story, and the profile all become the same row.

Sharing that leaves the web

A link pasted in WhatsApp, in an SMS, in a PDF, in phone notes, or printed on a flyer: there's no originating page, so no referrer possible. That's not a flaw — it's the nature of these mediums. Person-to-person sharing is actually the most effective form of distribution — and the most invisible, if you don't prepare for it. That's the whole challenge of the WhatsApp channel, and the reason dynamic QR codes exist on printed mediums.

Parameters stripped along the way

Last case, and the most frustrating: the link did carry its UTM parameters, and someone copied it without them. A colleague who picks up the address from the browser bar after a redirect, a platform that cleans URLs before displaying them, a shortening tool that doesn't pass the query string: the result is identical. The tracking existed; it didn't make it.

What this actually costs

The problem isn't aesthetic. An inflated "direct" line produces three wrong decisions:

  • You underestimate the network that's working. Instagram is sending you traffic, the Instagram column stays flat, and next month's budget decision is made against it.
  • You overestimate what stays readable. Search, email, and paid campaigns hold their referrer better than organic social. They therefore look better than they are, purely because they survive measurement.
  • You can no longer connect a sale to anything. And that's the real cost: without an origin, the revenue line still exists, but nobody knows what to credit it to. That's exactly the subject of the attribution article.

What doesn't get lost: the address itself

The referrer is information the browser chooses to give. The address is information the visitor carries, because it's the path they're taking. It depends on neither the app, nor the browser policy, nor the originating page's protocol.

Hence the method shift: stop asking "where did you come from?" and start knowing "which door did you walk through?" Two approaches, which stack.

Campaign tagging. The five utm_ parameters travel in the address and arrive intact, even from a built-in browser. The UTM generator is free and requires no sign-up, and the article detailing all five parameters explains what each does. Warning though: a URL loaded with parameters is ugly to read and fragile when copied.

One short link per placement. It's the most robust approach, because the information is no longer in the URL's query string — it's in the address itself. One link for the bio, another for Tuesday's story, a third for the summer reel: three distinct doors, three distinct counters, nothing to lose in transit. That's the principle of short links on your own domain.

example.com/bio      → the profile bio
example.com/story-12 → the story on the 12th
example.com/reel-summer → the summer campaign reel

And when the sale comes back from the payment tool, it's that link it points to — not a bucket. That's the principle of sales tracking.

Where to start, concretely

  1. Stop treating "direct" as a channel. Rename it mentally to "untracked." You'll stop looking for the cause of a spike that's just a measurement gap.
  2. One short link per placement, not per campaign or platform. Three posts on Instagram: three links.
  3. Also tag your links with UTMs, so the information survives in tools that only know those.
  4. Check the form handoff. That's where the chain breaks most often, and the symptom is identical: a sale without an origin.
  5. Compare over a full month, never a single day. On the day of a post, everything moves; the channel that's actually working shows over time.

Questions that come up

"My direct traffic exploded overnight — is that serious?" It's almost always a sign that tracking broke somewhere: a link copied without its parameters, an added redirect that swallows the query string, a changed tool. Look at what moved in your distribution that day before looking at the site.

"Can I force the browser to send the referrer?" You can declare a more permissive policy on your own pages, and that's what our redirect service does: it responds with Referrer-Policy: unsafe-url, so the destination knows where the visitor came from. But you can't impose anything on other people's pages — and that's where most of the loss comes from.

"Would a more privacy-friendly analytics tool do better?" On this specific point, no: they all read the same header and suffer from the same gaps. The difference plays out elsewhere, and the comparison with a standard analytics tool details which difference that is.

"Do you need to track visitors to solve this?" No, and that's the most counter-intuitive point: counting visits through a door you own gives better measurement than following people, while collecting less. The article on tracking without surveillance shows what gets recorded, field by field.

"How many different links do I need to manage?" As many placements as you'd want to be able to compare — and no more. If you'd never make a different decision between two posts, one link is enough for both.


Instagram now allows multiple links on a single profile — its help center documents this — which changes things for anyone who wants to separate their measurements. The Instagram bio link page explains how to take advantage of that, and the lexicon covers the measurement vocabulary, term by term.

See the method applied to real numbers

Read next

The rest of the method

7 min

We count the visits. Not the visitors.

Measuring a campaign doesn't require identifying anyone. What a tracked link actually records, and who is responsible for what under GDPR.

The monthly letter

One more article. Once a month.

What we published, what we learned building it, and the numbers we can show. No offers, no automated follow-ups.

One letter a month, written by us, with no tracking pixel inside. Your address is used for that and nothing else: it is never sold or shared. Privacy policy · Unsubscribe