Get Pro

Guide

Programmatic SEO in WordPress: a practical guide

Programmatic SEO means building many pages from one template and a dataset, each answering a specific search. Done well, it reaches hundreds of searches that one page never could. Done badly, it fills your site with thin pages Google ignores. Here is how to do it well.

What programmatic SEO is

Many searches follow a pattern: a fixed part and a part that varies. Plumber in Ghent, plumber in Lyon. Zapier integration with Slack, with Gmail. Physiotherapist in Bologna, opening hours. Programmatic SEO answers each variation with its own page: one template for the fixed part, and a dataset with a row for every variation.

It is how booking sites get a page per destination, software companies a page per integration and job boards a page per vacancy. In WordPress, a plugin such as RowSprout does the generating: you design the template once, fill a table, and get a real page per row.

When it works, and when it backfires

Programmatic SEO works when three things are true:

  1. People search for the variations. Check it before you build: Google Search Console, the autocomplete in Google’s search box and keyword tools show whether “[service] [town]” is searched for your towns.
  2. Each page has data of its own. The test: remove the swapped name from a page. Is there still something left that only this page has, such as a local introduction, an address, prices, opening hours, photos or reviews? Then the page has a reason to exist.
  3. The page answers the search better than a general page would. Someone searching for a plumber in Ghent wants to know whether you work in their neighbourhood and how to reach you, not a list of twenty towns.

It backfires when it is used to produce pages rather than answers. Google’s spam policies name both forms: doorway pages, which only swap a name to funnel visitors to the same content, and scaled content abuse, many pages made mainly to rank, with little value for the reader. Such pages often never get indexed (in Search Console: “Discovered – currently not indexed”), and they can hold back the rest of your site.

Step by step in WordPress

1. Pick the pattern and the list

Choose one pattern to start with, and the list that fills it: the towns you serve, your branches, your products, your integrations. Only list what is true: towns you really work in, products you really sell.

2. Collect the data per row

Put the list in a spreadsheet, with a column for everything that differs per page. For a plumber:

TownIntroductionAreaPhone
GhentTwo paragraphs about your work in Ghent: old merchant houses, lead pipes, a recent job in the Patershol.Ghent, Merelbeke, Destelbergen+32 9 123 45 67
PortoTwo paragraphs about Porto: granite town houses on steep streets, low water pressure, a recent job in Ribeira.Porto, Gaia, Matosinhos+351 22 123 4567

The introduction column is the one that matters most. Write it per row, or have it written; never settle for a sentence that only changes the town name.

3. Design the template

Build the page once, in the editor you already use, with a placeholder wherever a row’s value goes: the H1 Your plumber in [town], the introduction, the area, a call button. In RowSprout that is a template with a property per column; Your first pages walks through it.

4. Choose the URL pattern

Keep it short and readable, with the variable part in it: /plumber-ghent/ or /plumber/ghent/. Every URL has to be unique on the whole site; RowSprout checks that for every row before it generates the page.

5. Give every page its own SEO title, description and schema

Use placeholders in your SEO plugin’s fields on the template: Plumber in [town] – same-day repairs. RowSprout fills them in per page for Rank Math, Yoast SEO, SEOPress and The SEO Framework, and with Rank Math also a schema such as LocalBusiness with each page’s own address and phone number. See SEO plugins.

6. Link the pages

Pages without links pointing to them are hard to find, for visitors and search engines alike. Add an overview page that links to every generated page (RowSprout’s Grid does that, and grows with every row), link to it from your menu or service pages, and link related pages to each other, such as every service in the same town.

7. Publish in batches and watch Search Console

Start with ten or twenty of your best rows. Make sure the generated pages are in your sitemap, then watch Search Console’s Pages report for a few weeks: are they indexed, and do they get impressions? If they are, add the next batch. If they stay “Discovered – currently not indexed”, improve the content per row before you add more.

8. Keep the data fresh

Pages built from data are only as good as the data. Update the sheet and import it again, or let RowSprout Pro sync it on a schedule; changed rows update their pages. When you remove a row, its page goes too: redirect that URL to a related page with a redirect plugin, so visitors and links don’t end on a 404.

Checklist

  • Every page answers a search people actually make.
  • Every page has content of its own, beyond the swapped name.
  • SEO titles and descriptions are unique per page.
  • URLs are short, readable and unique.
  • An overview page links to every page, and related pages link to each other.
  • Generated pages are in the sitemap; the template is not.
  • You started with a small batch and checked indexing before adding more.

Build your first set of pages

Install RowSprout from WordPress.org in a minute: no limits on templates or pages. Add Pro when you need more.