A plumbing company that serves 40 towns needs 40 landing pages. A real estate agency covering three states needs hundreds. Writing each one by hand is the kind of job that never gets done, which is exactly the problem programmatic SEO solves: you build one strong template, feed it a structured dataset, and generate a page for every row.
This guide walks through doing that in WordPress with MPG (Multiple Pages Generator): preparing the dataset, building a template with placeholders, generating the URLs, and staying honest about the two things that can sink the whole project, the free version’s limits and Google’s policy on mass-produced pages.

What programmatic SEO looks like in WordPress
Programmatic SEO is a simple trade: instead of writing pages one by one, you write one template and let a dataset multiply it. Each row in a spreadsheet becomes one page targeting one long-tail query: “emergency plumber in Sierra Madre”, “wedding venue in Crescent Mills”, and so on.

The classic use case is local. Service businesses, directories, job boards and real estate sites all have the same shape: an entity (a city, a service, a listing) crossed with a page type. Local landing pages are where most site owners meet the technique first, and where the tooling is most mature.
On WordPress, a programmatic setup has three moving parts:
- A dataset: a CSV, Excel file or public Google Sheet with one row per page and one column per variable (city, state, phone number, tagline).
- A template: a single page design with placeholders where the variables go.
- A generator: a plugin that maps rows to URLs, renders the template with each row’s data and keeps a sitemap of the result.
Everything below builds those three parts with MPG.
Before you build: the thin-content problem ⚠️
Google’s spam policies explicitly call out scaled content abuse: generating many pages at low quality to manipulate rankings. Doorway pages, dozens of near-identical city pages that funnel visitors to the same destination, are the textbook example. Spintax (randomly swapping synonyms) does not fix this; it shuffles words without adding value.
The test that matters is simple: would this page be useful to someone who actually lives in that town? Pages pass when each one carries something genuinely local:
- Real local detail. Landmarks, neighborhoods, response times per area, not just the city name swapped in.
- Proof. Reviews or project photos from that city, even two or three per page.
- A reason to exist. Different pricing, availability or services per location, if that’s actually true.
If the honest answer is that all 200 pages would say the same thing, generate 20 pages for the towns you serve well and skip the rest. A smaller set of useful pages outranks a large set of filler, and it won’t put the domain at risk. For the broader fundamentals, WPShout’s practical SEO guide covers what makes any page rank.
Meet MPG (Multiple Pages Generator)
MPG is a WordPress plugin built for exactly this job. You give it a source file and a template, and it generates the URLs and renders each page on request. It has 2,000+ active installs and a 3.9 out of 5 rating on WordPress.org, with polarized reviews: mostly 5 stars, plus a cluster of 1-star ratings that predate the plugin’s change of ownership. Originally built by Porthas, it’s now part of the ThemeIsle family, the same company behind WPShout.
ℹ️ Disclosure: MPG is made by ThemeIsle, WPShout’s parent company. This guide treats the free version’s limits as the baseline and flags every Pro-only feature.
The plugin works with the block editor and (per the vendor) popular builders like Elementor, Divi and Beaver Builder, plus the major SEO plugins: Yoast, Rank Math, All in One SEO and SEOPress.
Step 1: Install MPG and start a project
Head to Plugins > Add New and search for “Multiple Pages Generator” (the listing still sits under its original developer name, Porthas). Install and activate, then open the new MPG menu and hit Create New.
MPG offers ready-made datasets (the setup screen lists options like Hotels) which are handy for a test run. For a real project, choose From scratch.

Step 2: Connect your dataset
The builder’s first step asks for the source. Upload a .csv, .xlsx or .ods file, or paste a public Google Sheets link if the data changes often and should stay in sync.
Structure the sheet so each column is a variable: city, state, phone, tagline. MPG turns every header into a placeholder, so a column called city becomes {{mpg_city}} everywhere in the template and URL settings.

Once the file loads, the Preview data panel shows the parsed rows. Check it carefully: a stray comma or an empty cell here becomes a broken page later.

Free-tier note: MPG Free reads a maximum of 50 rows from the source file and allows one active project. That’s enough to validate the approach on a real service area; the “hundreds of pages” version of this workflow needs Pro. More on the split below.
Step 3: Build the template
The template is a regular WordPress page with placeholders. Design it once in the block editor (or your builder of choice), and drop {{mpg_city}}, {{mpg_state_name}} and friends wherever the variables belong: the headline, the intro paragraph, the contact block, the meta title via your SEO plugin.
Two tips that save real time:
- Write one complete page first. Pick your best-known city, write the whole page as if it were the only one, then swap the local specifics for placeholders. Templates written from scratch tend to read like templates.
- Use AI for the base copy, not the local detail. A chat assistant is good at drafting the generic 80% of the page (service descriptions, FAQs). The local 20% has to come from real knowledge, or the thin-content problem from earlier comes back.
Step 4: Generate URLs and publish
Step 4 of the builder assembles the URL pattern from tags. Combining mpg_city and mpg_state_name produces URLs like /south-creek-plumbing/washington/. The live preview under the settings shows exactly what each row will produce, and See all URLs lists the full set.
The notice at the bottom of that screen is worth reading twice: the generated pages are virtual. Keep that in mind; the next section explains what it means.

Save the project and the pages are live. MPG also ships a sitemap tool so the generated URLs get in front of search engines, and a search-integration option so the virtual pages appear in your site’s own search results.
Free vs Pro: what the limits actually mean
- Free: 1 active project, 50 rows max from the source file, file upload or direct Google Sheets link, URL generation, sitemap tool, spintax, search integration.
- Pro: unlimited projects and rows, project import/export, cloning, and conditional logic in templates (show a block only when a column has a value).
- Business / Agency only: scheduled source imports (periodic re-sync with email notifications) and automatic updating of the generated pages’ modified dates.
Pricing shifts with promos, so check the MPG site for current numbers. One detail worth knowing before you buy: the headline prices are introductory, and renewals bill at full price. There’s a 30-day money-back guarantee.
The honest read: 50 free rows covers a single service area or a proof of concept. If the plan is “hundreds of local pages”, which is the pitch of this whole technique, budget for Pro from day one.
The one caveat you can’t ignore: pages are virtual
MPG doesn’t create WordPress posts. Generated pages are rendered on the fly from the dataset and template, which is why thousands of them don’t bloat your database.
The flip side is serious: deactivate or uninstall MPG and every generated page immediately returns a 404. There’s nothing in the database to export or recover. The pages exist only as long as the plugin does.
Practical implications:
- Treat the MPG project and the source file as critical site infrastructure. Back up the CSV, not just WordPress.
- If you ever migrate away, rebuild the URLs as real pages (or set 301 redirects) before removing the plugin.
- Letting a Pro subscription lapse does not take pages offline; you lose updates, priority support and scheduled imports until renewal.
Bottom line 💬
Programmatic SEO in WordPress is genuinely this approachable now: one spreadsheet, one template, one plugin. The mechanics take an afternoon. What separates a traffic asset from a Google policy violation is the part that can’t be automated, making each page worth a local reader’s time.
Start small. Point the free tier’s 50 rows at the towns you serve best, make those pages genuinely useful, and scale only what earns impressions in Search Console.
Have you tried programmatic SEO for a local business? What worked, and what flopped?
How to Speed Up Your WordPress Site
With some simple fixes, you can reduce your loading times by even 50-80% 🚀
By entering your email above, you're subscribing to our weekly newsletter. You can change your mind at any time. We respect your inbox and privacy.



