I blocked /jobs?* pages from getting indexed. I kept filters usable for users (and shareable). I generated canonicals + noindex consistently in App Router. I wrote a tiny script to catch regressions before deploy. Context I’m building a job board for Psychiatric Mental Health Nurse Practitioners. Next.js 14. App Router. Supabase Postgres. The data’s big enough to hurt. 8,000+ active listings. 2,000+ companies. I scrape 200+ jobs daily. The UI needs filters. Location, remote, salary, posted date. And Google loved my filters. Too much. I ended up with thousands of crawlable URLs like /jobs?remote=true&state=CA&salaryMin=160000 . Same content. Slightly different. Crawl budget drain. Index bloat. Brutal. I didn’t want to kill filters. Users need them. I just needed Google to index the right pages. 1) I decide what’s indexable. Everything else is noindex . I keep it simple. /jobs (no filters): indexable. /jobs?remote=true (one “primary” filter): indexable. Anything else: noindex,follow .…