
Join ad spend to orders on the click ID
A 5.0 ROAS on the dashboard is worth checking before you celebrate. If 40% of your spend never matched a campaign, the denominator is short and the number is wrong in the direction you like.

You tag your paid campaigns and stop there. The bio link, the broadcast, the packaging insert, the partner page: all untagged, and all landing in the same bucket as genuine direct traffic.
A store with 300 orders a month had 120 of them in direct. Forty per cent of the month with no name on it.
It tagged three links: the bio link, the WhatsApp broadcast, and a QR code inside the packaging. The next month those 120 split like this:
| Source | Orders |
|---|---|
| Bio link | 44 |
| WhatsApp list | 31 |
| Packaging QR | 17 |
| Still direct | 28 |
Illustrative figures.
Nothing about the marketing changed. The links just got names, and 92 orders moved out of an unusable bucket into rows you can act on.
That's the honest remainder: people typing your domain, opening a bookmark, arriving from a private message. The goal was never zero. The goal was to stop direct absorbing traffic that had a source.
There's a second part of direct that tagging doesn't fix: links that lose their parameters in a payment redirect, and visitors whose cookies expired. That one needs the source captured and stored server-side at the order. See what direct really is and every redirect that breaks a session.
Anything you control and can put a parameter on:
Tag paid campaigns too, but don't rely on the tag alone there. Platforms match on the click identifier, which survives things a UTM doesn't. See joining ad spend.
Naming drift. summer, Summer and summer_2027 are three different sources to a machine. Agree a convention before you start, however simple it is.
Tagging for a season only. Tags added for one season get removed in the cleanup afterwards, and the same sources collapse back into direct for the rest of the year.
It needs no engineering, no vendor and no new spend. It's an afternoon of adding parameters to links you already publish, and it keeps working for as long as those links exist. Set that against the effort of a tracking integration or an attribution model debate and the return per hour isn't close.
In Flowfy, capturing a tagged link's source and holding it on the order is live today, including through payment redirects, so a tagged link arrives at the sale with its source intact. A link builder that names and manages your links for you is on the roadmap and hasn't shipped. Today you build the links with any tool or by hand, and Flowfy holds the source.
Start with the three links carrying the most traffic, which in most stores means the bio link, the messaging list and one offline placement. Tag them this week under one naming convention. A month later, compare your direct share before and after.

A 5.0 ROAS on the dashboard is worth checking before you celebrate. If 40% of your spend never matched a campaign, the denominator is short and the number is wrong in the direction you like.

Instalment providers take the blame, but the mechanism is broader. Any journey that leaves your domain and comes back can end the session carrying the customer's source. Here's the list, and one fix that covers most of it.

Direct isn't a channel. It's where orders go when nobody recorded their source. Here are the five causes behind it, and two checks that tell you which one you have.