Building a map of every fishing water in Poland

polskielowiska.pl puts every PZW water in Poland on one map, with the rules, the fish and how sure we are about each of them. Programmatic SEO took it to 146,000 clicks from Google in three months. Then, on one night in July, 90% of them were gone.

ROLE
Everything: product, data, SEO. Code with Claude Code.
SINCE
March 2026
STACK
Claude Code, Next.js, SQLite, Leaflet, OpenStreetMap, own VPS
STATUS
Live, rebuilding trust with Google
146k
clicks from Google in three months, May–July 2026
−90%
of those clicks gone overnight, on 16 July
22,500+
waters on the map, unverified ones marked, not hidden

Clicks: Google Search Console. Waters: the site’s database, 1 Nov 2026. Visitors: Google Analytics, updated twice a day.

01 THE IDEA

AllTrails, but for Polish fishing

The Polish Angling Association (PZW) manages thousands of waters, but the information lives in PDFs, regional websites and permit lists that don’t talk to each other. If you want to know where you can fish near you, and on what permit, you are on your own.

On 10 March 2026 I scraped pzw.pl and put 1,940 waters on a map. Six days later it had its own domain. By the end of April, an import from OpenStreetMap added over 10,000 rivers and lakes.

polskielowiska.pl map of Poland with clusters of fishing waters, rivers drawn in blue, filters on the left
The map today: every water, filterable by type, owner and region. Click to enlarge.

02 HOW IT GREW

One page for every water, and Google noticed

Every water got its own page, and so did every municipality, district and species. That is programmatic SEO: thousands of pages built from one database. On 7 April Google indexed 3,530 of them in a single night.

  1. 10 Mar 2026MVP1,940 waters, map, sitemap
  2. 7 AprIndexed35 → 3,530 pages overnight
  3. 25 Apr+10k watersOpenStreetMap import, own server
  4. 5–8 JunTrust workProof levels, honest labels
  5. 12 JulPeak4,349 clicks in one day
Every step, with dates
  1. 10 Mar 2026First versionMap of PZW waters, a scraper and the SEO basics, deployed the same day.
  2. 16 Marpolskielowiska.plOwn domain, first impressions in Search Console the next day.
  3. 7 AprGoogle indexes the siteFrom 35 indexed pages to 3,530 overnight.
  4. 10–12 AprDistrict pages, Vercel limitsThe free hosting tier ran out of room for this many pages.
  5. Late AprOwn server, OpenStreetMapMoved to a VPS; +4,889 rivers and +5,441 lakes and ponds.
  6. May388 commitsThe busiest month: unverified status, search logging, monitoring.
  7. 5–8 JunTrust workProof levels, honest verification, salmonid caution, an inbox for corrections, a twice-daily search-gap monitor.
  8. 12 JulPeak4,349 clicks from Google in one day.
  9. 16 JulThe drop2,897 clicks the day before, 300 that day.
  10. 21–29 JulFirst responseThin pages out of the index, 6,510 unproven waters checked one by one.
  11. 4–5 AugTold the story in publicOn LinkedIn and in an X article.
  12. From ~20 AugSecond blowGoogle starts dropping pages from the index.
  13. 29 SepRecovery planNew sitemap, 2,932 empty pages noindexed, a linking bug fixed.
  14. 22 OctDe-indexing stopsNo recovery in clicks yet.
21 Mar31
7 Apr3,530
21 Apr6,900
Jul–Aug~33,500
21 Sep21,300
16 Oct20,500
Pages in Google’s index on selected days · Search Console · the July and August values are read off the chart (~33.5k)

03 HONEST DATA

Unverified waters are marked, not hidden

A map like this is only useful if you can trust it at the water’s edge. So every water carries a proof level: from an official PZW register down to “we found it, but can’t confirm who manages it”. The site never claims PZW management without proof, warns about method rules on trout and grayling waters, and has an inbox for anglers who spot a mistake.

Behind it, a monitor runs twice a day: it reads what people searched for and didn’t find, researches it and fills the gap.

Water page for Lake Śniardwy on desktop: photo, rating, and a notice that PZW management is not confirmed
A water page, with the honest notice up top
The same water page on a phone
81% of clicks come from phones

04 THE DROP

146,000 clicks in three months, then a wall

Between 2 May and 31 July the site got 146,000 clicks and 4.39 million impressions from Google, at an average position of 7.2. Millions of impressions, for a fishing map I started building in March. I still can’t quite believe that part. On 12 July it had its best day ever: 4,349 clicks. Four days later it had 300.

12 Jul4,349
15 Jul2,897
16 Jul300
26 Jul336
Clicks from Google per day, July 2026 · Search Console API

It wasn’t a ban. Search Console showed no manual action, the server was up, and the number of indexed pages didn’t move. Google simply stopped showing the site for thousands of long-tail searches, all sections at once. No update was announced for that day, so the honest answer to “why” is: I don’t know for sure.

My own read: it was partly a victim of its own success. Traffic grew extremely fast on thousands of new, young pages, and growth like that is exactly what makes Google look twice.

The second blow came a month later. From around 20 August Google started dropping pages from its index: from about 33,500 to 21,300. The pattern was clear once I checked a fixed sample of 1,020 pages. Big lakes stayed (97% indexed); tiny ponds under a hectare didn’t (53%). Thin pages were the ones going. I also found my own bug: the “nearby waters” block didn’t sort by distance, so 87% of water pages got no links from their neighbours.

05 WHAT I DID

Fewer pages, better pages, no tricks

  • Took about 1,160 thin hub pages out of the index in the first week.
  • Checked 6,510 unproven waters one by one: 588 promoted, 2,684 hidden from Google.
  • Zero-downtime deploys, so Googlebot never sees an error page.
  • Fixed the nearby-waters linking, rebuilt the sitemap with honest dates, noindexed 2,932 pages nobody ever saw.
  • Wrote real guides: species, techniques, the fishing calendar.

What I chose not to do: move to a new domain, roll everything back, or pad pages with filler text. Guessed information is worse than none on a site people use to decide where to drive with a rod.

Week of 3 Aug1,662
Week of 21 Sep734
Week of 28 Sep816
Week of 12 Oct599
Clicks from Google per week (weeks start on Monday), 3 Aug – 18 Oct 2026 · Search Console

06 WHERE IT IS

Still standing, still used, still waiting

By late October the de-indexing had stopped and 85% of the pages I still submit are indexed. Clicks haven’t come back, and the fishing season is slowly ending anyway. The fair comparison is spring 2027 against spring 2026.

The best signal didn’t come from Google. Owners of private waters wrote to me because anglers had shown up saying “polskielowiska.pl says I can fish here”. My information about those waters wasn’t accurate, and I corrected it the same day. But it told me something no chart could: people really do use the site to decide where to go.

Right now the site keeps itself fresh: every day it updates the waters of each PZW district with what the local clubs publish, on autopilot. Next up is social media, and over the winter most likely a redesign.

Further out, that points to where I want to take it. There are a few ideas on the table, and private waters are the strongest one: owners who want anglers, anglers who want a place they can trust. Meanwhile a new door opened anyway: about one in ten visits now comes from ChatGPT.

The lesson I’d pass on: programmatic SEO works, right until Google decides your pages aren’t worth showing. Build the pages you would want to land on, because one day that is the only kind that stays.

07 SEE IT