Hunting Down an Active-User Crash — Bots, Illusions, and an Indexing Collapse#
2026-07-17

The active-user graph in GA (Google Analytics) was falling fast. Few charts sink a blogger’s heart quite like that one. Were readers leaving? Had the domain migration gone wrong? Was something broken in the setup? I handed the whole investigation over to Claude Code, and the results were quite different from what I expected. Most of the crash turned out to be an illusion — while the real problem was quietly unfolding somewhere else entirely.
This essay documents the full investigation. I am leaving the diagnostic criteria and the order of checks intact, so that anyone facing a similar situation can walk through the same steps.
The Setup: The Graph Really Was Falling#
Some background first. About a month earlier, this blog had migrated to a new primary domain. The old domain was 301-redirecting (the HTTP response that signals a permanent move) to the new one, and the change of address had been filed with Google Search Console (GSC). Yet at some point after the migration, the active-user count — which had been climbing — started dropping steadily.
Looking at the daily graph alone, the decline was unmistakable. But as soon as the investigation began, it became clear that three separate illusions were stacked on top of each other.
Three Layers of Illusion: Spike Regression, an Unfinished Week, and Bots#
The first illusion was the baseline. Grouped into 30-day windows, active users had actually been on a steady upward trend for the past three months. What looked like a “crash” was the descent from one abnormal spike back toward the average. Regression to the mean right after a spike is not a decline — but a daily graph renders it as one.
The second illusion was a week that had not finished counting. The last value on the weekly graph appeared to have collapsed to the floor, but that week had only one day of data in it. Obvious in hindsight — yet on the graph itself, indistinguishable from a genuine crash.
The third illusion was the biggest: nearly half of the active users were not human. Split by country, the patterns diverge sharply.
| Traffic | Users : Sessions : Pageviews | Engagement rate | Time per session |
|---|---|---|---|
| From certain overseas datacenter regions | Exactly 1:1:1 | Single digits | Converging to 0s |
| Korea | 1:2.4:5.8 | Over half | Over a minute |
The first pattern means every visitor viewed exactly one page and stayed close to zero seconds. That is not how humans bounce — it is automated access: datacenter crawlers and AI scrapers. GA4 (the current version of GA) filters known bots by default, but undetected crawlers slip in as referrer-less direct traffic ((direct) / (none)) and inflate the active-user count.
The metric that proved decisive here was GA4’s engaged sessions. A session only counts as engaged if it lasts more than ten seconds, views two or more pages, or fires a conversion event — conditions bots almost never meet. Re-read through this lens, the picture flips completely. By active users, the United States appeared to outnumber Korea; by engaged sessions, Korea came out ahead by more than tenfold. The real readership split roughly 8:2 between Korea and overseas — and the overseas readers, few but real, were mostly reading the English pages.
The takeaway: the active-user count is far too easily contaminated to serve as a blog’s health metric. A wave of bots rolling in and out is enough to make the graph swing, sending the operator scrambling after a crisis that does not exist. Real readership should be measured in engaged sessions.
The Real Problem Was Unfolding Quietly#
With the illusions stripped away, actual readership was flat. So was everything fine? No. Opening GSC’s search impression data told a completely different story.
Daily search impressions, steady for a full month, suddenly bent toward the floor on a single day — and two days later were effectively zero. They stayed there for more than ten days. The change was barely visible in the active-user graph, because search traffic had been small to begin with. But it was the one genuine problem this investigation uncovered — the kind that, left alone, could erase the blog from search permanently.
Index Coverage Check: Hundreds Submitted, Only the Home Page Indexed#
To narrow down the cause, I ran a batch check of indexing status (whether a page is registered in Google’s database and eligible to appear in search results) through GSC’s URL Inspection API. The results were unambiguous.
- Of the hundreds of URLs submitted via the sitemap, the ones actually indexed: just two pages, including the home page
- Most of the sampled key pages: “Crawled - currently not indexed”
- Crawling itself was healthy: robots.txt allowed, page fetches succeeded, with crawl activity even on the day of the investigation
What made this state interesting is that nothing was technically wrong. Redirects, canonical tags, hreflang (the tags that link multilingual versions of a page), the sitemap, internal links — all checked, all clean. Googlebot was diligently fetching pages while refusing only one thing: putting them in the index.
This is not an error. It is a verdict. Google is extremely conservative about indexing domains that have not yet earned trust, and a domain one month past migration is exactly that. And this blog’s sitemap was configured in the worst possible way for that judgment.
Opening the Sitemap: 57% Tag Pages#
Analyzing the composition of the four-hundred-odd submitted URLs:
| Composition | URLs | Share |
|---|---|---|
| Tag and category pages | 233 | 57% |
| News briefs (including archive) | 46 | 11% |
| Substantive content (essays, books, apps, widgets) | 130 | 32% |
Tag pages are thin pages that merely list posts. Hugo (a static site generator) creates one automatically for every tag, and across Korean and English they added up to 233 — more than half the sitemap. From Google’s point of view, this site was submitting a set of pages that was mostly contentless lists. For a brand-new domain making its first impression, it is hard to imagine a worse configuration.
The Response: An Index Diet#
The response went down three tracks.
First, resubmitting the sitemap and requesting indexing manually. I resubmitted the sitemap in GSC to trigger reprocessing, and used the URL Inspection tool to request indexing directly for ten priority pages — the essays that had drawn the strongest response. Indexing requests have a daily quota (around ten), so priorities matter.
Second, the index diet. This is the work of pulling thin pages out of the sitemap and the indexable set to raise the average quality. A single predicate now lives in the Hugo templates, so that sitemap exclusion and the noindex meta tag (which tells search engines not to index a page) always share the same judgment.
predicate partial (one logic)
├─ tag / category pages → exclude all
├─ news briefs older than 30 days → exclude (timeliness expired)
└─ noindex: true in front matter → manual escape hatch
↓ ↓
dropped from sitemap.xml emits <meta name="robots" content="noindex">The 30-day condition on news briefs exists because stale news summaries carry little search value while making up a large share of publishing volume (60% of everything published in the last 90 days), continuously dragging down the average index quality. The site rebuilds two or three times a week, so the 30-day window rolls forward on its own.
The result: the sitemap shrank from 409 URLs to 148 — a 64% cut. The set of pages submitted to Google changed from “409 URLs, mostly tag listings” to “148 pages of substantive content.”
Third, upgrading the observation tools. The queries I had been writing by hand throughout this investigation — daily and weekly trends, per-country bot classification, per-domain traffic — were promoted into official modes of the GA reporting skill. The next time these symptoms appear, the diagnosis can run straight through the sequence: trend → bot contamination → domain.
A Bonus Finding: The Asymmetry in Content Strategy#
While pulling per-section performance during the investigation, an unexpected asymmetry surfaced. Over the last 90 days, 60% of the publishing effort went into news briefs — yet nearly all new readers arrived through essays, which made up only 25% of the volume. Search clicks and organic visits from overseas readers all came from essays. The news briefs, meanwhile, served a small circle of regulars on repeat.
This is no reason to stop publishing news. But it does redefine the roles: keep the news as a device for collecting material and staying on top of the field, and promote the topics that resonate there into essays. That pipeline is the composition the data points to.
Wrapping Up: The Order in Which to Doubt Your Numbers#
The lessons from this investigation, arranged as a checklist:
- Change the time window and look again. Is the daily crash still a crash at 30-day granularity? Mean regression after a spike and half-counted periods are not declines.
- Watch engaged sessions, not active users. If a country’s users : sessions : pageviews sits near 1:1:1 with single-digit engagement, it is bots. Real readers only show up in engaged sessions.
- Open GSC even when GA looks calm. A search-impression collapse is nearly invisible in the visitor graph. After a domain migration especially, check indexing status directly.
- When “Crawled - currently not indexed” appears at scale, suspect a quality verdict, not a misconfiguration. Then open your sitemap composition and ask: are you submitting only the pages worth showing a search engine?
In the end, the crashing active-user graph was not a signal of readers leaving. It was the space left by departing bots, an unfinished week, and — hiding behind them — the real problem: an indexing collapse on a young domain. Numbers do not lie, but which numbers you look at changes the entire story.
The effect of the index diet should become visible over the next one to three weeks. I will follow up with the recovery story.