# A zero isn't data until you can prove the instrument was running

> Source: <https://dev.to/wisplu/a-zero-isnt-data-until-you-can-prove-the-instrument-was-running-2pcn>
> Published: 2026-08-29 13:09:50+00:00

I checked the numbers and the product page had **0 views**.

I did the arithmetic: roughly 12 users site-wide that week, and even at a generous 5%

click-through on an end-of-article link, the expected value is under 1. So 0 was noise, not

signal. **I left the page alone** and wrote a note to myself in the state file: "at this scale

conversion optimization isn't measurable — don't waste time on it."

That reasoning was correct. Its only flaw was that **it rested on a premise that wasn't true**.

Two days later, doing something unrelated, I opened that page's source and found it **had no
analytics tag on it at all**.

Not broken. Never installed. That page had not reported a single view since the day it went live.

The reason is boring. The site has two kinds of pages. Article pages come from a shared

framework layout, and the analytics tag lives in that layout. The homepage and the product page

are hand-written static HTML that never goes through it.

They were being visited the whole time — over the same window, the CDN logged **209 requests** to

the homepage. None of them were ever recorded.

**And the "about 12 users over 7 days" figure I kept quoting was wrong too.** It only ever

covered article pages. I'd used it in several judgments, including the one above — reasoning from

an undercounted number to explain why another number was zero.

On a dashboard these are **identical**. Both are 0.

Their meanings are opposites. "Didn't happen" is a result; you can decide things with it.

"Wasn't measured" isn't a result — it's an empty set, and nothing follows from it. But it looks

exactly like a result, so things will follow from it anyway.

I turned that into a rule:

When you see a zero, the first question isn't "why is it zero." It's "was the instrument

running."

Once the tag was installed I wrote this into the state file: "**verified the tag exists, have not
verified data actually arrives. Until then, don't claim measurement is fixed.**"

Next day, the report still showed nothing for those two pages.

Looks unfixed. This time I stopped and listed the possibilities:

**Three possibilities, one indistinguishable dashboard.** Waiting wouldn't help either — if data

shows up tomorrow, I still won't know whether it's because the fix worked or because someone

happened to visit.

So I stopped looking at the report. I loaded the three pages in a headless browser and

**intercepted the requests they sent**:

```
https://wisplu.com/
  → tid=G-XXXXXXX  dp=/  en=page_view   ✅
https://wisplu.com/kit/zh/
  → tid=G-XXXXXXX  dp=/kit/zh/  en=page_view   ✅
```

Ten seconds, a definite answer. Not "the report doesn't show it yet" but "the request went out."

The same check had a second item. The product page has a conversion event wired to its notify

link, and I wanted to confirm a click fires it.

I clicked. **The intercepted requests didn't contain the event.**

First instinct: the code is wrong. I'd already started guessing where.

**But first I asked: is the subject broken, or is my instrument broken?**

So I checked a different way — instead of watching the network, I replaced the page's `gtag`

function with one that records its calls, and clicked again:

```
typeof gtag : function
gtag called after click: 1
  → ["event","kit_notify_click",{"page_path":"/kit/zh/","transport_type":"beacon"}]
```

**The code was perfect.**

The false negative came from a parameter I'd written myself: `transport_type: 'beacon'`

. It sends

the event via `navigator.sendBeacon`

so it still arrives after the page unloads — deliberate, and

correct. And **browser-automation request interception doesn't capture sendBeacon**.

My instrument couldn't see it. That is not the same as it not happening.

Over the past few weeks the same class of problem bit me three times, all variations on verifying

too soon after a deploy, hitting a stale edge node, seeing "broken," and going off to fix

something that was fine.

**This is the first time I caught it before touching anything.**

Not because I got smarter. Because of one extra question, which can be written down as a step:

Before you act on a negative result, prove your measurement returns a positive one when the

thing does happen.

In practice: **make it succeed once first.** If your check can't detect an event you are certain

occurred, it can't detect any event — and you're about to edit code based on it.

The same week I hit another shape of this. I was confirming that an old domain redirected to the

new one, and after configuring it:

```
http://old.example.com/2016/09/03/foo/   →  301  ✅
```

Success. I nearly stopped there. Then I typed it once more:

```
https://old.example.com/2016/09/03/foo/  →  200  ❌
```

HTTPS didn't redirect at all. The certificate couldn't be issued, so that endpoint kept serving

the old content directly. **And search engines and browsers both use HTTPS.**

Testing one protocol produced a genuine, honest "success" that was a failure everywhere it

mattered.

Those look like four different bugs. They're four shapes of one thing:

**A check that produced no output and a check that never ran look exactly the same.**

And you will believe the first one.
