How Zapier runs programmatic SEO across 134,000 pages
Zapier's programmatic SEO runs on two templates and about 134,000 pair pages. The canonicals, split sitemaps and robots rules are what to copy.
Zapier's programmatic SEO runs on two page templates: one page per app, one page per app pair. Their sitemaps list about 9,400 app pages and about 134,000 pair pages. The part worth studying is what they refuse to let Google index, because a template that writes two URLs for every pair will quietly compete with itself unless somebody makes a decision early.
Two URLs per pair, one canonical
Both /apps/slack/integrations/google-sheets and /apps/google-sheets/integrations/slack load. Both serve the same page. Both carry a rel="canonical" pointing at the same address: the Google Sheets one. Only that address appears in the sitemap. We sampled 6,875 pair URLs across three sitemap chunks and found zero pairs listed in both directions.
The hero shows why the second URL exists at all. There's a Swap apps button sitting between the trigger picker and the action picker, so a visitor who thinks "Slack to Sheets" and a visitor who thinks "Sheets to Slack" both land somewhere that makes sense. People get two doors. Google gets one address.

Any template with two variables has this problem. Service by city, colour by product, role by industry. Pick the canonical order before you generate a single page, point the mirror at it, and keep the mirror out of the sitemap. Doing it afterwards means recrawling everything you already shipped.
Every page carries a fact only that page has
Thin pages are what sink programmatic SEO, and Zapier's answer is to let the data write the page. The FAQ on the Sheets and Slack page asks things like "Can I send a message to a specific Slack channel when a new row is added in Google Sheets?". That question only makes sense on that pair. The triggers and actions come out of both apps' real APIs, down to the detail that New Spreadsheet Row is instant while New Spreadsheet Row (Team Drive) polls.
Further down, three cards tagged Business Owner, IT, and Marketing describe workflows a reader in that job would recognise. Nobody hand-wrote 134,000 FAQs. Each one still resolves to a real answer for its pair, which is the whole test.

If your template produces two pages that differ only by a swapped noun, you have one page. Merging them beats publishing both.
The sitemaps and robots.txt are split by template
Zapier's robots.txt points at two sitemap indexes, and the file names give the game away: two-service-sitemap.xml and one-service-sitemap.xml. One index per template.
That's a diagnostic choice. Search Console reports indexed and not-indexed counts per sitemap, so splitting this way tells you the pair template's index rate on its own, separately from the app hub template. When one template starts rotting, the report names it. Sites that dump every URL into sitemap.xml get one number and no idea which page type moved it.
The scale falls out of the same files. The pair index holds 54 chunks; the three we counted had 2,500 URLs each in the full chunks and 1,875 in the last one, which puts the pair template near 134,000 URLs. The app index holds four chunks, about 9,400 URLs. Zapier's own page says "9,000+ apps", so the app pages and the app count line up.
The same file protects the crawl budget with three lines:
Disallow: /apps/*/landing/
Disallow: /apps/*/integrations/*/landing/
Disallow: /*?Zapier runs landing variants of these same templates for paid traffic, and those variants are blocked. Every query-string URL is blocked too, which kills faceted and tracking duplicates in one line. Same templates, different job, different crawl treatment. The pages that can rank are the pages Google is allowed to spend time on.
Each page links up, sideways, and out
One pair page links to 44 other app hubs and 26 blog posts. The breadcrumb runs Apps, then Google Sheets, then Slack, marked up as BreadcrumbList. A sidebar offers similar apps: Chatwork, Microsoft Teams, Twist. That's a lateral path into sibling pairs, which is how a crawler reaches the deep tail without a human ever linking to it.

The structured data on that single page includes FAQPage, HowTo, BreadcrumbList, SoftwareApplication and VideoObject. All of it generated from the same fields that generate the visible copy.
What to copy from this programmatic SEO at 40 pages
None of this needs Zapier's scale. Four decisions carry most of the value, and they're cheapest before you generate anything.
- Pick the canonical direction first. Two-variable templates always produce mirrors. Choose the winner, canonical the mirror into it, keep it out of the sitemap.
- Give every page one fact only it has. Pull it from your data, the way the triggers list is pulled from an API. If you can't find that fact, the page shouldn't exist.
- Split sitemaps by template. It costs nothing and turns Search Console into a per-template health report.
- Check somebody searches for the pattern. "Google sheets slack integration" is a phrase people type. A template aimed at a phrase nobody types produces 134,000 pages and no traffic, so confirm the intent before you build the generator.
Look at any pair page on Zapier and view the source. The canonical, the breadcrumb schema and the sidebar links are all readable in about a minute, and they're the same three moves you'd apply to 40 pages.
If you're weighing a programmatic set and want a second read on the template before it ships, that's the kind of thing we do.