Hi! I want to tell you a story about two weeks we spent figuring out who tanked our site in Google. We found someone, we were pleased with ourselves, and then it turned out we'd got the wrong guy.
A bit of context first. We build Toolevia, which is eighty-four file tools that run right in your browser: merge PDFs, strip the background off a photo, work out how much a mortgage really costs, that sort of thing. The file never leaves your machine, because there isn't a server in the picture to send it to. We spent three months writing it, and in August we shipped the whole thing over three weeks: 84 tools in 58 languages, which multiplies out to 5,104 pages.
And, to our mild surprise, it took off. On August 8 Google had 494 of our pages in its index; ten days later it had 2,218, and on the 20th the site showed up in search results 1,269 times in one day. For a domain that was two weeks old this felt genuinely good, and I'll admit we got a little pleased with ourselves.
Then on August 21 we had 1,134 impressions. On the 22nd, 216. On the 23rd, three. Not three thousand, not three hundred — three, for the whole day. And that's roughly where it stayed, somewhere between one and seven a day, right through the end of the month, as if someone had turned the dial all the way down and gone home.
Bars are how many pages Google reported as indexed in its own snapshots; the line is daily impressions. The red dashed line is the day in question.
Which is honestly the most comforting theory there is, because anything you broke yourself you can also fix yourself.
So we went into Search Console. Manual actions: "No issues detected." Security: "No issues detected." Server errors: zero, ever. But 1,337 pages had left the index, and another 1,406 were sitting in "Crawled – currently not indexed," which, if you think about it, is the most insulting status Google offers. It downloaded the page, read it, and decided it didn't want it. Not "couldn't" — didn't want to.
Then we went over the site properly, all of it rather than a sample, after first checking that production was serving byte-for-byte what we had in the build directory. Here's how that went.
| What we checked | How much | Result | |---|---|---| | Sitemaps | 58 sitemaps × 88 URLs | all 200, no duplicates | | Canonical | 5,162 pages | self-referencing everywhere | | hreflang cluster | 59 alternates × 5,104 pages ≈ 300,000 links | not one dangling | | Structured data (JSON-LD) | 19,952 blocks | 0 parse errors | | Breadcrumbs | 5,046 pages | "Validated", 0 issues | | robots.txt, X-Robots-Tag, redirects | — | nothing blocked, www and http → 301 | | Manual actions, security | — | "No issues detected" | | Server errors, all time | — | 0 | | SEO code changes, two weeks either side | layout, seo.ts, sitemap generator, hosting config | untouched |
The only things that changed in that window were translation dictionaries and three UI components.
You know what's worse than a broken line in robots.txt? Not having one. A broken line you fix in a minute, hit "request indexing," and go get a coffee. Here there was nothing to fix.
Since we were in there anyway, we found our own sins, and I'll be honest about them because they're instructive.
Sin number one: we changed the URLs of pages that were already published. Everyone knows you don't do that, we knew you don't do that, and we did it anyway — at scale. We renamed 159 URLs in a single day when three tools got better names in all 57 languages at once. That left 208 dead URLs, 122 of which Google had already filed under 404.
Sin number two is dumber. Our sitemap generator, if a language didn't have its translation yet, would fall back to the English URL and put that in the sitemap instead. Between "English text is live" and "the other 57 translations have landed" there were usually a few hours, and during those hours the sitemap contained ghosts like /bn/multiple-pages-per-sheet-pdf/ that died the moment the Bengali arrived. Google barely caught any of them — seven in a sample of a thousand — but the mechanism fired on every single tool.
We've closed both: the dead URLs now 301 to their replacements, and slug changes and the sitemap are guarded by checks that won't let it happen again. But neither explains the drop. 208 out of 5,104 is four percent, and we lost two-thirds.
Here's where I have to confess. This theory was mine, and I bought it immediately and completely.
Look how nicely it fits. Waves 7 and 8, our last seventeen tools, nearly a thousand pages, shipped between August 22 and 29. The drop started on August 22. A young domain gets five thousand pages dumped on it in three weeks, the same text multiplied across 58 languages, and Google — obviously — decides it's looking at textbook scaled content abuse and cuts the whole thing off. The dates line up, there's a motive, the picture is clear.
Clear enough that I didn't want to test it. Which is exactly why we tested it in a way that could make it fail, rather than a way that would confirm it.
