A post-mortem with the Search Console data, including the recovery.
Ten days ago I did something that looked like good SEO hygiene and cost my site more than half its organic traffic in under a week. The cause was embarrassingly ordinary, the recovery was fast once we found it, and there’s a natural experiment buried in the crawl data that makes the whole thing unusually easy to prove.
Posting the numbers because I couldn’t find anyone who’d published this particular failure with the data attached.
The setup
PixelPanda is a small AI image tools site — DR 43, nothing special. Almost all of our organic traffic comes from free tool pages that rank on their own: background remover, image upscaler, merge images, and so on.
We’d been running a directory-listing campaign to close a link gap against a bigger competitor. Standard stuff: get listed on the AI tool directories, several of which want a “Featured on” badge on your site in exchange, and a couple of which we paid for.
On 23 August, across five commits between 10:55 and 20:00, we shipped a “Featured on” badge strip into the site footer. Nine outbound links. Because the footer is in the base template, it landed on every page on the site.
Every one of those links carried rel="noopener" and nothing else. Which means every one of them was dofollow.
The crash
Rankings fell off a cliff the next morning.
date day clicks impressions avg position
2026-08-20 Thu 821 31,802 11.1
2026-08-21 Fri 720 30,617 11.3
2026-08-22 Sat 687 30,413 11.5
2026-08-23 Sun 709 27,246 12.0 <- badges shipped
2026-08-24 Mon 500 19,689 17.1 <- onset
2026-08-25 Tue 268 13,937 31.7
2026-08-26 Wed 240 12,986 35.5
2026-08-27 Thu 225 12,639 35.6
2026-08-28 Fri 189 11,858 36.6
2026-08-29 Sat 190 14,823 42.1
Week over week that’s 5,402 clicks down to 2,329 — a 57% drop. Average position went from ~11 to 42.
The shape mattered more than the size. This wasn’t a few pages losing rankings — it was the entire /free-tools/ section demoted roughly uniformly, while the homepage barely moved:
| page | position before | after |
|---|---|---|
| /free-tools/merge-images | 9.1 | 37.5 |
| /free-tools/make-image-transparent | 8.8 | 36.3 |
| /free-tools/image-analyzer | 7.3 | 21.8 |
| /free-tools/image-to-prompt | 10.9 | 63.0 |
| / (homepage) | 3.7 | 6.0 |
Uniform demotion across a whole section, with the homepage largely spared, is the signature of a site-level signal rather than a content problem on any individual page.
What we ruled out
- Manual actions — none in Search Console.
- Security issues — none.
- robots.txt — clean,
Allow: /. - Deindexing — indexed page count was flat and rising through the period.
- Page health — 200s, correct canonicals, single H1, no stray noindex.
- The August algorithm volatility — that was 1–6 August. We were flat through it: 783, 837, 775, 812 clicks. Google’s last confirmed ranking update was months earlier.
Then we went through every commit in the window. New landing pages, some API changes, a BigCommerce callback, docs. Exactly one change touched every page on the site: the badge strip.
The diagnosis
Thousands of sitewide dofollow links pointing at directories — several of which we had paid for that same day, and one of which was a reciprocal badge-for-listing exchange.
That is a textbook link scheme under Google’s link spam policy, and the part people forget is that the policy demotes the linking site, not just the recipient. We had effectively turned our entire site into a paid link farm pointing outward, in an afternoon, without thinking of it that way even once.
The fix
One commit. All nine links changed to:
rel="sponsored nofollow noopener"
Badges stay up, listings stay live, the directories keep their placement. Only the link equity stops flowing. We shipped it on 30 August at 09:44 local and then pushed the demoted URLs into the Indexing API to speed up re-crawling.
The recovery
date day clicks impressions avg position
2026-08-29 Sat 190 14,823 42.1 <- trough
2026-08-30 Sun 362 16,994 31.2 <- fix shipped
2026-08-31 Mon 391 17,687 21.3
2026-09-01 Tue 469 18,917 12.4
2026-09-02 Wed 497 20,975 12.4
Average position is back to 12.4 — essentially where it was before the crash. Clicks are still roughly a third below baseline and I expect that to keep closing as more pages get re-crawled.
The natural experiment
This is the part that convinced me, and it’s the reason I’m posting.
Google doesn’t re-crawl every page at once. So on any given day after the fix, some pages had been re-fetched with the nofollowed footer and some hadn’t. That gives you a controlled comparison for free.
Here’s every page we tracked, with its last crawl date from the URL Inspection API:
| page | before | trough | 2 Sept | last crawled |
|---|---|---|---|---|
| make-image-transparent | 8.8 | 36.3 | 8.7 | 3 Sept |
| image-analyzer | 7.3 | 21.8 | 6.6 | 4 Sept |
| round-corners | 6.9 | 19.6 | 7.5 | 30 Aug |
| merge-images | 9.1 | 37.5 | 11.6 | 4 Sept |
| ai-selfie | 7.2 | 22.3 | 11.7 | 2 Sept |
| image-upscaler | 20.7 | 51.6 | 26.6 | 1 Sept |
| image-to-prompt | 10.9 | 63.0 | 44.7 | 27 Aug |
Every page Google re-crawled after the fix has recovered to roughly its old position. The one page it has not re-crawled since before the fix — image-to-prompt, last fetched 27 August — is still sitting at 44.7.
Same site, same fix, same day. The only variable is whether Googlebot has been back yet.
What I’d tell you
A footer link is not one link. It’s one link times the number of pages on your site. Ours became about 15,000 outbound dofollow links to paid directories overnight. If we’d put those nine links on a single /featured-on page, none of this happens.
“Directory listing” and “paid link” can be the same thing. Nobody sold it to me as a link purchase. I paid for listings, they asked for a badge, I added the badge. The label on the invoice doesn’t change what the markup does.
rel="sponsored nofollow" costs you nothing here. You keep the badge, the listing, the referral traffic and the social proof. The only thing you give up is passing equity you never wanted to pass.
Check what your footer does after every campaign. This took six days to notice because we were watching signups, not average position, and the badge work didn’t look like an SEO change. It looked like marketing.
Diff your commits against the onset date. The single most useful thing we did was list every commit in the window and ask which ones touched every page. That narrowed it from “something is wrong” to one candidate in about ten minutes.
Happy to answer questions about the diagnosis. The Search Console figures above are unedited day-level exports; the position numbers are page-level averages over the ranges shown.