Scaling Programmatic Faceted Search Without Drowning in Crawl Waste

Learn how I scale programmatic faceted search to millions of pages without burning crawl budget. Avoid the canonical trap and fix your facet architecture.

14 min readUpdated:
Scaling Programmatic Faceted Search Without Drowning in Crawl Waste
I’ve built programmatic search architectures for e-commerce giants, massive real estate portals, and aggregators with millions of listings. I’ve watched Googlebot hit a server cluster so aggressively that it caused a site-wide outage, all because a junior developer left a dynamic pricing slider open to indexing.

Scaling programmatic faceted search is the holy grail of modern technical SEO. When done correctly, you capture every conceivable long-tail search query your potential customers are typing into Google. Blue Nike running shoes size 10. Two-bedroom apartments in downtown Austin under $2000. These are high-intent, high-converting queries. But capturing them programmatically comes with a massive, highly destructive side effect: the creation of an infinite URL space.

If you don't control the pathways search engines use to navigate your facets, you will bleed crawl budget. You will spawn millions of useless, thin pages. And your most important pages will be completely ignored by crawlers.

The Infinite Permutation Nightmare

Let’s break down the mathematical reality of faceted navigation. You know the drill. A user clicks "Blue". Then "Nike". Then "Size 10". Then "Under $50". Suddenly, you have a URL that looks like `?color=blue&brand=nike&size=10&price=0-50`.

Multiply this by thousands of product categories. You've just birthed a theoretical infinite space. Most of these combinations have absolutely zero search volume. Nobody is searching for Yellow Adidas basketball shoes in size 4.5 for under $10. Yet, if your site architecture allows it, a bot will eventually find that combination and crawl it.

Search engines are remarkably dumb when traversing unstructured facets. They see an HTML link, they extract the `href`, and they add it to their crawl queue. They do not care if the page makes logical sense. They will crawl every single overlapping combination until your crawl budget is scorched earth.
1,600
Combinations for just 10 brands, 5 sizes, 8 colors, and 4 prices
800,000+
Generated URLs across 500 standard categories
99.8%
Average percentage of facet combinations with zero search volume

Mistake #1: The Canonical Band-Aid

I see this constantly during technical SEO audits. A team realizes they have a facet problem, so they slap a `` on every single parameterized URL and call it a day.

I despise this advice. Google ignores canonical tags on faceted pages more than half the time anyway.

Why? Because a canonical tag is merely a hint, not a directive. If your root category shows 100 products, and a user applies three filters so the page only displays 2 products, Google’s algorithms look at the DOM and decide the pages are fundamentally different. They will ignore your canonical hint and index the parameterized page anyway.

More importantly, canonicals do not save crawl budget. Googlebot must initiate a network request, download the HTML, render the DOM, and parse the `` just to see your canonical tag. By the time it processes the tag, the compute resources are spent. You’ve already paid the price of the crawl.

Mistake #2: The Nuclear robots.txt Option

The second common trap is the nuclear option. A stressed-out SEO opens `robots.txt` and drops a `Disallow: /?` or targets specific parameters with `Disallow: /*?color=`.

Relying solely on robots.txt for granular facet control is lazy engineering.

When you blanket-disallow parameters, you inevitably block essential tracking parameters, UTMs, or internal site search logic. Worse, you completely trap link equity. If a major publication links to your highly specific filtered view because it perfectly matches their article's topic, and you block it via robots.txt, that PageRank vanishes into the void. It cannot flow through your site. You have essentially built a dam blocking the SEO river. You create orphan URL paths and sever the connection between your categories.

How I Actually Fix This: The Search-Demand Matrix

So, how do I actually fix this at scale? I build what I call a Search-Demand Matrix. We stop guessing what gets indexed. We let hard data dictate the architecture.

I programmatically pull search volume data via APIs—like DataForSEO or standard Keyword Planner scripts—and cross-reference it with our available facet combinations in the database. If the data shows that "Blue Nike Shoes" has 5,000 monthly searches, that specific permutation is mathematically unlocked.

Once unlocked, our system automatically rewrites the URL to a clean static path (e.g., `/shoes/nike/blue`), updates the canonical to self-reference, injects an optimized `` and `<h1>`, and adds it to the XML sitemap. <br /><br />If "Yellow Nike Shoes Size 4" has zero searches, it remains a standard parameter-based URL (e.g., `/shoes?brand=nike&color=yellow&size=4`). If a facet combination has zero search volume, it is a UI state, not a web page. Stop trying to index UI states. Treat them as distinct interactive elements rather than crawlable destinations.</div><div class="my-8 grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"><div class="rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/30 hover:bg-surface/70"><h4 class="mb-2 text-sm font-semibold break-words">Search Volume Thresholds</h4><p class="text-sm leading-relaxed text-muted">Only facet combinations exceeding 20 searches/month are dynamically assigned clean URLs.</p></div><div class="rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/30 hover:bg-surface/70"><h4 class="mb-2 text-sm font-semibold break-words">Clean URL Rewriting</h4><p class="text-sm leading-relaxed text-muted">Convert complex parameter strings into structured, readable directories like //brand/color.</p></div><div class="rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/30 hover:bg-surface/70"><h4 class="mb-2 text-sm font-semibold break-words">Dynamic Meta Injection</h4><p class="text-sm leading-relaxed text-muted">Auto-generate H1 tags, Title tags, and contextual copy based on the activated facet parameters.</p></div></div><h2 id="edge-routing" class="mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24"><span>Dynamic Edge Routing (The Technical Fix)</span><a href="#edge-routing" class="ml-2 inline-flex items-center opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity duration-200 text-muted hover:text-[#7c3aed] align-middle" aria-label="Link to this section" title="Copy link to this section"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2><div class="mb-8 text-base leading-[1.8] text-muted sm:text-lg">Knowing what to index is only half the battle. You still need to prevent Google from crawling the zero-volume combinations. Historically, SEOs used the PRG (Post-Redirect-Get) pattern to hide faceted links from search engines. You would submit a filter via a POST request, redirect the server, and serve the content. <br /><br />The PRG pattern is an outdated, clunky hack. <br /><br />Today, I rely heavily on Edge Workers—using Cloudflare Workers or AWS Lambda@Edge—to intercept network requests before they ever hit the origin server. We write logic at the CDN level. If the `User-Agent` identifies as Googlebot, and it attempts to access a non-indexable parameterized permutation, the edge worker strips the parameters, serves a 403, or dynamically removes `href` attributes from the rendered HTML snapshot. For human users on Chrome or Safari, the application functions like a seamless, lightning-fast React or Vue Single Page Application.</div><blockquote class="my-10 border-l-4 border-accent py-2 pl-6"><p class="mb-2 font-sans text-xl italic leading-relaxed sm:text-2xl">“<!-- -->Crawl budget isn't just about search engine limits; it's about forcing Googlebot to eat the exact meals you prepare for it, rather than letting it raid the pantry.<!-- -->”</p></blockquote><h2 id="internal-funnel" class="mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24"><span>Building the Internal Linking Funnel</span><a href="#internal-funnel" class="ml-2 inline-flex items-center opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity duration-200 text-muted hover:text-[#7c3aed] align-middle" aria-label="Link to this section" title="Copy link to this section"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2><div class="mb-8 text-base leading-[1.8] text-muted sm:text-lg">You have to ruthlessly control the funnel. If you leave standard HTML `<a>` tags pointing to millions of non-indexable parameter strings on your category pages, Google will try to crawl them regardless of your canonicals, meta robots, or Edge rules. <br /><br />I utilize a technique called <strong class="font-semibold text-foreground">Event-Delegated Routing</strong>. For facet links we explicitly <em class="italic">do not</em> want crawled, we remove the `href` attribute entirely from the DOM. Instead, we inject a `data-url` attribute and use a JavaScript `onClick` event listener to trigger the client-side routing. <br /><br />Since Googlebot's link discovery phase relies on finding valid `href` attributes inside anchor tags, the zero-volume URLs become effectively invisible to the crawler. <br /><br />Your <a href="/blog/seo-friendly-pagination" class="underline decoration-accent underline-offset-4 transition-colors hover:text-accent" target="_blank" rel="noopener noreferrer">pagination</a> is probably destroying your crawl depth, too. Apply this exact same event-delegated logic to deep pagination layers. Google does not need to crawl page 482 of your "All Shoes" category. Restrict bot access to the first 5-10 pages of pagination, and force them to discover deeper products through highly specific, indexable sub-categories instead.</div><ul class="mb-8 space-y-2 pl-6 text-base leading-relaxed text-muted list-disc"><li>Audit current facet HTML structure and identify all hrefs.</li><li>Map indexable combinations to standard <a href="..."> tags.</li><li>Convert non-indexable combinations to <span data-url="..."> or anchor tags without href attributes.</li><li>Implement JavaScript event listeners to handle client-side routing for human clicks.</li><li>Test rendering with Google Search Console's URL Inspection tool.</li></ul><div class="my-8 overflow-x-auto rounded-xl border border-border"><table class="w-full text-sm"><thead><tr class="border-b border-border bg-surface/60"><th class="px-5 py-3 text-left font-mono text-xs font-semibold uppercase tracking-wider text-muted">Method</th><th class="px-5 py-3 text-left font-mono text-xs font-semibold uppercase tracking-wider text-muted">Crawl Budget Saved?</th><th class="px-5 py-3 text-left font-mono text-xs font-semibold uppercase tracking-wider text-muted">Link Equity Retained?</th><th class="px-5 py-3 text-left font-mono text-xs font-semibold uppercase tracking-wider text-muted">Implementation Effort</th></tr></thead><tbody><tr class="border-b border-border/50 transition-colors last:border-0 hover:bg-surface/30"><td class="px-5 py-3 font-medium">Rel=Canonical</td><td class="px-5 py-3 text-muted">No</td><td class="px-5 py-3 text-muted">Usually</td><td class="px-5 py-3 text-muted">Low</td></tr><tr class="border-b border-border/50 transition-colors last:border-0 hover:bg-surface/30"><td class="px-5 py-3 font-medium">Robots.txt Disallow</td><td class="px-5 py-3 text-muted">Yes</td><td class="px-5 py-3 text-muted">No</td><td class="px-5 py-3 text-muted">Low</td></tr><tr class="border-b border-border/50 transition-colors last:border-0 hover:bg-surface/30"><td class="px-5 py-3 font-medium">Event-Delegated JS Routing</td><td class="px-5 py-3 text-muted">Yes</td><td class="px-5 py-3 text-muted">Yes</td><td class="px-5 py-3 text-muted">High</td></tr><tr class="border-b border-border/50 transition-colors last:border-0 hover:bg-surface/30"><td class="px-5 py-3 font-medium">PRG Pattern</td><td class="px-5 py-3 text-muted">Yes</td><td class="px-5 py-3 text-muted">Yes</td><td class="px-5 py-3 text-muted">Medium</td></tr></tbody></table></div><h2 id="log-validation" class="mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24"><span>Validating with Log File Analysis</span><a href="#log-validation" class="ml-2 inline-flex items-center opacity-0 group-hover:opacity-100 focus:opacity-100 transition-opacity duration-200 text-muted hover:text-[#7c3aed] align-middle" aria-label="Link to this section" title="Copy link to this section"><svg class="w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></a></h2><div class="mb-8 text-base leading-[1.8] text-muted sm:text-lg">You cannot validate a massive programmatic faceted search architecture with third-party tools like Ahrefs, Semrush, or even Screaming Frog. They don't crawl exactly the way Google crawls. You have to go straight to the raw server logs. <br /><br />I routinely download raw Nginx or Apache logs and use command-line tools like `awk` and `grep` to isolate Googlebot requests. I want to see exactly which parameterized URLs the bot is hitting, how often, and what status codes it's receiving. <br /><br />If I see a high volume of requests to non-indexed facets (like `?sort=price_desc`), I instantly know my internal linking architecture is leaking. Log file analysis is the only absolute source of truth in technical SEO; everything else is just an educated guess. When you finally see Googlebot ignoring your parameters and aggressively crawling your high-value programmatic pages, you know you've won.</div><div class="my-10 space-y-4"><div class=" overflow-hidden rounded-2xl border border-border/50 bg-surface/30 transition-all duration-300 ease-in-out hover:bg-surface/50 "><button class="flex w-full cursor-pointer items-start justify-between gap-4 px-6 py-5 text-left transition-colors sm:px-8 sm:py-6"><h3 class="text-base font-semibold text-foreground sm:text-lg">Will using JavaScript onClick for links hurt my overall SEO?</h3><div class=" mt-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border bg-background/50 text-muted transition-all duration-300 group-hover:text-foreground "><svg class="h-3 w-3 transition-transform duration-300 " fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M19 9l-7 7-7-7"></path></svg></div></button><div class=" grid transition-all duration-500 ease-[cubic-bezier(0.4,0,0.2,1)] grid-rows-[0fr] opacity-0 "><div class="overflow-hidden"><div class="px-6 pb-6 text-base leading-relaxed text-muted sm:px-8 sm:pb-8 sm:text-lg">Not if you use it correctly. You only use JS routing for facet combinations that you explicitly DO NOT want indexed. For high-volume, indexable combinations, you must use standard <a href> tags.</div></div></div></div><div class=" overflow-hidden rounded-2xl border border-border/50 bg-surface/30 transition-all duration-300 ease-in-out hover:bg-surface/50 "><button class="flex w-full cursor-pointer items-start justify-between gap-4 px-6 py-5 text-left transition-colors sm:px-8 sm:py-6"><h3 class="text-base font-semibold text-foreground sm:text-lg">How many facets should I allow to be indexed?</h3><div class=" mt-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border bg-background/50 text-muted transition-all duration-300 group-hover:text-foreground "><svg class="h-3 w-3 transition-transform duration-300 " fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M19 9l-7 7-7-7"></path></svg></div></button><div class=" grid transition-all duration-500 ease-[cubic-bezier(0.4,0,0.2,1)] grid-rows-[0fr] opacity-0 "><div class="overflow-hidden"><div class="px-6 pb-6 text-base leading-relaxed text-muted sm:px-8 sm:pb-8 sm:text-lg">It depends entirely on search volume. Some sites index 1,000 combinations; others index 500,000. If the specific combination has search demand and you have inventory for it, index it.</div></div></div></div><div class=" overflow-hidden rounded-2xl border border-border/50 bg-surface/30 transition-all duration-300 ease-in-out hover:bg-surface/50 "><button class="flex w-full cursor-pointer items-start justify-between gap-4 px-6 py-5 text-left transition-colors sm:px-8 sm:py-6"><h3 class="text-base font-semibold text-foreground sm:text-lg">Can I just use the Meta Robots NOINDEX tag?</h3><div class=" mt-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-full border border-border bg-background/50 text-muted transition-all duration-300 group-hover:text-foreground "><svg class="h-3 w-3 transition-transform duration-300 " fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2.5" d="M19 9l-7 7-7-7"></path></svg></div></button><div class=" grid transition-all duration-500 ease-[cubic-bezier(0.4,0,0.2,1)] grid-rows-[0fr] opacity-0 "><div class="overflow-hidden"><div class="px-6 pb-6 text-base leading-relaxed text-muted sm:px-8 sm:pb-8 sm:text-lg">NOINDEX prevents indexing, but it does not prevent crawling. Google still has to crawl the page to see the NOINDEX tag, meaning your crawl budget is still being wasted on infinite permutations.</div></div></div></div></div><div class="my-16 rounded-2xl border border-border bg-surface/40 p-8 sm:p-10"><div class="flex items-center gap-5 mb-6"><img alt="Aziz J." loading="lazy" width="64" height="64" decoding="async" data-nimg="1" class="h-16 w-16 rounded-full object-cover border border-border" style="color:transparent" srcSet="/_next/image?url=%2Faziz.jpg&w=64&q=75&dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB 1x, /_next/image?url=%2Faziz.jpg&w=128&q=75&dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB 2x" src="/_next/image?url=%2Faziz.jpg&w=128&q=75&dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB"/><div><div class="text-xl font-bold text-foreground leading-tight">Aziz J.</div><div class="text-sm text-muted mt-1">Founder at ProgSEO · SEO & Programmatic Content Strategist</div></div></div><div class="text-[10px] font-bold uppercase tracking-[0.15em] text-muted mb-3">Written By</div><p class="text-muted leading-relaxed mb-6 max-w-2xl italic">Aziz built ProgSEO to help founders and marketers scale their organic traffic without scaling their team. He writes about programmatic SEO, content automation, and the tools that actually move the needle.</p><div class="flex items-center gap-4"><a href="https://twitter.com/progseo" target="_blank" rel="noopener noreferrer" class="text-muted transition-colors hover:text-foreground" aria-label="Twitter"><svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></svg></a></div></div><div class="my-12 rounded-2xl border border-border bg-surface p-8 sm:p-12"><h3 class="mb-4 text-2xl font-bold">Ready to Scale Your Programmatic SEO?</h3><div class="mb-6 text-muted leading-relaxed">Stop guessing and start dominating. Let's rebuild your faceted search architecture to capture millions of long-tail queries without wasting a single drop of crawl budget.</div><a href="https://www.progseo.dev" target="_blank" rel="noopener noreferrer" class="inline-block rounded-full px-8 py-3 text-sm font-semibold text-black transition-all hover:shadow-lg active:scale-95" style="background-color:var(--accent)">Try free 3 day</a></div></article><div class="mt-16 border-t border-border/50 pt-8"><h3 class="mb-6 text-sm font-bold uppercase tracking-[0.15em] text-foreground">Read Next</h3><div class="grid grid-cols-1 gap-4 sm:grid-cols-2"><a class="group flex min-h-[100px] flex-col justify-center rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/50 hover:bg-surface/70" href="/blog/handle-url-parameters-seo"><h4 class="text-base font-semibold leading-snug transition-colors group-hover:text-accent">How I Handle URL Parameters SEO & Stop Crawl Waste</h4></a><a class="group flex min-h-[100px] flex-col justify-center rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/50 hover:bg-surface/70" href="/blog/find-crawl-traps-server-logs"><h4 class="text-base font-semibold leading-snug transition-colors group-hover:text-accent">The Simple Script I Use To Find Crawl Traps Server Logs Reveal</h4></a><a class="group flex min-h-[100px] flex-col justify-center rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/50 hover:bg-surface/70" href="/blog/prioritize-crawl-budget"><h4 class="text-base font-semibold leading-snug transition-colors group-hover:text-accent">Prioritizing Crawl Budget System</h4></a><a class="group flex min-h-[100px] flex-col justify-center rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/50 hover:bg-surface/70" href="/blog/how-i-detect-redirect-chains-before-googlebot-finds-them"><h4 class="text-base font-semibold leading-snug transition-colors group-hover:text-accent">Detect Redirect Chains Before Googlebot</h4></a></div></div></article><aside class="sticky top-28 hidden h-fit w-72 shrink-0 xl:block"><div class="rounded-2xl border border-border bg-surface/60 p-6"><h2 class="text-lg font-bold leading-tight tracking-tight">Try ProgSEO free</h2><p class="mt-2 text-sm leading-relaxed text-muted">Enter your domain and get three SEO articles written for it. No card required.</p><a href="/app" target="_blank" rel="noopener noreferrer" class="mt-5 flex w-full items-center justify-center gap-1.5 rounded-xl px-5 py-3 text-sm font-semibold text-black transition-all hover:shadow-lg active:scale-[0.98]" style="background-color:var(--accent)">Generate 3 free articles<svg class="h-3.5 w-3.5" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><path d="M4 12L12 4M12 4H6M12 4v6" stroke-linecap="round" stroke-linejoin="round"></path></svg></a><ul class="mt-6 space-y-2.5 border-t border-border/70 pt-5"><li class="flex items-start gap-2.5 text-sm text-muted"><svg class="mt-0.5 h-4 w-4 shrink-0" viewBox="0 0 20 20" fill="var(--accent)" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"></path></svg>Keyword research from your own site</li><li class="flex items-start gap-2.5 text-sm text-muted"><svg class="mt-0.5 h-4 w-4 shrink-0" viewBox="0 0 20 20" fill="var(--accent)" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"></path></svg>Full articles, not outlines</li><li class="flex items-start gap-2.5 text-sm text-muted"><svg class="mt-0.5 h-4 w-4 shrink-0" viewBox="0 0 20 20" fill="var(--accent)" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"></path></svg>Visual editor before you publish</li><li class="flex items-start gap-2.5 text-sm text-muted"><svg class="mt-0.5 h-4 w-4 shrink-0" viewBox="0 0 20 20" fill="var(--accent)" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"></path></svg>JSON-LD schema and OpenGraph included</li><li class="flex items-start gap-2.5 text-sm text-muted"><svg class="mt-0.5 h-4 w-4 shrink-0" viewBox="0 0 20 20" fill="var(--accent)" aria-hidden="true"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"></path></svg>Export to Markdown, TSX or JSON</li></ul></div></aside></div></div></main><div class="w-full border-b border-border bg-background py-8"><div class="mx-auto max-w-7xl px-6 mb-6"><h4 class="text-center font-mono text-xs font-semibold uppercase tracking-wider text-muted">Featured On</h4></div><div class="testimonial-marquee relative"><div class="testimonial-track items-center"><a href="https://findly.tools/progseo-dev?utm_source=progseo-dev" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://findly.tools/badges/findly-tools-badge-dark.svg" alt="Featured on Findly.tools" width="175" height="55" class="max-h-[50px] w-auto object-contain"/></a><a href="https://twelve.tools" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://twelve.tools/badge1-dark.svg" alt="Featured on Twelve Tools" width="200" height="54" class="max-h-[50px] w-auto object-contain"/></a><a href="https://dofollow.tools" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://dofollow.tools/badge/badge_dark.svg" alt="Featured on Dofollow.Tools" width="200" height="54" class="max-h-[50px] w-auto object-contain"/></a><a href="https://rankinpublic.xyz/products/progseo.dev" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://rankinpublic.xyz/api/badges/badge2.png?site=progseo.dev" alt="Featured on RankInPublic" width="200" height="64" class="max-h-[50px] w-auto object-contain"/></a><a href="https://indieai.directory/" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><span class="text-sm font-medium text-muted hover:text-foreground">Listed on IndieAI Directory</span></a><a href="https://uno.directory" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://uno.directory/uno-directory.svg" alt="Listed on Uno Directory" width="120" height="30" class="max-h-[50px] w-auto object-contain"/></a><a href="https://auraplusplus.com/projects/progseo-dev" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://auraplusplus.com/images/badges/featured-on-dark.svg" alt="Featured on Aura++" width="265" height="58" class="max-h-[50px] w-auto object-contain"/></a><a href="https://theresanaiforthat.com/ai/https-www-progseo-dev/?ref=featured&v=9432409" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://media.theresanaiforthat.com/featured-on-taaft.png?width=600" alt="Featured on There's An AI For That" width="300" height="54" class="max-h-[50px] w-auto object-contain"/></a><a href="https://www.uneed.best/tool/progseo" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://www.uneed.best/POTD3A.png" alt="Uneed POTD3 Badge" width="250" height="54" class="max-h-[50px] w-auto object-contain"/></a><a href="https://findly.tools/progseo-dev?utm_source=progseo-dev" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://findly.tools/badges/findly-tools-badge-dark.svg" alt="Featured on Findly.tools" width="175" height="55" class="max-h-[50px] w-auto object-contain"/></a><a href="https://twelve.tools" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://twelve.tools/badge1-dark.svg" alt="Featured on Twelve Tools" width="200" height="54" class="max-h-[50px] w-auto object-contain"/></a><a href="https://dofollow.tools" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://dofollow.tools/badge/badge_dark.svg" alt="Featured on Dofollow.Tools" width="200" height="54" class="max-h-[50px] w-auto object-contain"/></a><a href="https://rankinpublic.xyz/products/progseo.dev" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://rankinpublic.xyz/api/badges/badge2.png?site=progseo.dev" alt="Featured on RankInPublic" width="200" height="64" class="max-h-[50px] w-auto object-contain"/></a><a href="https://indieai.directory/" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><span class="text-sm font-medium text-muted hover:text-foreground">Listed on IndieAI Directory</span></a><a href="https://uno.directory" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://uno.directory/uno-directory.svg" alt="Listed on Uno Directory" width="120" height="30" class="max-h-[50px] w-auto object-contain"/></a><a href="https://auraplusplus.com/projects/progseo-dev" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://auraplusplus.com/images/badges/featured-on-dark.svg" alt="Featured on Aura++" width="265" height="58" class="max-h-[50px] w-auto object-contain"/></a><a href="https://theresanaiforthat.com/ai/https-www-progseo-dev/?ref=featured&v=9432409" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://media.theresanaiforthat.com/featured-on-taaft.png?width=600" alt="Featured on There's An AI For That" width="300" height="54" class="max-h-[50px] w-auto object-contain"/></a><a href="https://www.uneed.best/tool/progseo" target="_blank" rel="noopener noreferrer" class="inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8"><img src="https://www.uneed.best/POTD3A.png" alt="Uneed POTD3 Badge" width="250" height="54" class="max-h-[50px] w-auto object-contain"/></a></div></div></div><footer class="mt-auto border-t border-border"><div class="mx-auto max-w-[1200px] sm:border-x sm:border-border"><div class="grid gap-10 px-4 py-14 sm:grid-cols-2 sm:px-8 lg:grid-cols-[1.4fr_repeat(4,1fr)] lg:px-12"><div class="sm:col-span-2 lg:col-span-1"><a class="group inline-flex items-center gap-2 py-2" href="/"><div class="flex h-7 w-7 items-center justify-center rounded-md bg-accent font-mono text-xs font-bold text-black transition-transform group-hover:scale-105">P</div><span class="text-[17px] font-semibold tracking-tight">ProgSEO</span></a><p class="mt-4 max-w-xs text-sm leading-relaxed text-muted">Keyword research, researched articles and publishing for your site — on a calendar you control.</p><address class="mt-6 max-w-xs text-sm not-italic leading-relaxed text-muted">Barmonteley INC<br/>1521 Concord Pike, Ste 301 #279<br/>Wilmington, DE 19803, United States</address></div><nav aria-label="Product"><h4 class="mb-4 text-sm font-medium text-foreground">Product</h4><ul class="space-y-2.5 text-sm"><li><a class="text-muted transition-colors hover:text-foreground" href="/#how-it-works">How it works</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/#features">Features</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/#examples">Publishing</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/#pricing">Pricing</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/#faq">FAQ</a></li></ul></nav><nav aria-label="Resources"><h4 class="mb-4 text-sm font-medium text-foreground">Resources</h4><ul class="space-y-2.5 text-sm"><li><a href="/blog" target="_blank" rel="noopener noreferrer" class="text-muted transition-colors hover:text-foreground">Blog</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/docs">Docs</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/comparisons">Comparisons</a></li></ul></nav><nav aria-label="Free SEO tools"><h4 class="mb-4 text-sm font-medium text-foreground">Free SEO tools</h4><ul class="space-y-2.5 text-sm"><li><a class="text-muted transition-colors hover:text-foreground" href="/tools">All free tools</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/tools/seo-title-generator">SEO title generator</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/tools/internal-linking-tool">Internal linking suggestions</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/tools/topical-authority-pro">Topical Authority Pro</a></li></ul></nav><nav aria-label="Legal"><h4 class="mb-4 text-sm font-medium text-foreground">Legal</h4><ul class="space-y-2.5 text-sm"><li><a class="text-muted transition-colors hover:text-foreground" href="/privacy">Privacy policy</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/terms">Terms of service</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/cookie">Cookie policy</a></li><li><a class="text-muted transition-colors hover:text-foreground" href="/refund">Refund policy</a></li></ul></nav></div><div class="flex flex-col items-start justify-between gap-3 border-t border-border px-4 py-6 text-xs text-muted sm:flex-row sm:items-center sm:px-8 lg:px-12"><p>© 2026 Barmonteley INC. All rights reserved.</p><div class="-my-3 flex gap-6"><a href="https://x.com/team_pseo?s=21" target="_blank" rel="noopener noreferrer" class="text-muted transition-colors hover:text-foreground py-3">X (Twitter)</a><a href="mailto:support@progseo.dev" class="text-muted transition-colors hover:text-foreground py-3">support@progseo.dev</a></div></div></div></footer></div><!--$--><!--/$--><script src="/_next/static/chunks/faf4a0202735b81c.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[339756,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"default\"]\n3:I[837457,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"default\"]\n7:I[168027,[],\"default\"]\n:HL[\"/_next/static/chunks/d4eb7ef7dc208e91.css?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"style\"]\n:HL[\"/_next/static/chunks/cfd68ef78daeddcb.css?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"style\"]\n:HL[\"/_next/static/media/797e433ab948586e-s.p.29207c2f.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/caa3a2e1cccd8315-s.p.3b6cae6d.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n:HL[\"/_next/static/media/e41d5df559864f9e-s.p.380d09ea.woff2\",\"font\",{\"crossOrigin\":\"\",\"type\":\"font/woff2\"}]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"NMAhJjINCKYJoeexKYPDD\",\"c\":[\"\",\"blog\",\"programmatic-faceted-search\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"blog\",{\"children\":[[\"slug\",\"programmatic-faceted-search\",\"d\"],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/d4eb7ef7dc208e91.css?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/cfd68ef78daeddcb.css?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[[\"$\",\"head\",null,{\"children\":[[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n window.dataLayer = window.dataLayer || [];\\n function gtag(){dataLayer.push(arguments);}\\n var gpcOptOut = navigator.globalPrivacyControl === true;\\n gtag('consent', 'default', {\\n ad_storage: 'denied',\\n ad_user_data: 'denied',\\n ad_personalization: 'denied',\\n analytics_storage: gpcOptOut ? 'denied' : 'granted'\\n });\\n gtag('js', new Date());\\n\\n gtag('config', 'G-05CB5N2FTC');\\n\\n if (!gpcOptOut) {\\n (function(c,l,a,r,i,t,y){\\n c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};\\n t=l.createElement(r);t.async=1;t.src=\\\"https://www.clarity.ms/tag/\\\"+i;\\n y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);\\n })(window, document, \\\"clarity\\\", \\\"script\\\", \\\"w9xz0d6ilk\\\");\\n }\\n \"}}],[\"$\",\"script\",null,{\"async\":true,\"src\":\"https://www.googletagmanager.com/gtag/js?id=G-05CB5N2FTC\"}],[\"$\",\"script\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"\\n window.$crisp=[];window.CRISP_WEBSITE_ID=\\\"1694e2d3-d470-4177-aad4-3c00a050b3ea\\\";(function(){d=document;s=d.createElement(\\\"script\\\");s.src=\\\"https://client.crisp.chat/l.js\\\";s.async=1;d.getElementsByTagName(\\\"head\\\")[0].appendChild(s);})();\\n \"}}]]}],[\"$\",\"body\",null,{\"className\":\"geist_a71539c9-module__T19VSG__variable geist_mono_8d43a2aa-module__8Li5zG__variable instrument_serif_2c398422-module__pOELkq__variable antialiased\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L3\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L2\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":\"$L4\",\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"$L5\",{},null,false,false]},null,false,false]},null,false,false]},null,false,false],\"$L6\",false]],\"m\":\"$undefined\",\"G\":[\"$7\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"9:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"OutletBoundary\"]\na:\"$Sreact.suspense\"\nc:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"ViewportBoundary\"]\ne:I[897367,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"MetadataBoundary\"]\n4:[\"$\",\"$L3\",null,{}]\n5:[\"$\",\"$1\",\"c\",{\"children\":[\"$L8\",[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"$L9\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@b\"}]}]]}]\n6:[\"$\",\"$1\",\"h\",{\"children\":[null,[\"$\",\"$Lc\",null,{\"children\":\"$Ld\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Le\",null,{\"children\":[\"$\",\"$a\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lf\"}]}]}],[\"$\",\"meta\",null,{\"name\":\"next-size-adjust\",\"content\":\"\"}]]}]\n"])</script><script>self.__next_f.push([1,"d:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"2\",{\"name\":\"theme-color\",\"content\":\"#fafaf9\"}],[\"$\",\"meta\",\"3\",{\"name\":\"color-scheme\",\"content\":\"light\"}]]\n"])</script><script>self.__next_f.push([1,"11:I[601927,[\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"BlogHeader\"]\n12:I[141153,[\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"ScrollProgressBar\"]\n13:I[522016,[\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"\"]\n1b:I[27201,[\"/_next/static/chunks/d96012bcfc98706a.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\",\"/_next/static/chunks/73e3194f06db260e.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"IconMark\"]\n10:T900,"])</script><script>self.__next_f.push([1,"{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://www.progseo.dev/#organization\",\"name\":\"ProgSEO\",\"url\":\"https://www.progseo.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://www.progseo.dev/favicon.png\",\"width\":1024,\"height\":1024}},{\"@type\":\"BlogPosting\",\"headline\":\"Scaling Programmatic Faceted Search Without Drowning in Crawl Waste\",\"description\":\"Learn how I scale programmatic faceted search to millions of pages without burning crawl budget. Avoid the canonical trap and fix your facet architecture.\",\"image\":\"https://www.progseo.dev/blog/programmatic-faceted-search/hero.png\",\"datePublished\":\"2023-11-14\",\"dateModified\":\"2026-08-01T19:29:34.480Z\",\"author\":{\"@type\":\"Person\",\"name\":\"Aziz J.\"},\"publisher\":{\"@id\":\"https://www.progseo.dev/#organization\"},\"mainEntityOfPage\":\"https://www.progseo.dev/blog/programmatic-faceted-search\",\"url\":\"https://www.progseo.dev/blog/programmatic-faceted-search\"},{\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https://www.progseo.dev\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https://www.progseo.dev/blog\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Scaling Programmatic Faceted Search Without Drowning in Crawl Waste\",\"item\":\"https://www.progseo.dev/blog/programmatic-faceted-search\"}]},{\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Will using JavaScript onClick for links hurt my overall SEO?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Not if you use it correctly. You only use JS routing for facet combinations that you explicitly DO NOT want indexed. For high-volume, indexable combinations, you must use standard tags.\"}},{\"@type\":\"Question\",\"name\":\"How many facets should I allow to be indexed?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"It depends entirely on search volume. Some sites index 1,000 combinations; others index 500,000. If the specific combination has search demand and you have inventory for it, index it.\"}},{\"@type\":\"Question\",\"name\":\"Can I just use the Meta Robots NOINDEX tag?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"NOINDEX prevents indexing, but it does not prevent crawling. Google still has to crawl the page to see the NOINDEX tag, meaning your crawl budget is still being wasted on infinite permutations.\"}}]}]}"])</script><script>self.__next_f.push([1,"8:[\"$\",\"div\",null,{\"className\":\"noise-bg relative min-h-screen overflow-x-clip bg-background flex flex-col\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"script\",null,{\"type\":\"application/ld+json\",\"dangerouslySetInnerHTML\":{\"__html\":\"$10\"}}],[\"$\",\"$L11\",null,{}],[\"$\",\"div\",null,{\"className\":\"fixed top-[64px] z-50 w-full\",\"children\":[\"$\",\"$L12\",null,{}]}],[\"$\",\"header\",null,{\"className\":\"relative border-b border-border/60 bg-surface/40 pt-24\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto w-full max-w-7xl px-6 pb-12 pt-6 lg:pb-16\",\"children\":[[\"$\",\"nav\",null,{\"aria-label\":\"Breadcrumb\",\"children\":[\"$\",\"ol\",null,{\"className\":\"flex items-center gap-2 text-sm font-medium text-muted\",\"children\":[[\"$\",\"li\",null,{\"className\":\"flex shrink-0 items-center\",\"children\":[\"$\",\"$L13\",null,{\"href\":\"/\",\"className\":\"flex items-center transition-colors hover:text-foreground\",\"children\":[[\"$\",\"span\",null,{\"className\":\"sr-only\",\"children\":\"Home\"}],[\"$\",\"svg\",null,{\"className\":\"h-4 w-4\",\"fill\":\"currentColor\",\"viewBox\":\"0 0 20 20\",\"aria-hidden\":\"true\",\"children\":[\"$\",\"path\",null,{\"d\":\"M10.707 2.293a1 1 0 00-1.414 0l-7 7a1 1 0 001.414 1.414L4 10.414V17a1 1 0 001 1h2a1 1 0 001-1v-2a1 1 0 011-1h2a1 1 0 011 1v2a1 1 0 001 1h2a1 1 0 001-1v-6.586l.293.293a1 1 0 001.414-1.414l-7-7z\"}]}]]}]}],\"$L14\",\"$L15\",\"$L16\",\"$L17\"]}]}],\"$L18\"]}]}],\"$L19\",\"$L1a\"]}]\nb:null\n"])</script><script>self.__next_f.push([1,"f:[[\"$\",\"title\",\"0\",{\"children\":\"Scaling Programmatic Faceted Search Without Drowning in\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Learn how I scale programmatic faceted search to millions of pages without burning crawl budget. Avoid the canonical trap and fix your facet architecture.\"}],[\"$\",\"meta\",\"2\",{\"name\":\"keywords\",\"content\":\"programmatic SEO,PSEO,SEO automation,content generation,organic traffic\"}],[\"$\",\"meta\",\"3\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"meta\",\"4\",{\"name\":\"googlebot\",\"content\":\"index, follow, max-video-preview:-1, max-image-preview:large, max-snippet:-1\"}],[\"$\",\"link\",\"5\",{\"rel\":\"canonical\",\"href\":\"https://www.progseo.dev/blog/programmatic-faceted-search\"}],[\"$\",\"meta\",\"6\",{\"property\":\"og:title\",\"content\":\"Scaling Programmatic Faceted Search Without Drowning in Crawl Waste\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:description\",\"content\":\"Learn how I scale programmatic faceted search to millions of pages without burning crawl budget. Avoid the canonical trap and fix your facet architecture.\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:url\",\"content\":\"https://www.progseo.dev/blog/programmatic-faceted-search\"}],[\"$\",\"meta\",\"9\",{\"property\":\"og:image\",\"content\":\"https://www.progseo.dev/blog/programmatic-faceted-search/hero.png\"}],[\"$\",\"meta\",\"10\",{\"property\":\"og:image:width\",\"content\":\"1200\"}],[\"$\",\"meta\",\"11\",{\"property\":\"og:image:height\",\"content\":\"630\"}],[\"$\",\"meta\",\"12\",{\"property\":\"og:image:alt\",\"content\":\"Scaling Programmatic Faceted Search Without Drowning in Crawl Waste\"}],[\"$\",\"meta\",\"13\",{\"property\":\"og:type\",\"content\":\"article\"}],[\"$\",\"meta\",\"14\",{\"property\":\"article:published_time\",\"content\":\"2023-11-14\"}],[\"$\",\"meta\",\"15\",{\"property\":\"article:author\",\"content\":\"Aziz J.\"}],[\"$\",\"meta\",\"16\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"17\",{\"name\":\"twitter:title\",\"content\":\"Scaling Programmatic Faceted Search Without Drowning in Crawl Waste\"}],[\"$\",\"meta\",\"18\",{\"name\":\"twitter:description\",\"content\":\"Learn how I scale programmatic faceted search to millions of pages without burning crawl budget. Avoid the canonical trap and fix your facet architecture.\"}],[\"$\",\"meta\",\"19\",{\"name\":\"twitter:image\",\"content\":\"https://www.progseo.dev/blog/programmatic-faceted-search/hero.png\"}],[\"$\",\"link\",\"20\",{\"rel\":\"shortcut icon\",\"href\":\"/favicon.png\"}],[\"$\",\"link\",\"21\",{\"rel\":\"icon\",\"href\":\"/favicon.ico?favicon.98065de3.ico\",\"sizes\":\"48x48\",\"type\":\"image/x-icon\"}],[\"$\",\"link\",\"22\",{\"rel\":\"icon\",\"href\":\"/favicon.png\",\"type\":\"image/png\"}],[\"$\",\"link\",\"23\",{\"rel\":\"apple-touch-icon\",\"href\":\"/favicon.png\",\"type\":\"image/png\"}],[\"$\",\"$L1b\",\"24\",{}]]\n"])</script><script>self.__next_f.push([1,"1c:I[297796,[\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"HeroVisual\"]\n1d:I[66204,[\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"TableOfContents\"]\n1f:I[867233,[\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"HeadingAnchorClient\"]\n:HL[\"https://findly.tools/badges/findly-tools-badge-dark.svg\",\"image\"]\n:HL[\"https://twelve.tools/badge1-dark.svg\",\"image\"]\n:HL[\"https://dofollow.tools/badge/badge_dark.svg\",\"image\"]\n:HL[\"https://rankinpublic.xyz/api/badges/badge2.png?site=progseo.dev\",\"image\"]\n:HL[\"https://uno.directory/uno-directory.svg\",\"image\"]\n:HL[\"https://auraplusplus.com/images/badges/featured-on-dark.svg\",\"image\"]\n:HL[\"https://media.theresanaiforthat.com/featured-on-taaft.png?width=600\",\"image\"]\n:HL[\"https://www.uneed.best/POTD3A.png\",\"image\"]\n14:[\"$\",\"li\",null,{\"aria-hidden\":\"true\",\"className\":\"shrink-0\",\"children\":[\"$\",\"svg\",null,{\"className\":\"h-4 w-4 text-muted/40\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":2,\"d\":\"M9 5l7 7-7 7\"}]}]}]\n15:[\"$\",\"li\",null,{\"className\":\"shrink-0\",\"children\":[\"$\",\"$L13\",null,{\"href\":\"/blog\",\"className\":\"transition-colors hover:text-foreground\",\"children\":\"Blog\"}]}]\n16:[\"$\",\"li\",null,{\"aria-hidden\":\"true\",\"className\":\"shrink-0\",\"children\":[\"$\",\"svg\",null,{\"className\":\"h-4 w-4 text-muted/40\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"children\":[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"strokeWidth\":2,\"d\":\"M9 5l7 7-7 7\"}]}]}]\n17:[\"$\",\"li\",null,{\"className\":\"min-w-0 truncate text-accent\",\"aria-current\":\"page\",\"children\":\"Scaling Programmatic Faceted Search Without Drowning in Crawl Waste\"}]\n"])</script><script>self.__next_f.push([1,"18:[\"$\",\"div\",null,{\"className\":\"mt-10 grid items-center gap-10 lg:grid-cols-[minmax(0,1fr)_minmax(0,440px)] lg:gap-14\",\"children\":[[\"$\",\"div\",null,{\"children\":[[\"$\",\"h1\",null,{\"className\":\"text-3xl font-bold leading-[1.15] tracking-tight sm:text-4xl lg:text-5xl\",\"children\":\"Scaling Programmatic Faceted Search Without Drowning in Crawl Waste\"}],[\"$\",\"p\",null,{\"className\":\"mt-6 max-w-2xl text-lg leading-relaxed text-muted\",\"children\":\"Learn how I scale programmatic faceted search to millions of pages without burning crawl budget. Avoid the canonical trap and fix your facet architecture.\"}],[\"$\",\"div\",null,{\"className\":\"mt-8 flex flex-wrap items-center gap-x-6 gap-y-3 text-sm text-muted\",\"suppressHydrationWarning\":true,\"children\":[[\"$\",\"span\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"h-4 w-4 text-muted/60\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"strokeWidth\":1.8,\"aria-hidden\":\"true\",\"children\":[[\"$\",\"circle\",null,{\"cx\":\"12\",\"cy\":\"12\",\"r\":\"9\"}],[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"d\":\"M12 7v5l3 2\"}]]}],\"14 min read\"]}],[\"$\",\"span\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"h-4 w-4 text-muted/60\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"strokeWidth\":1.8,\"aria-hidden\":\"true\",\"children\":[[\"$\",\"rect\",null,{\"x\":\"3\",\"y\":\"5\",\"width\":\"18\",\"height\":\"16\",\"rx\":\"2\"}],[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"d\":\"M3 10h18M8 3v4M16 3v4\"}]]}],[\"$\",\"time\",null,{\"dateTime\":\"2023-11-14\",\"children\":\"November 14, 2023\"}]]}],[\"$\",\"span\",null,{\"className\":\"flex items-center gap-2\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"h-4 w-4 text-muted/60\",\"fill\":\"none\",\"viewBox\":\"0 0 24 24\",\"stroke\":\"currentColor\",\"strokeWidth\":1.8,\"aria-hidden\":\"true\",\"children\":[[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\",\"d\":\"M4 5v5h5M20 19v-5h-5\"}],[\"$\",\"path\",null,{\"strokeLinecap\":\"round\",\"d\":\"M19.4 9A8 8 0 0 0 5.6 6.6L4 9m0 6a8 8 0 0 0 13.8 2.4L20 15\"}]]}],[\"$\",\"span\",null,{\"children\":[\"Updated:\",\" \",[\"$\",\"time\",null,{\"dateTime\":\"2026-08-01T19:29:34.480Z\",\"children\":\"August 1, 2026\"}]]}]]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"order-first lg:order-none\",\"children\":[\"$\",\"$L1c\",null,{\"src\":\"/blog/programmatic-faceted-search/hero.png\",\"alt\":\"Scaling Programmatic Faceted Search Without Drowning in Crawl Waste\"}]}]]}]\n"])</script><script>self.__next_f.push([1,"1e:T477,I’ve built programmatic search architectures for e-commerce giants, massive real estate portals, and aggregators with millions of listings. I’ve watched Googlebot hit a server cluster so aggressively that it caused a site-wide outage, all because a junior developer left a dynamic pricing slider open to indexing. \u003cbr /\u003e\u003cbr /\u003eScaling programmatic faceted search is the holy grail of modern technical SEO. When done correctly, you capture every conceivable long-tail search query your potential customers are typing into Google. \u003cstrong class=\"font-semibold text-foreground\"\u003eBlue Nike running shoes size 10\u003c/strong\u003e. \u003cstrong class=\"font-semibold text-foreground\"\u003eTwo-bedroom apartments in downtown Austin under $2000\u003c/strong\u003e. These are high-intent, high-converting queries. But capturing them programmatically comes with a massive, highly destructive side effect: the creation of an infinite URL space. \u003cbr /\u003e\u003cbr /\u003eIf you don't control the pathways search engines use to navigate your facets, you will bleed crawl budget. You will spawn millions of useless, thin pages. And your most important pages will be completely ignored by crawlers."])</script><script>self.__next_f.push([1,"19:[\"$\",\"main\",null,{\"className\":\"w-full flex-grow\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto w-full max-w-7xl px-6 pb-32 pt-12\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex flex-col items-start gap-10 lg:flex-row xl:gap-14\",\"children\":[[\"$\",\"aside\",null,{\"className\":\"sticky top-28 hidden h-fit w-56 shrink-0 will-change-transform lg:block\",\"children\":[\"$\",\"$L1d\",null,{\"items\":[{\"id\":\"infinite-permutation\",\"text\":\"The Infinite Permutation Nightmare\",\"level\":2},{\"id\":\"mistake-canonical\",\"text\":\"Mistake #1: The Canonical Band-Aid\",\"level\":2},{\"id\":\"mistake-robots\",\"text\":\"Mistake #2: The Nuclear robots.txt Option\",\"level\":2},{\"id\":\"search-demand-matrix\",\"text\":\"How I Actually Fix This: The Search-Demand Matrix\",\"level\":2},{\"id\":\"edge-routing\",\"text\":\"Dynamic Edge Routing (The Technical Fix)\",\"level\":2},{\"id\":\"internal-funnel\",\"text\":\"Building the Internal Linking Funnel\",\"level\":2},{\"id\":\"log-validation\",\"text\":\"Validating with Log File Analysis\",\"level\":2}]}]}],[\"$\",\"article\",null,{\"id\":\"main-article\",\"className\":\"mx-auto w-full min-w-0 max-w-3xl flex-1\",\"children\":[[\"$\",\"article\",null,{\"children\":[[\"$\",\"div\",\"0\",{\"className\":\"mb-8 text-base leading-[1.8] text-muted sm:text-lg\",\"dangerouslySetInnerHTML\":{\"__html\":\"$1e\"}}],[\"$\",\"div\",\"1\",{\"className\":\"my-8 overflow-hidden rounded-xl border border-border\",\"children\":[\"$undefined\",[\"$\",\"div\",null,{\"className\":\"relative w-full\",\"style\":{\"paddingBottom\":\"56.25%\"},\"children\":[\"$\",\"iframe\",null,{\"className\":\"absolute inset-0 h-full w-full\",\"src\":\"https://www.youtube.com/embed/zAJmL6z4FEo\",\"title\":\"YouTube video\",\"allow\":\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\",\"allowFullScreen\":true}]}]]}],[\"$\",\"h2\",\"2\",{\"id\":\"infinite-permutation\",\"className\":\"mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"The Infinite Permutation Nightmare\"}}],[\"$\",\"$L1f\",null,{\"id\":\"infinite-permutation\"}]]}],[\"$\",\"div\",\"3\",{\"className\":\"mb-8 text-base leading-[1.8] text-muted sm:text-lg\",\"dangerouslySetInnerHTML\":{\"__html\":\"Let’s break down the mathematical reality of faceted navigation. You know the drill. A user clicks \\\"Blue\\\". Then \\\"Nike\\\". Then \\\"Size 10\\\". Then \\\"Under $50\\\". Suddenly, you have a URL that looks like `?color=blue\u0026brand=nike\u0026size=10\u0026price=0-50`. \u003cbr /\u003e\u003cbr /\u003eMultiply this by thousands of product categories. You've just birthed a theoretical infinite space. Most of these combinations have absolutely zero search volume. Nobody is searching for \u003cem class=\\\"italic\\\"\u003eYellow Adidas basketball shoes in size 4.5 for under $10\u003c/em\u003e. Yet, if your site architecture allows it, a bot will eventually find that combination and crawl it. \u003cbr /\u003e\u003cbr /\u003eSearch engines are remarkably dumb when traversing unstructured facets. They see an HTML link, they extract the `href`, and they add it to their crawl queue. They do not care if the page makes logical sense. They will crawl every single overlapping combination until your crawl budget is scorched earth.\"}}],\"$L20\",\"$L21\",\"$L22\",\"$L23\",\"$L24\",\"$L25\",\"$L26\",\"$L27\",\"$L28\",\"$L29\",\"$L2a\",\"$L2b\",\"$L2c\",\"$L2d\",\"$L2e\",\"$L2f\",\"$L30\",\"$L31\",\"$L32\",\"$L33\"]}],\"$L34\"]}],\"$L35\"]}]}]}]\n"])</script><script>self.__next_f.push([1,"1a:[[\"$\",\"div\",null,{\"className\":\"w-full border-b border-border bg-background py-8\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-7xl px-6 mb-6\",\"children\":[\"$\",\"h4\",null,{\"className\":\"text-center font-mono text-xs font-semibold uppercase tracking-wider text-muted\",\"children\":\"Featured On\"}]}],[\"$\",\"div\",null,{\"className\":\"testimonial-marquee relative\",\"children\":[\"$\",\"div\",null,{\"className\":\"testimonial-track items-center\",\"children\":[[\"$\",\"a\",\"0\",{\"href\":\"https://findly.tools/progseo-dev?utm_source=progseo-dev\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://findly.tools/badges/findly-tools-badge-dark.svg\",\"alt\":\"Featured on Findly.tools\",\"width\":175,\"height\":55,\"className\":\"max-h-[50px] w-auto object-contain\"}]}],[\"$\",\"a\",\"1\",{\"href\":\"https://twelve.tools\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://twelve.tools/badge1-dark.svg\",\"alt\":\"Featured on Twelve Tools\",\"width\":200,\"height\":54,\"className\":\"max-h-[50px] w-auto object-contain\"}]}],[\"$\",\"a\",\"2\",{\"href\":\"https://dofollow.tools\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://dofollow.tools/badge/badge_dark.svg\",\"alt\":\"Featured on Dofollow.Tools\",\"width\":200,\"height\":54,\"className\":\"max-h-[50px] w-auto object-contain\"}]}],[\"$\",\"a\",\"3\",{\"href\":\"https://rankinpublic.xyz/products/progseo.dev\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://rankinpublic.xyz/api/badges/badge2.png?site=progseo.dev\",\"alt\":\"Featured on RankInPublic\",\"width\":200,\"height\":64,\"className\":\"max-h-[50px] w-auto object-contain\"}]}],[\"$\",\"a\",\"4\",{\"href\":\"https://indieai.directory/\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"span\",null,{\"className\":\"text-sm font-medium text-muted hover:text-foreground\",\"children\":\"Listed on IndieAI Directory\"}]}],[\"$\",\"a\",\"5\",{\"href\":\"https://uno.directory\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://uno.directory/uno-directory.svg\",\"alt\":\"Listed on Uno Directory\",\"width\":120,\"height\":30,\"className\":\"max-h-[50px] w-auto object-contain\"}]}],[\"$\",\"a\",\"6\",{\"href\":\"https://auraplusplus.com/projects/progseo-dev\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://auraplusplus.com/images/badges/featured-on-dark.svg\",\"alt\":\"Featured on Aura++\",\"width\":265,\"height\":58,\"className\":\"max-h-[50px] w-auto object-contain\"}]}],[\"$\",\"a\",\"7\",{\"href\":\"https://theresanaiforthat.com/ai/https-www-progseo-dev/?ref=featured\u0026v=9432409\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://media.theresanaiforthat.com/featured-on-taaft.png?width=600\",\"alt\":\"Featured on There's An AI For That\",\"width\":300,\"height\":54,\"className\":\"max-h-[50px] w-auto object-contain\"}]}],[\"$\",\"a\",\"8\",{\"href\":\"https://www.uneed.best/tool/progseo\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://www.uneed.best/POTD3A.png\",\"alt\":\"Uneed POTD3 Badge\",\"width\":250,\"height\":54,\"className\":\"max-h-[50px] w-auto object-contain\"}]}],\"$L36\",\"$L37\",\"$L38\",\"$L39\",\"$L3a\",\"$L3b\",\"$L3c\",\"$L3d\",\"$L3e\"]}]}]]}],\"$L3f\"]\n"])</script><script>self.__next_f.push([1,"43:I[472371,[\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"FAQBlockClient\"]\n44:I[605500,[\"/_next/static/chunks/12e04fe5d1c7aeec.js?dpl=dpl_9oV7Hg6CipFKiwLBXfxKjoCU42YB\"],\"Image\"]\n20:[\"$\",\"div\",\"4\",{\"className\":\"my-10 grid grid-cols-2 gap-4 sm:grid-cols-4\",\"children\":[[\"$\",\"div\",\"0\",{\"className\":\"rounded-xl border border-border bg-surface/40 px-5 py-6 text-center\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-1 font-mono text-2xl font-bold sm:text-3xl\",\"style\":{\"color\":\"var(--accent)\"},\"children\":\"1,600\"}],[\"$\",\"div\",null,{\"className\":\"text-xs text-muted\",\"children\":\"Combinations for just 10 brands, 5 sizes, 8 colors, and 4 prices\"}]]}],[\"$\",\"div\",\"1\",{\"className\":\"rounded-xl border border-border bg-surface/40 px-5 py-6 text-center\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-1 font-mono text-2xl font-bold sm:text-3xl\",\"style\":{\"color\":\"var(--accent)\"},\"children\":\"800,000+\"}],[\"$\",\"div\",null,{\"className\":\"text-xs text-muted\",\"children\":\"Generated URLs across 500 standard categories\"}]]}],[\"$\",\"div\",\"2\",{\"className\":\"rounded-xl border border-border bg-surface/40 px-5 py-6 text-center\",\"children\":[[\"$\",\"div\",null,{\"className\":\"mb-1 font-mono text-2xl font-bold sm:text-3xl\",\"style\":{\"color\":\"var(--accent)\"},\"children\":\"99.8%\"}],[\"$\",\"div\",null,{\"className\":\"text-xs text-muted\",\"children\":\"Average percentage of facet combinations with zero search volume\"}]]}]]}]\n21:[\"$\",\"h2\",\"5\",{\"id\":\"mistake-canonical\",\"className\":\"mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"Mistake #1: The Canonical Band-Aid\"}}],[\"$\",\"$L1f\",null,{\"id\":\"mistake-canonical\"}]]}]\n40:T4ba,I see this constantly during technical SEO audits. A team realizes they have a facet problem, so they slap a `\u003clink rel=\"canonical\" href=\"/\" /\u003e` on every single parameterized URL and call it a day. \u003cbr /\u003e\u003cbr /\u003eI despise this advice. Google ignores canonical tags on faceted pages more than half the time anyway. \u003cbr /\u003e\u003cbr /\u003eWhy? Because a \u003ca href=\"/blog/dynamic-canonical-tags\" class=\"underline decoration-accent underline-offset-4 transition-colors hover:text-accent\" target=\"_blank\" rel=\"noopener noreferrer\"\u003ecanonical tag\u003c/a\u003e is merely a hint, not a directive. If your root category shows 100 products, and a user applies three filters so the page only displays 2 products, Google’s algorithms look at the DOM and decide the pages are fundamentally different. They will ignore your canonical hint and index the parameterized page anyway. \u003cbr /\u003e\u003cbr /\u003eMore importantly, \u003cstrong class=\"font-semibold text-foreground\"\u003ecanonicals do not save crawl budget\u003c/strong\u003e. Googlebot must initiate a network request, download the HTML, render the DOM, and parse the `\u003chead\u003e` just to see your canonical tag. By the time it processes the tag, the compute resources are spent. You’ve already paid the price of the crawl.22:[\"$\",\"div\",\"6\",{\"className\":\"mb-8 text-base leading-[1.8] text-muted sm:text-lg\",\"dangerouslySetInnerHTML\":{\"__html\":\"$40\"}}]\n23:[\"$\",\"h2\",\"7\",{\"id\":\"mistake-robots\",\"className\":\"mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"Mistake #2: The Nuclear robots.txt Option\"}}],[\"$\",\"$L1f\",null,{\"id\":\"mistake-robots\"}]]}]\n24:[\"$\",\"div\",\"8\",{\"className\":\"mb-8 text-base leading-[1.8] text-muted sm:text-lg\",\"dangerouslySetInnerHTML\":{\"__html\":\"The second common trap is the nuclear option. A stressed-out SEO opens `robots.txt` and drops a `Disallow: /\u003cem class=\\\"italic\\\"\u003e?\u003c/em\u003e` or targets specific parameters with `Disallow: /*?color=`. \u003cbr /\u003e\u003cbr /\u003eRelying solely on robots.txt for granular facet control is lazy engineering. \u003cbr /\u003e\u003cbr /\u003eWhen you blanket-disallow parameters, you inevitably block essential tracking parameters, UTMs, or internal site search logic. Worse, you completely trap link equity. If a major publication links to your highly specific filtered view because it perfectly matches their article's topic, and you block it via robots.txt, that PageRank vanishe"])</script><script>self.__next_f.push([1,"s into the void. It cannot flow through your site. You have essentially built a dam blocking the SEO river. You create orphan URL paths and sever the connection between your categories.\"}}]\n25:[\"$\",\"h2\",\"9\",{\"id\":\"search-demand-matrix\",\"className\":\"mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"How I Actually Fix This: The Search-Demand Matrix\"}}],[\"$\",\"$L1f\",null,{\"id\":\"search-demand-matrix\"}]]}]\n41:T5c3,"])</script><script>self.__next_f.push([1,"So, how do I actually fix this at scale? I build what I call a \u003cstrong class=\"font-semibold text-foreground\"\u003eSearch-Demand Matrix\u003c/strong\u003e. We stop guessing what gets indexed. We let hard data dictate the architecture. \u003cbr /\u003e\u003cbr /\u003eI programmatically pull search volume data via APIs—like \u003ca href=\"https://dataforseo.com\" class=\"underline decoration-accent underline-offset-4 transition-colors hover:text-accent\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eDataForSEO\u003c/a\u003e or standard Keyword Planner scripts—and cross-reference it with our available facet combinations in the database. If the data shows that \"Blue Nike Shoes\" has 5,000 monthly searches, that specific permutation is mathematically unlocked. \u003cbr /\u003e\u003cbr /\u003eOnce unlocked, our system automatically rewrites the URL to a \u003ca href=\"/blog/optimize-url-slugs-programmatic\" class=\"underline decoration-accent underline-offset-4 transition-colors hover:text-accent\" target=\"_blank\" rel=\"noopener noreferrer\"\u003eclean static path\u003c/a\u003e (e.g., `/shoes/nike/blue`), updates the canonical to self-reference, injects an optimized `\u003ctitle\u003e` and `\u003ch1\u003e`, and adds it to the XML sitemap. \u003cbr /\u003e\u003cbr /\u003eIf \"Yellow Nike Shoes Size 4\" has zero searches, it remains a standard parameter-based URL (e.g., `/shoes?brand=nike\u0026color=yellow\u0026size=4`). If a facet combination has zero search volume, it is a UI state, not a web page. Stop trying to index UI states. Treat them as distinct interactive elements rather than crawlable destinations."])</script><script>self.__next_f.push([1,"26:[\"$\",\"div\",\"10\",{\"className\":\"mb-8 text-base leading-[1.8] text-muted sm:text-lg\",\"dangerouslySetInnerHTML\":{\"__html\":\"$41\"}}]\n"])</script><script>self.__next_f.push([1,"27:[\"$\",\"div\",\"11\",{\"className\":\"my-8 grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3\",\"children\":[[\"$\",\"div\",\"0\",{\"className\":\"rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/30 hover:bg-surface/70\",\"children\":[\"$undefined\",[\"$\",\"h4\",null,{\"className\":\"mb-2 text-sm font-semibold break-words\",\"dangerouslySetInnerHTML\":{\"__html\":\"Search Volume Thresholds\"}}],[\"$\",\"p\",null,{\"className\":\"text-sm leading-relaxed text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Only facet combinations exceeding 20 searches/month are dynamically assigned clean URLs.\"}}]]}],[\"$\",\"div\",\"1\",{\"className\":\"rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/30 hover:bg-surface/70\",\"children\":[\"$undefined\",[\"$\",\"h4\",null,{\"className\":\"mb-2 text-sm font-semibold break-words\",\"dangerouslySetInnerHTML\":{\"__html\":\"Clean URL Rewriting\"}}],[\"$\",\"p\",null,{\"className\":\"text-sm leading-relaxed text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Convert complex parameter strings into structured, readable directories like //brand/color.\"}}]]}],[\"$\",\"div\",\"2\",{\"className\":\"rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/30 hover:bg-surface/70\",\"children\":[\"$undefined\",[\"$\",\"h4\",null,{\"className\":\"mb-2 text-sm font-semibold break-words\",\"dangerouslySetInnerHTML\":{\"__html\":\"Dynamic Meta Injection\"}}],[\"$\",\"p\",null,{\"className\":\"text-sm leading-relaxed text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Auto-generate H1 tags, Title tags, and contextual copy based on the activated facet parameters.\"}}]]}]]}]\n"])</script><script>self.__next_f.push([1,"28:[\"$\",\"h2\",\"12\",{\"id\":\"edge-routing\",\"className\":\"mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"Dynamic Edge Routing (The Technical Fix)\"}}],[\"$\",\"$L1f\",null,{\"id\":\"edge-routing\"}]]}]\n29:[\"$\",\"div\",\"13\",{\"className\":\"mb-8 text-base leading-[1.8] text-muted sm:text-lg\",\"dangerouslySetInnerHTML\":{\"__html\":\"Knowing what to index is only half the battle. You still need to prevent Google from crawling the zero-volume combinations. Historically, SEOs used the PRG (Post-Redirect-Get) pattern to hide faceted links from search engines. You would submit a filter via a POST request, redirect the server, and serve the content. \u003cbr /\u003e\u003cbr /\u003eThe PRG pattern is an outdated, clunky hack. \u003cbr /\u003e\u003cbr /\u003eToday, I rely heavily on Edge Workers—using Cloudflare Workers or AWS Lambda@Edge—to intercept network requests before they ever hit the origin server. We write logic at the CDN level. If the `User-Agent` identifies as Googlebot, and it attempts to access a non-indexable parameterized permutation, the edge worker strips the parameters, serves a 403, or dynamically removes `href` attributes from the rendered HTML snapshot. For human users on Chrome or Safari, the application functions like a seamless, lightning-fast React or Vue Single Page Application.\"}}]\n2a:[\"$\",\"blockquote\",\"14\",{\"className\":\"my-10 border-l-4 border-accent py-2 pl-6\",\"children\":[[\"$\",\"p\",null,{\"className\":\"mb-2 font-sans text-xl italic leading-relaxed sm:text-2xl\",\"children\":[\"“\",\"Crawl budget isn't just about search engine limits; it's about forcing Googlebot to eat the exact meals you prepare for it, rather than letting it raid the pantry.\",\"”\"]}],\"$undefined\"]}]\n2b:[\"$\",\"h2\",\"15\",{\"id\":\"internal-funnel\",\"className\":\"mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"Building the Internal Linking Funnel\"}}],[\"$\",\"$L1f\",null,{\"id\":\"internal-funnel\"}]]}]\n42:T54a,You have to ruthlessly control the funnel. If you leave standard HTML `\u003ca\u003e` tags pointing to millions of non-indexable parameter strings on your category pages, Google will try to crawl them regardless of your canonicals, meta robots, or Edge rules. \u003cbr /\u003e\u003cbr /\u003eI utilize a technique called \u003cstrong class=\"font-semibold text-foreground\"\u003eEvent-Delegated Routing\u003c/strong\u003e. For facet links we explicitly \u003cem class=\"italic\"\u003edo not\u003c/em\u003e want crawled, we remove the `href` attribute entirely from the DOM. Instead, we inject a `data-url` attribute and use a JavaScript `onClick` event listener to trigger the client-side routing. \u003cbr /\u003e\u003cbr /\u003eSince Googlebot's link discovery phase relies on finding valid `href` attributes inside anchor tags, the zero-volume URLs become effectively invisible to the crawler. \u003cbr /\u003e\u003cbr /\u003eYour \u003ca href=\"/blog/seo-friendly-pagination\" class=\"underline decoration-accent underline-offset-4 transition-colors hover:text-accent\" target=\"_blank\" rel=\"noopener noreferrer\"\u003epagination\u003c/a\u003e is probably destroying your crawl depth, too. Apply this exact same event-delegated logic to deep pagination layers. Google does not need to crawl page 482 of your \"All Shoes\" category. Restrict bot access to the first 5-10 pages of pagination, and force them to discover deeper products through highly specific, indexable sub-categories instead.2c:[\"$\",\"div\",\"16\",{\"className\":\"mb-8 text-base leading-[1.8] text-muted sm:text-lg\",\"dangerouslySetInnerHTML\":{\"__html\":\"$42\"}}]\n2d:[\"$\",\"ul\",\"17\",{\"className\":\"mb-8 space-y-2 pl-6 text-base leading-relaxed text-muted list-disc\",\"children\":[[\"$\",\"li\",\"0\",{\"dangerouslySetInnerHTML\":{\"__html\":\"Audit current facet HTML structure and identify all hrefs.\"}}],[\"$\",\"li\",\"1\",{\"dangerouslySetInnerHTML\":{\"__html\":\"Map indexable combinations to standard \u003ca href=\\\"...\\\"\u003e tags.\"}}],[\"$\",\"li\",\"2\",{\"dangerouslySetInnerHTML\":{\"__html\":\"Convert non-indexable combinations to \u003cspan data-url=\\\"...\\\"\u003e or anchor tags without href attributes.\"}}],[\"$\",\"li\",\"3\",{\"dangerouslySetInnerHTML\":{\"__html\":\"Implement Java"])</script><script>self.__next_f.push([1,"Script event listeners to handle client-side routing for human clicks.\"}}],[\"$\",\"li\",\"4\",{\"dangerouslySetInnerHTML\":{\"__html\":\"Test rendering with Google Search Console's URL Inspection tool.\"}}]]}]\n"])</script><script>self.__next_f.push([1,"2e:[\"$\",\"div\",\"18\",{\"className\":\"my-8 overflow-x-auto rounded-xl border border-border\",\"children\":[\"$\",\"table\",null,{\"className\":\"w-full text-sm\",\"children\":[[\"$\",\"thead\",null,{\"children\":[\"$\",\"tr\",null,{\"className\":\"border-b border-border bg-surface/60\",\"children\":[[\"$\",\"th\",\"0\",{\"className\":\"px-5 py-3 text-left font-mono text-xs font-semibold uppercase tracking-wider text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Method\"}}],[\"$\",\"th\",\"1\",{\"className\":\"px-5 py-3 text-left font-mono text-xs font-semibold uppercase tracking-wider text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Crawl Budget Saved?\"}}],[\"$\",\"th\",\"2\",{\"className\":\"px-5 py-3 text-left font-mono text-xs font-semibold uppercase tracking-wider text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Link Equity Retained?\"}}],[\"$\",\"th\",\"3\",{\"className\":\"px-5 py-3 text-left font-mono text-xs font-semibold uppercase tracking-wider text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Implementation Effort\"}}]]}]}],[\"$\",\"tbody\",null,{\"children\":[[\"$\",\"tr\",\"0\",{\"className\":\"border-b border-border/50 transition-colors last:border-0 hover:bg-surface/30\",\"children\":[[\"$\",\"td\",\"0\",{\"className\":\"px-5 py-3 font-medium\",\"dangerouslySetInnerHTML\":{\"__html\":\"Rel=Canonical\"}}],[\"$\",\"td\",\"1\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"No\"}}],[\"$\",\"td\",\"2\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Usually\"}}],[\"$\",\"td\",\"3\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Low\"}}]]}],[\"$\",\"tr\",\"1\",{\"className\":\"border-b border-border/50 transition-colors last:border-0 hover:bg-surface/30\",\"children\":[[\"$\",\"td\",\"0\",{\"className\":\"px-5 py-3 font-medium\",\"dangerouslySetInnerHTML\":{\"__html\":\"Robots.txt Disallow\"}}],[\"$\",\"td\",\"1\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Yes\"}}],[\"$\",\"td\",\"2\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"No\"}}],[\"$\",\"td\",\"3\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Low\"}}]]}],[\"$\",\"tr\",\"2\",{\"className\":\"border-b border-border/50 transition-colors last:border-0 hover:bg-surface/30\",\"children\":[[\"$\",\"td\",\"0\",{\"className\":\"px-5 py-3 font-medium\",\"dangerouslySetInnerHTML\":{\"__html\":\"Event-Delegated JS Routing\"}}],[\"$\",\"td\",\"1\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Yes\"}}],[\"$\",\"td\",\"2\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Yes\"}}],[\"$\",\"td\",\"3\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"High\"}}]]}],[\"$\",\"tr\",\"3\",{\"className\":\"border-b border-border/50 transition-colors last:border-0 hover:bg-surface/30\",\"children\":[[\"$\",\"td\",\"0\",{\"className\":\"px-5 py-3 font-medium\",\"dangerouslySetInnerHTML\":{\"__html\":\"PRG Pattern\"}}],[\"$\",\"td\",\"1\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Yes\"}}],[\"$\",\"td\",\"2\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Yes\"}}],[\"$\",\"td\",\"3\",{\"className\":\"px-5 py-3 text-muted\",\"dangerouslySetInnerHTML\":{\"__html\":\"Medium\"}}]]}]]}]]}]}]\n"])</script><script>self.__next_f.push([1,"2f:[\"$\",\"h2\",\"19\",{\"id\":\"log-validation\",\"className\":\"mb-6 mt-14 text-3xl font-bold tracking-tight sm:text-4xl group scroll-mt-24\",\"children\":[[\"$\",\"span\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"Validating with Log File Analysis\"}}],[\"$\",\"$L1f\",null,{\"id\":\"log-validation\"}]]}]\n30:[\"$\",\"div\",\"20\",{\"className\":\"mb-8 text-base leading-[1.8] text-muted sm:text-lg\",\"dangerouslySetInnerHTML\":{\"__html\":\"You cannot validate a massive programmatic faceted search architecture with third-party tools like Ahrefs, Semrush, or even Screaming Frog. They don't crawl exactly the way Google crawls. You have to go straight to the raw server logs. \u003cbr /\u003e\u003cbr /\u003eI routinely download raw Nginx or Apache logs and use command-line tools like `awk` and `grep` to isolate Googlebot requests. I want to see exactly which parameterized URLs the bot is hitting, how often, and what status codes it's receiving. \u003cbr /\u003e\u003cbr /\u003eIf I see a high volume of requests to non-indexed facets (like `?sort=price_desc`), I instantly know my internal linking architecture is leaking. Log file analysis is the only absolute source of truth in technical SEO; everything else is just an educated guess. When you finally see Googlebot ignoring your parameters and aggressively crawling your high-value programmatic pages, you know you've won.\"}}]\n31:[\"$\",\"$L43\",\"21\",{\"items\":[{\"q\":\"Will using JavaScript onClick for links hurt my overall SEO?\",\"a\":\"Not if you use it correctly. You only use JS routing for facet combinations that you explicitly DO NOT want indexed. For high-volume, indexable combinations, you must use standard \u003ca href\u003e tags.\"},{\"q\":\"How many facets should I allow to be indexed?\",\"a\":\"It depends entirely on search volume. Some sites index 1,000 combinations; others index 500,000. If the specific combination has search demand and you have inventory for it, index it.\"},{\"q\":\"Can I just use the Meta Robots NOINDEX tag?\",\"a\":\"NOINDEX prevents indexing, but it does not prevent crawling. Google still has to crawl the page to see the NOINDEX tag, meaning your crawl budget is still being wasted on infinite permutations.\"}]}]\n"])</script><script>self.__next_f.push([1,"32:[\"$\",\"div\",\"22\",{\"className\":\"my-16 rounded-2xl border border-border bg-surface/40 p-8 sm:p-10\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-5 mb-6\",\"children\":[[\"$\",\"$L44\",null,{\"src\":\"/aziz.jpg\",\"alt\":\"Aziz J.\",\"width\":64,\"height\":64,\"className\":\"h-16 w-16 rounded-full object-cover border border-border\"}],[\"$\",\"div\",null,{\"children\":[[\"$\",\"div\",null,{\"className\":\"text-xl font-bold text-foreground leading-tight\",\"children\":\"Aziz J.\"}],[\"$\",\"div\",null,{\"className\":\"text-sm text-muted mt-1\",\"children\":\"Founder at ProgSEO · SEO \u0026 Programmatic Content Strategist\"}]]}]]}],[\"$\",\"div\",null,{\"className\":\"text-[10px] font-bold uppercase tracking-[0.15em] text-muted mb-3\",\"children\":\"Written By\"}],[\"$\",\"p\",null,{\"className\":\"text-muted leading-relaxed mb-6 max-w-2xl italic\",\"children\":\"Aziz built ProgSEO to help founders and marketers scale their organic traffic without scaling their team. He writes about programmatic SEO, content automation, and the tools that actually move the needle.\"}],[\"$\",\"div\",null,{\"className\":\"flex items-center gap-4\",\"children\":[\"$\",\"a\",null,{\"href\":\"https://twitter.com/progseo\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"aria-label\":\"Twitter\",\"children\":[\"$\",\"svg\",null,{\"className\":\"h-5 w-5\",\"fill\":\"currentColor\",\"viewBox\":\"0 0 24 24\",\"children\":[\"$\",\"path\",null,{\"d\":\"M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z\"}]}]}]}]]}]\n"])</script><script>self.__next_f.push([1,"33:[\"$\",\"div\",\"23\",{\"className\":\"my-12 rounded-2xl border border-border bg-surface p-8 sm:p-12\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"mb-4 text-2xl font-bold\",\"children\":\"Ready to Scale Your Programmatic SEO?\"}],[\"$\",\"div\",null,{\"className\":\"mb-6 text-muted leading-relaxed\",\"dangerouslySetInnerHTML\":{\"__html\":\"Stop guessing and start dominating. Let's rebuild your faceted search architecture to capture millions of long-tail queries without wasting a single drop of crawl budget.\"}}],\"$undefined\",\"$undefined\",[\"$\",\"a\",null,{\"href\":\"https://www.progseo.dev\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-block rounded-full px-8 py-3 text-sm font-semibold text-black transition-all hover:shadow-lg active:scale-95\",\"style\":{\"backgroundColor\":\"var(--accent)\"},\"children\":\"Try free 3 day\"}]]}]\n"])</script><script>self.__next_f.push([1,"34:[\"$\",\"div\",null,{\"className\":\"mt-16 border-t border-border/50 pt-8\",\"children\":[[\"$\",\"h3\",null,{\"className\":\"mb-6 text-sm font-bold uppercase tracking-[0.15em] text-foreground\",\"children\":\"Read Next\"}],[\"$\",\"div\",null,{\"className\":\"grid grid-cols-1 gap-4 sm:grid-cols-2\",\"children\":[[\"$\",\"$L13\",\"handle-url-parameters-seo\",{\"href\":\"/blog/handle-url-parameters-seo\",\"className\":\"group flex min-h-[100px] flex-col justify-center rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/50 hover:bg-surface/70\",\"children\":[\"$\",\"h4\",null,{\"className\":\"text-base font-semibold leading-snug transition-colors group-hover:text-accent\",\"children\":\"How I Handle URL Parameters SEO \u0026 Stop Crawl Waste\"}]}],[\"$\",\"$L13\",\"find-crawl-traps-server-logs\",{\"href\":\"/blog/find-crawl-traps-server-logs\",\"className\":\"group flex min-h-[100px] flex-col justify-center rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/50 hover:bg-surface/70\",\"children\":[\"$\",\"h4\",null,{\"className\":\"text-base font-semibold leading-snug transition-colors group-hover:text-accent\",\"children\":\"The Simple Script I Use To Find Crawl Traps Server Logs Reveal\"}]}],[\"$\",\"$L13\",\"prioritize-crawl-budget\",{\"href\":\"/blog/prioritize-crawl-budget\",\"className\":\"group flex min-h-[100px] flex-col justify-center rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/50 hover:bg-surface/70\",\"children\":[\"$\",\"h4\",null,{\"className\":\"text-base font-semibold leading-snug transition-colors group-hover:text-accent\",\"children\":\"Prioritizing Crawl Budget System\"}]}],[\"$\",\"$L13\",\"how-i-detect-redirect-chains-before-googlebot-finds-them\",{\"href\":\"/blog/how-i-detect-redirect-chains-before-googlebot-finds-them\",\"className\":\"group flex min-h-[100px] flex-col justify-center rounded-xl border border-border bg-surface/40 p-6 transition-all hover:border-accent/50 hover:bg-surface/70\",\"children\":[\"$\",\"h4\",null,{\"className\":\"text-base font-semibold leading-snug transition-colors group-hover:text-accent\",\"children\":\"Detect Redirect Chains Before Googlebot\"}]}]]}]]}]\n"])</script><script>self.__next_f.push([1,"35:[\"$\",\"aside\",null,{\"className\":\"sticky top-28 hidden h-fit w-72 shrink-0 xl:block\",\"children\":[\"$\",\"div\",null,{\"className\":\"rounded-2xl border border-border bg-surface/60 p-6\",\"children\":[[\"$\",\"h2\",null,{\"className\":\"text-lg font-bold leading-tight tracking-tight\",\"children\":\"Try ProgSEO free\"}],[\"$\",\"p\",null,{\"className\":\"mt-2 text-sm leading-relaxed text-muted\",\"children\":\"Enter your domain and get three SEO articles written for it. No card required.\"}],[\"$\",\"a\",null,{\"href\":\"/app\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"mt-5 flex w-full items-center justify-center gap-1.5 rounded-xl px-5 py-3 text-sm font-semibold text-black transition-all hover:shadow-lg active:scale-[0.98]\",\"style\":{\"backgroundColor\":\"var(--accent)\"},\"children\":[\"Generate 3 free articles\",[\"$\",\"svg\",null,{\"className\":\"h-3.5 w-3.5\",\"viewBox\":\"0 0 16 16\",\"fill\":\"none\",\"stroke\":\"currentColor\",\"strokeWidth\":\"2\",\"aria-hidden\":\"true\",\"children\":[\"$\",\"path\",null,{\"d\":\"M4 12L12 4M12 4H6M12 4v6\",\"strokeLinecap\":\"round\",\"strokeLinejoin\":\"round\"}]}]]}],[\"$\",\"ul\",null,{\"className\":\"mt-6 space-y-2.5 border-t border-border/70 pt-5\",\"children\":[[\"$\",\"li\",\"Keyword research from your own site\",{\"className\":\"flex items-start gap-2.5 text-sm text-muted\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"mt-0.5 h-4 w-4 shrink-0\",\"viewBox\":\"0 0 20 20\",\"fill\":\"var(--accent)\",\"aria-hidden\":\"true\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"d\":\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\"clipRule\":\"evenodd\"}]}],\"Keyword research from your own site\"]}],[\"$\",\"li\",\"Full articles, not outlines\",{\"className\":\"flex items-start gap-2.5 text-sm text-muted\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"mt-0.5 h-4 w-4 shrink-0\",\"viewBox\":\"0 0 20 20\",\"fill\":\"var(--accent)\",\"aria-hidden\":\"true\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"d\":\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\"clipRule\":\"evenodd\"}]}],\"Full articles, not outlines\"]}],[\"$\",\"li\",\"Visual editor before you publish\",{\"className\":\"flex items-start gap-2.5 text-sm text-muted\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"mt-0.5 h-4 w-4 shrink-0\",\"viewBox\":\"0 0 20 20\",\"fill\":\"var(--accent)\",\"aria-hidden\":\"true\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"d\":\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\"clipRule\":\"evenodd\"}]}],\"Visual editor before you publish\"]}],[\"$\",\"li\",\"JSON-LD schema and OpenGraph included\",{\"className\":\"flex items-start gap-2.5 text-sm text-muted\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"mt-0.5 h-4 w-4 shrink-0\",\"viewBox\":\"0 0 20 20\",\"fill\":\"var(--accent)\",\"aria-hidden\":\"true\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"d\":\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\"clipRule\":\"evenodd\"}]}],\"JSON-LD schema and OpenGraph included\"]}],[\"$\",\"li\",\"Export to Markdown, TSX or JSON\",{\"className\":\"flex items-start gap-2.5 text-sm text-muted\",\"children\":[[\"$\",\"svg\",null,{\"className\":\"mt-0.5 h-4 w-4 shrink-0\",\"viewBox\":\"0 0 20 20\",\"fill\":\"var(--accent)\",\"aria-hidden\":\"true\",\"children\":[\"$\",\"path\",null,{\"fillRule\":\"evenodd\",\"d\":\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\"clipRule\":\"evenodd\"}]}],\"Export to Markdown, TSX or JSON\"]}]]}]]}]}]\n"])</script><script>self.__next_f.push([1,"36:[\"$\",\"a\",\"9\",{\"href\":\"https://findly.tools/progseo-dev?utm_source=progseo-dev\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://findly.tools/badges/findly-tools-badge-dark.svg\",\"alt\":\"Featured on Findly.tools\",\"width\":175,\"height\":55,\"className\":\"max-h-[50px] w-auto object-contain\"}]}]\n37:[\"$\",\"a\",\"10\",{\"href\":\"https://twelve.tools\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://twelve.tools/badge1-dark.svg\",\"alt\":\"Featured on Twelve Tools\",\"width\":200,\"height\":54,\"className\":\"max-h-[50px] w-auto object-contain\"}]}]\n38:[\"$\",\"a\",\"11\",{\"href\":\"https://dofollow.tools\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://dofollow.tools/badge/badge_dark.svg\",\"alt\":\"Featured on Dofollow.Tools\",\"width\":200,\"height\":54,\"className\":\"max-h-[50px] w-auto object-contain\"}]}]\n39:[\"$\",\"a\",\"12\",{\"href\":\"https://rankinpublic.xyz/products/progseo.dev\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://rankinpublic.xyz/api/badges/badge2.png?site=progseo.dev\",\"alt\":\"Featured on RankInPublic\",\"width\":200,\"height\":64,\"className\":\"max-h-[50px] w-auto object-contain\"}]}]\n3a:[\"$\",\"a\",\"13\",{\"href\":\"https://indieai.directory/\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"span\",null,{\"className\":\"text-sm font-medium text-muted hover:text-foreground\",\"children\":\"Listed on IndieAI Directory\"}]}]\n3b:[\"$\",\"a\",\"14\",{\"href\":\"https://uno.directory\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://uno.directory/uno-directory.svg\",\"alt\":\"Listed on Uno Directory\",\"width\":120,\"height\":30,\"className\":\"max-h-[50px] w-auto object-contain\"}]}]\n3c:[\"$\",\"a\",\"15\",{\"href\":\"https://auraplusplus.com/projects/progseo-dev\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://auraplusplus.com/images/badges/featured-on-dark.svg\",\"alt\":\"Featured on Aura++\",\"width\":265,\"height\":58,\"className\":\"max-h-[50px] w-auto object-contain\"}]}]\n3d:[\"$\",\"a\",\"16\",{\"href\":\"https://theresanaiforthat.com/ai/https-www-progseo-dev/?ref=featured\u0026v=9432409\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://media.theresanaiforthat.com/featured-on-taaft.png?width=600\",\"alt\":\"Featured on There's An AI For That\",\"width\":300,\"height\":54,\"className\":\"max-h-[50px] w-auto object-contain\"}]}]\n3e:[\"$\",\"a\",\"17\",{\"href\":\"https://www.uneed.best/tool/progseo\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"inline-flex shrink-0 items-center justify-center transition-opacity hover:opacity-80 mx-8\",\"children\":[\"$\",\"img\",null,{\"src\":\"https://www.uneed.best/POTD3A.png\",\"alt\":\"Uneed POTD3 Badge\",\"width\":250,\"height\":54,\"className\":\"max-h-[50px] w-auto object-contain\"}]}]\n"])</script><script>self.__next_f.push([1,"3f:[\"$\",\"footer\",null,{\"className\":\"mt-auto border-t border-border\",\"children\":[\"$\",\"div\",null,{\"className\":\"mx-auto max-w-[1200px] sm:border-x sm:border-border\",\"children\":[[\"$\",\"div\",null,{\"className\":\"grid gap-10 px-4 py-14 sm:grid-cols-2 sm:px-8 lg:grid-cols-[1.4fr_repeat(4,1fr)] lg:px-12\",\"children\":[[\"$\",\"div\",null,{\"className\":\"sm:col-span-2 lg:col-span-1\",\"children\":[[\"$\",\"$L13\",null,{\"href\":\"/\",\"className\":\"group inline-flex items-center gap-2 py-2\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex h-7 w-7 items-center justify-center rounded-md bg-accent font-mono text-xs font-bold text-black transition-transform group-hover:scale-105\",\"children\":\"P\"}],[\"$\",\"span\",null,{\"className\":\"text-[17px] font-semibold tracking-tight\",\"children\":\"ProgSEO\"}]]}],[\"$\",\"p\",null,{\"className\":\"mt-4 max-w-xs text-sm leading-relaxed text-muted\",\"children\":\"Keyword research, researched articles and publishing for your site — on a calendar you control.\"}],[\"$\",\"address\",null,{\"className\":\"mt-6 max-w-xs text-sm not-italic leading-relaxed text-muted\",\"children\":[\"Barmonteley INC\",[\"$\",\"br\",null,{}],\"1521 Concord Pike, Ste 301 #279\",[\"$\",\"br\",null,{}],\"Wilmington, DE 19803, United States\"]}]]}],[[\"$\",\"nav\",\"Product\",{\"aria-label\":\"Product\",\"children\":[[\"$\",\"h4\",null,{\"className\":\"mb-4 text-sm font-medium text-foreground\",\"children\":\"Product\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-2.5 text-sm\",\"children\":[[\"$\",\"li\",\"/#how-it-works\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/#how-it-works\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"How it works\"}]}],[\"$\",\"li\",\"/#features\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/#features\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Features\"}]}],[\"$\",\"li\",\"/#examples\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/#examples\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Publishing\"}]}],[\"$\",\"li\",\"/#pricing\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/#pricing\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Pricing\"}]}],[\"$\",\"li\",\"/#faq\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/#faq\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"FAQ\"}]}]]}]]}],[\"$\",\"nav\",\"Resources\",{\"aria-label\":\"Resources\",\"children\":[[\"$\",\"h4\",null,{\"className\":\"mb-4 text-sm font-medium text-foreground\",\"children\":\"Resources\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-2.5 text-sm\",\"children\":[[\"$\",\"li\",\"/blog\",{\"children\":[\"$\",\"a\",null,{\"href\":\"/blog\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Blog\"}]}],[\"$\",\"li\",\"/docs\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/docs\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Docs\"}]}],[\"$\",\"li\",\"/comparisons\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/comparisons\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Comparisons\"}]}]]}]]}],[\"$\",\"nav\",\"Free SEO tools\",{\"aria-label\":\"Free SEO tools\",\"children\":[[\"$\",\"h4\",null,{\"className\":\"mb-4 text-sm font-medium text-foreground\",\"children\":\"Free SEO tools\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-2.5 text-sm\",\"children\":[[\"$\",\"li\",\"/tools\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/tools\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"All free tools\"}]}],[\"$\",\"li\",\"/tools/seo-title-generator\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/tools/seo-title-generator\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"SEO title generator\"}]}],[\"$\",\"li\",\"/tools/internal-linking-tool\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/tools/internal-linking-tool\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Internal linking suggestions\"}]}],[\"$\",\"li\",\"/tools/topical-authority-pro\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/tools/topical-authority-pro\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Topical Authority Pro\"}]}]]}]]}],[\"$\",\"nav\",\"Legal\",{\"aria-label\":\"Legal\",\"children\":[[\"$\",\"h4\",null,{\"className\":\"mb-4 text-sm font-medium text-foreground\",\"children\":\"Legal\"}],[\"$\",\"ul\",null,{\"className\":\"space-y-2.5 text-sm\",\"children\":[[\"$\",\"li\",\"/privacy\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/privacy\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Privacy policy\"}]}],\"$L45\",\"$L46\",\"$L47\"]}]]}]]]}],\"$L48\"]}]}]\n"])</script><script>self.__next_f.push([1,"45:[\"$\",\"li\",\"/terms\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/terms\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Terms of service\"}]}]\n46:[\"$\",\"li\",\"/cookie\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/cookie\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Cookie policy\"}]}]\n47:[\"$\",\"li\",\"/refund\",{\"children\":[\"$\",\"$L13\",null,{\"href\":\"/refund\",\"className\":\"text-muted transition-colors hover:text-foreground\",\"children\":\"Refund policy\"}]}]\n48:[\"$\",\"div\",null,{\"className\":\"flex flex-col items-start justify-between gap-3 border-t border-border px-4 py-6 text-xs text-muted sm:flex-row sm:items-center sm:px-8 lg:px-12\",\"children\":[[\"$\",\"p\",null,{\"children\":\"© 2026 Barmonteley INC. All rights reserved.\"}],[\"$\",\"div\",null,{\"className\":\"-my-3 flex gap-6\",\"children\":[[\"$\",\"a\",null,{\"href\":\"https://x.com/team_pseo?s=21\",\"target\":\"_blank\",\"rel\":\"noopener noreferrer\",\"className\":\"text-muted transition-colors hover:text-foreground py-3\",\"children\":\"X (Twitter)\"}],[\"$\",\"a\",null,{\"href\":\"mailto:support@progseo.dev\",\"className\":\"text-muted transition-colors hover:text-foreground py-3\",\"children\":\"support@progseo.dev\"}]]}]]}]\n"])</script></body></html>