On 5 July 2026, search traffic to menudojuego.com stopped. It did not decline — it stopped. From around 600 daily impressions to single digits, and it stayed there.
The site is mine, so I had access to everything: server, database and logs. It is a side project with modest traffic — what makes it useful as a case is not the size of the numbers but that the whole diagnosis can be told, with no client secrets in the way.
Ruling out the obvious first
I started by ruling out a technical fault, because the easy answer is usually the wrong one. Two weeks of nginx logs showed Googlebot receiving 1,640 successful responses across 871 distinct URLs, with almost no errors. Crawling was healthy. Over that same period, five visitors arrived from Google.
That rules out a fault and leaves a worse problem: Google was coming in, reading the pages correctly, and deciding not to rank them. These are two opposite problems — "Google cannot get in" and "Google gets in and decides you are not worth it" — with opposite solutions. Confusing them costs months.
The drop lined up with a Google spam update that ran from 24 to 26 June, with volatility continuing into early July.
The cause: a catalogue with nothing of its own
Of 3,346 indexed pages, only 102 had anything of ours on them. The other 3,244 repeated the same synopsis from a third-party database, machine-translated. Thousands of equivalent pages with nothing inside.
The uncomfortable decision was to remove 26% of the pages from the index so that every page left had a reason to exist. Fewer pages, all of them with something. The indexing rule changed from measuring demand (how many people search for this game) to measuring contribution (what have we added that was not already there).
The two findings that mattered
Two things surfaced along the way, and they turned out to be the important ones.
The only original content was invisible to Google. The
pages compare prices across stores — that is what the site adds and the
original source does not have. But they were fetched in a
useEffect, which only runs in the browser. The crawler
never saw them. Pages were being indexed for content Google could not
reach.
Incremental regeneration had not worked for months.
The page declared revalidate = 300 and the server answered
Cache-Control: no-store. My first theory was a
misconfigured fetch. I fixed it and nothing changed. The real cause is
that in Next.js 15, a dynamic route without
generateStaticParams is always served on demand and the
revalidate value is ignored. I confirmed it by comparing
next build output before and after: the route goes from
dynamic to statically generated. Until then, every Googlebot visit to
each of the 3,346 pages triggered a full server render against the
API.
Where it stands today
As of 11 August 2026: 2,699 indexed pages, all of them with a real price; 2,696 games with prices checked twice a day, up from 102 in July; 2,531 with an all-time low recorded, so the page can say not just what a game costs but whether that price is any good.
What I do not know yet
This shipped a day ago. Algorithmic demotions usually do not reverse until another update runs, and only if the underlying problem is genuinely fixed. That means months, not weeks. Right now I can demonstrate the diagnosis and the decisions, not the traffic outcome. When I have it, I will update this case with whatever it says — including if it says I was wrong.
Stack: Next.js 15, NestJS, PostgreSQL, Docker, nginx, self-managed VPS. My own project, nothing confidential — which is why it can be told in full.