Journal

The publisher whose traffic “collapsed” and had never been real

Page views down ninety percent in a week. The site had not lost an audience. It had lost a counting error. Here is what was actually going on.

One of South Africa’s best-known consumer-technology publishers called us in a panic. Their analytics showed page views down almost ninety percent in a single week. Nothing had been changed on the site, nothing had been published that could have caused it, and the ad revenue forecast was built on the old number.

What we found was more uncomfortable than an outage: the old number had never been real.

Thirteen page views per session

We pulled the GA4 data properly, through the API rather than the dashboard, and looked at views per session over three years. In 2023 the site recorded about two views per session, which is normal for a news site. Then it climbed: seven, ten, twelve, thirteen and a half. Users and sessions were flat the whole time. Only page views grew.

The cause was in Google Tag Manager. Over several years, three separate Google tags had been added, each firing on every page, each on multiple triggers. A WordPress analytics plugin added a fourth copy outside GTM. Every real page view was being counted up to eleven times. When the tags were finally consolidated, page views dropped to reality overnight. The site had not lost an audience. It had lost a counting error.

The real audience, and what it depended on

With honest data the picture was clear. Around three thousand real users a day, roughly a hundred thousand sessions a month, stable. More than sixty percent of Google traffic came from Discover, not Search, and Discover was extremely spiky: one viral article in July delivered a third of the quarter’s Discover clicks on its own. Search visibility was fine but click-through was under one percent. Visibility without clicks is a headline problem, not a ranking problem.

The infrastructure underneath

While we were in there, the server told its own story. The CDN that robots.txt claimed was in front of the site had been removed years earlier. The page cache was being served through PHP on every request, so the database was running at seventy to ninety percent of a core all day. Scrapers with fake browser user agents were producing forty thousand requests a day, which is what had made the “server traffic” look healthy. The news sitemap advertised to Google returned a 404.

In one afternoon we put the CDN back in front with strict TLS, made nginx serve the page cache directly (article time-to-first-byte went from 139ms to 25ms), blocked the scraper fleet at the edge, wrote a news sitemap plugin that generates on the fly, and removed the duplicate schema that two plugins were both emitting. Later we routed the analytics tag through the CDN so ad blockers stop eating the measurement.

What we told the client

Not what they wanted to hear. The traffic had not fallen; the baseline was fictional, the audience was smaller than everyone believed, and it depended on viral Discover spikes. But a true number you can plan on beats a flattering one you cannot. Within a week the editorial team had a target list of high-impression, low-click topics to rewrite and a fuel-price page strategy to own the one recurring query that was costing them thirty-five thousand impressions a month for forty-eight clicks.

If this sounds familiar

If your dashboards are telling you a story that does not match your revenue, the dashboards are probably wrong. We audit measurement before we touch anything else, because every other decision sits on top of it. This is the publishing work we do.

Got a similar problem? Talk to us.

Start a project