Programmatic SEO is the practice of generating many similar pages from one template and one dataset — a page per city, a page per service, a page per combination of the two. Done well, it can produce a large, useful set of pages that each answer a specific, narrow query. Done carelessly, it produces a WordPress installation with tens of thousands of post rows, a slow admin panel, and backups that take forever.
The tension is structural, not accidental. WordPress treats a post as a first-class database record with its own row in wp_posts, its own rows in wp_postmeta, its own entries in whatever else hooks into post creation — revisions, search indexes, cache warmers. That machinery is useful for content someone actually writes and edits by hand. It is unnecessary weight for a page that exists only because a data row exists.
What a generated page is
In Mass Custom Fields a generated page is virtual: it has no post in wp_posts. The plugin stores one small record per page. When a visitor opens a URL such as /guides/lyon/ and WordPress has nothing there, the plugin finds the page record, loads the template and fills in the row's values. Because there is no post per page, 50,000 pages cost one table of 50,000 small rows instead of 50,000 posts, and removing them later leaves no orphaned post records behind.
There are four building blocks:
- Data source: the rows the pages are built from. It is either a data table, filled from a CSV, a Google Sheets link, or a feed of your posts, terms and WooCommerce products, or the table behind a field group.
- Page template: a normal WordPress page or post, built in the block editor or a page builder such as Elementor, with variables such as
{{ pseo.src.cities.name }}where the data belongs. - Task: the recipe that connects source and template, with the URL pattern, the title, SEO settings and an optional schedule.
- Generated pages: the result, one URL per row.
Programmatic SEO is part of the paid plans. In row mode every row becomes one page. Comparison pages, which pair rows with each other for titles such as "iPhone 16 vs Galaxy S25", and several data sources in one task need the Business plan or above.
Preview before you generate
Before anything is produced, you can preview the task and see an estimated page count. This matters because the difference between "500 cities" and "500 cities times 40 services" is two orders of magnitude, and it is easy to define a task that produces far more pages than intended once two datasets are combined. The quick start with sample data is a safe way to see a run before you use your own data; see the Programmatic SEO quick start.
Generation itself runs in the background, in batches, rather than as one long request. The task shows its status and a log, so a problem with one row does not stop the rest of the batch and is easy to find afterward.
Staying in sync with your data
Data changes after pages are generated: a row gets updated, a row gets removed, a value that fed the URL pattern changes. Each run reconciles this. New rows get a page, changed rows update theirs, and pages whose row disappeared are marked as removed and answer with 410 Gone or redirect, as you chose. A page whose URL changed keeps its old URL as a 301 redirect instead of a dead link. Pages you edited by hand keep your edits.
For data tables, pages update when the data changes. A field group table does not trigger updates by itself, so its pages follow at the task's next run.
Data sources explains how rows are read, and freshness and caches covers what reaches the page and when.
SEO integration, not a separate system
Generated pages are not a second SEO system running alongside your main one. Each page prints its own title, meta description, canonical URL, robots tag and Open Graph tags, and can carry structured data. The pages are added to the sitemap your site already uses: the WordPress core sitemap, the Yoast SEO sitemap or the Rank Math sitemap, with lastmod set to the date of the page's last real change. A crawler or a search engine does not need to know the page was generated differently from a normal post. See SEO plugins and meta tags and sitemaps for the details.
Real content always wins
If a real WordPress page already uses a URL, the generated page is not shown at that address, so a pattern cannot silently overwrite content you wrote. How the plugin resolves such conflicts is described in serving pages and conflicts.
When to convert a generated page into a real post
Generated pages are not meant to stay virtual forever in every case. When a specific page needs manual editing beyond what the template and data can express — a case study, an especially important city page, content that no longer fits the generic pattern — you can convert it into a real WordPress post. A converted post receives the resolved title and content, the field values including any AI-written text, the taxonomy terms and the SEO values of Yoast SEO or Rank Math. URLs are kept where possible, and a page whose URL has to change redirects from the old address with a 301.
Before a conversion runs, a pre-flight shows how many pages are affected, an estimate of the added database size, and how many URLs would change in a sample of up to 20 pages. Above 5,000 pages the plugin warns you; above 20,000 it asks you to type the page count to confirm, because that is the point where a mistake becomes expensive. A large conversion runs in the background in batches of 50 pages and can be resumed if it is interrupted.
Conversion is not something you do to every page. After converting, the task is paused and the converted pages are no longer managed by it. The full procedure is in converting generated pages into posts.
Limits per plan
The number of generated pages and tasks is limited per plan, and the page limit is one number for the whole site. Hidden pages count toward it; converted pages do not.
Pro | Business | Agency | |
|---|---|---|---|
Generated pages in total | 5,000 | 50,000 | Unlimited |
Tasks | 5 | 50 | Unlimited |
At the limit, existing pages keep updating and new pages wait. Nothing is deleted. See limits and plans for exactly which pages count.
Where this starts
Mass Custom Fields is where this starts: the same field group tables that hold your catalog or directory data can be the source of a task directly, without a separate export step.
Takeaway
The choice is not "generate thousands of pages" versus "keep the database small." Virtual pages let you do both: the scale of programmatic SEO without turning every generated URL into a permanent post record, and a conversion path for the specific pages that outgrow the template.



