The affiliate dashboard said zero.
Not a small number — zero. One booking platform account had been quietly accumulating commissions for months. The other, for a different product category on the same site, had never recorded anything at all.
The conclusion writes itself. That category gets a fraction of the traffic. The audience is narrower. The intent is weaker. Some channels just don't convert, and the honest thing to do is stop pretending otherwise and put the effort somewhere with a pulse.
I'd been reasoning that way for a while. It's a reasonable read of a zero.
Then I actually looked at the links.
Nothing was counting
There were ten of them, all pointing at the booking platform's public product pages. Clean URLs. They worked — click one and you land exactly where you should, on the right product, ready to book.
Not one of them carried a partner ID.
The platform had no way to know those visitors came from my site. No parameter, no identifier, nothing to attribute a booking to. Every click for months had arrived as anonymous traffic. The commission wasn't small. It was structurally impossible.
The detail that makes this worth writing down is what came next. I checked whether the platform's integration was set up at all — and it was. Their analytics script was sitting in the page head, correctly installed, carrying the right partner ID. Someone had done that step properly and reasonably concluded the integration was finished.
It wasn't finished. Those are two different systems doing two different jobs. The script powers the vendor's widget analytics. Attribution comes from the parameter on the outbound link. Installing one tells you nothing about the other, and the dashboard that would have revealed the gap was the same dashboard reading zero.
So the setup looked complete, the links looked fine, the clicks were real, and the earnings were structurally guaranteed to be nothing.
The money wasn't the loss
At the volume involved, the forgone commission was trivial. Pennies, honestly.
What I actually lost was the ability to learn anything. For as long as that channel was uninstrumented, a click that converted and a click that went nowhere produced identical output: silence. There was no experiment I could have run, no amount of patience, no traffic threshold that would have separated "this doesn't work" from "nothing is watching."
And I had been drawing conclusions from it the whole time. Every judgment I'd made about that category — that the demand was weak, that it wasn't worth building out — came from a system that was incapable of reporting success. The zero wasn't evidence. It was a measurement that had never been shown to work.
Then it happened again, four hours later
Same day, unrelated system.
I was auditing internal links in a build output, trying to work out why a particular page had almost no search visibility. I searched the generated HTML for links pointing to it and got zero results. Nothing on the entire site linked to this page.
That's a real diagnosis with a real fix, and I wrote it up as one. Orphaned page. No inbound links. That's why it's invisible.
The search pattern was wrong. The build writes links as absolute URLs — full domain and all — and I'd searched for the relative form. When I corrected it, the page had nineteen inbound links. More than any comparable page on the site. It was one of the best-linked pages I had.
I'd already built a recommendation on top of that zero before I checked it.
What a zero actually is
Here's the thing I keep relearning.
A zero is not an observation about the world. It's a claim your instrument makes about the world — and a broken instrument makes that claim with exactly as much confidence as a working one.
"Nothing happened" and "nothing was recorded" are indistinguishable from inside the data. There is no field that separates them. Both render as the same empty result set, the same flat line, the same blank dashboard panel.
This is what makes null results uniquely treacherous compared to wrong ones. A wrong number tends to announce itself eventually — it contradicts something, it fails a sanity check, someone says that can't be right. A zero contradicts nothing. It's perfectly consistent with a world in which the thing you're measuring simply doesn't happen. It slots neatly into whatever story you already believed, which in both my cases was a story I found quite easy to accept.
Worse, a zero is actionable in a way that invites you to stop looking. It says: this channel is dead, this page is orphaned, move on. It closes the question. Both of my zeros came with a ready-made next step attached, and in both cases the next step was work I'd have done for nothing.
The habit that catches it
The fix is embarrassingly cheap, which is why it's worth making automatic: every zero needs a positive control.
Before you believe a null result, point the same instrument at something you already know should be non-zero. Not a different instrument — the same one, same query, same pattern, same code path. Then check that it returns something.
If I'd counted inbound links to a page I knew was heavily linked and gotten zero for that too, the broken pattern would have surfaced in about ten seconds. The failure was entirely visible; I just never gave it a chance to show itself, because I only ever asked the question where I didn't already know the answer.
The affiliate case is the same shape. One deliberate test click through the full path — link, redirect, dashboard — would have made the silence audible immediately. That test is five minutes and you do it once, at setup, when you still remember what the system is supposed to do.
The general rule I'd write on the wall: any measurement pipeline that has never once produced a non-zero reading has not been tested. It's not reporting an absence. It's reporting nothing at all, and you have no basis to tell those apart.
Sometimes you can't manufacture a positive. The event is genuinely rare, or producing one costs real money, or the only way to get one is to write fake data into production and hope you remember to take it out. That situation is common enough that pretending otherwise would make the rest of this advice easy to dismiss.
When it happens, the answer isn't to shrug and trust the zero anyway. It's to downgrade what the zero entitles you to claim. An uncontrolled null is not a negative result — it's an unknown, and it should sit in your head as I have no reading rather than the reading is nothing. Those two states feel identical and justify completely different decisions. One of them tells you to shut the channel down; the other tells you that you still have work to do before you're allowed an opinion.
What I changed
The links carry their partner ID now, and I confirmed the format against the platform's own link generator rather than guessing the parameter name — because a wrong parameter would have failed in precisely the same silent way, and I'd have congratulated myself on a fix that changed nothing.
The bigger change is procedural. Whenever a check comes back empty now, I ask one question before I do anything with it: what would this look like if my measurement were broken?
If the answer is "exactly like this" — and with a zero, the answer is almost always "exactly like this" — then I haven't found anything yet. I've just found a place where I need to look harder.
Top comments (1)
This lands because zero is often an observability bug wearing a business conclusion. Treating zero, missing, and not-yet-measured as separate states changes the whole investigation path, especially when dashboards quietly coerce null into certainty. The habit I'd add is alarming on impossible flatlines before the weekly review, because once a metric looks plausible people build strategy on top of it.