That sentence made my stomach tighten. Six days earlier, I had called the launch clean.
The new theme was live. Checkout worked. Mobile pages felt quick. The redirects we knew about had passed our tests. I had even shared a screenshot of the performance report with several green circles on it.
Now the store's most reliable organic landing page was losing impressions, and nobody knew why.
I wanted the problem to be a bad deployment. A bad deployment has a comforting shape: find the commit, repair it, go home. Instead, the storefront looked healthy. The product opened from a direct link, the buy button worked, and the admin showed the correct inventory.
The shop sold handmade lighting through a hosted commerce platform. Its catalog had about 180 products—large enough to create messy edge cases, but small enough that the team believed it could still be managed by eye.
I opened the missing product page and ran through my usual checks: The server returned 200 OK. The page was allowed to be crawled. Its canonical tag pointed to the preferred URL. The product appeared in the XML sitemap. The title and description were present in the HTML.
By 10:00, I had collected plenty of reassuring evidence and still had no answer.
Then the administrator joined the call. While I was talking about response codes, she said, almost as an aside, “I renamed one of the collections last month. The old name sounded too plain.”
The collection used to be called Desk Lamps. During the rename, its public URL changed as well. The new address looked better inside the menu, but the old address returned a 404.
Two design articles and an old newsletter still linked to that previous URL. Those links had been carrying people—and search authority—to the collection for more than a year. We had quietly led all of them into a dead end.
The administrator had not made a foolish choice. She improved the wording she saw in the dashboard. The dashboard did not show the history attached to the old address, and our release checklist never asked her to preserve it.
A 301 tells browsers and crawlers that a resource has moved permanently. More importantly, it lets an old path keep doing useful work instead of becoming a wall.
I returned to the new collection and scrolled through it like a customer. The first 24 products appeared immediately. A Load more button revealed the rest.
The interaction felt smooth, so it had passed visual QA. But when I inspected the initial HTML, the later product links were absent. They appeared only after JavaScript handled the button click.
A crawler follows addresses. It does not explore a shop with the curiosity of a person. If the next group of products has no ordinary link, discovery becomes fragile.
JavaScript could still intercept that link and update the grid without a full reload. If the script failed—or a crawler read the page without clicking—the address remained available.
This was the point where I felt embarrassed. I had spent time smoothing the animation between product batches. I had never asked whether the second batch had a path of its own.
The sitemap listed the product, but a sitemap is only an announcement. Internal links show how a page belongs to the store. We had supplied the announcement and forgotten the road.
