Complete documentation for using the plugin. For setup/licensing on the business side, see FREEMIUS-SETUP.md; for architecture/code, see DEVELOPERS.md and TECHNICAL-REFERENCE.md.
Bulk SEO Studio lets you edit SEO fields — page titles, meta title/ description, headings (H1–H6), publish status, and (Pro) JSON-LD schema markup — across many WordPress pages or posts at once, through a spreadsheet-style grid, instead of opening each one individually.
It never recreates or rebuilds content. It locates and updates only the exact fields you approve, and nothing is written to the database until you’ve explicitly reviewed a side-by-side preview and confirmed.
Three ways:
Any URL that doesn’t match a real post is reported explicitly — a “Show list” toggle reveals exactly which ones, so nothing silently disappears.
On Elementor pages (Pro): heading editing works the same way, safely targeting only the specific heading widget’s text/tag — layout, styling, and every other widget are left untouched. On the Free version, Elementor pages are fully scannable/filterable and their title/status/meta can still be bulk-edited; only heading editing requires Pro.
Gutenberg/Classic pages: the real WordPress Page Title is always treated as the page’s H1 (shown as “H1-1 (Page Title)”), since that’s what your theme actually renders as the page’s H1 landmark. Its tag can’t be changed (theme-controlled), but its text can — editing it here updates the actual post title.
Click Preview Changes. Every proposed change is shown current-value vs. new-value, with a checkbox per field — uncheck anything you don’t want applied. Warnings (missing H1, duplicate headings, conflicting SEO metadata across plugins) are shown here, not buried in a log.
Nothing is saved yet at this point.
Click Confirm Changes. A progress popup shows exactly how many pages have been processed. Every page is automatically backed up immediately before its fields are written, so the whole batch (or any single page in it) can be undone later.
If your connection drops mid-save, the popup pauses with a Resume button rather than losing progress or silently continuing — click Resume once you’re back online and it continues from the exact next page, with nothing double-processed.
A separate tab for bulk-adding JSON-LD structured data, independent of whatever SEO plugin you already use (it never reads or modifies another plugin’s schema — both simply coexist as separate script blocks on the page if you use more than one).
Click Detect (or Detect Existing Schema for Selected for many rows at once) to fetch the actual live page and list every schema block already present — from any source: another SEO plugin, your theme, or hand-added code. Use this before adding more, to avoid duplicating a schema type that’s already there (Preview also warns you if a new block’s type matches one already live).
Click Edit Schema on any row. Two ways to add a block:
@type) for full control, or for schema types the guided builder doesn’t cover.Existing stored blocks are shown as editable raw JSON, so nothing is locked away even if it was originally added via the guided builder.
Same idea as the Bulk Editor’s importer: paste or upload a spreadsheet with a URL column and one or more “Schema JSON-LD” columns (one complete JSON-LD object per cell).
Same safety model as the Bulk Editor — every block is shown before saving, individually checkable, and blocks that will be removed (replaced by your new set) are called out separately. Full backup/undo through the same History screen.
History lists every batch you’ve saved: date, user, pages changed, fields changed. From here:
Undo Changes (reached via History → View Changes) gives finer control: undo a single page, or select several and undo just those — restoring page title, status, SEO metadata, and heading content/tags to their exact prior values, including the full Elementor JSON snapshot where relevant.
| Free | Pro | |
|---|---|---|
| Scan / paste URLs / grid editor | ✅ | ✅ |
| Mandatory Preview + full backup/undo | ✅ | ✅ |
| Page title, status, meta title/description | ✅ (one SEO plugin) | ✅ (multiple, with conflict detection) |
| Gutenberg/Classic heading editing | ✅ | ✅ |
| Elementor heading editing | — | ✅ |
| Bulk Schema module | — | ✅ |
| Spreadsheet bulk import (mapping + file upload) | — | ✅ |
| Pages per save batch | 20 | Unlimited |
A change doesn’t appear on the live page after saving. The plugin automatically clears relevant caches (including Elementor’s CSS cache) after every save. If it still doesn’t appear, this is almost always an external full-page cache plugin or CDN — purge that cache directly. As a manual fallback for Elementor specifically: Elementor → Tools → Regenerate CSS & Data.
A heading update didn’t apply. Check the page’s health/warnings in Preview — if a heading couldn’t be confidently located (e.g. the page structure changed since scanning), it’s skipped and reported rather than guessed at. Re-scan and try again.
Bulk import via spreadsheet seems to hang or take a very long time. This was a real, fixed bug in earlier versions (sequential per-post requests). If you’re on an old version, update — heading resolution now uses a batched endpoint (up to 60 posts per request) instead of one request per post.
“The free version supports up to 20 pages per batch” message. You’ve hit the free-tier batch cap — either save in smaller batches, or upgrade to Pro for unlimited batch size.
I ran Undo and nothing seemed to change for an Elementor page (Free version). Free version never writes to Elementor content, so there’s nothing to undo there — this is expected, not an error.
Does this replace my SEO plugin? No — it reads and writes the same meta title/description fields your SEO plugin already uses. It’s a bulk editing interface, not a replacement for sitemaps, redirects, content analysis, etc.
Will this break my Elementor pages? Heading edits target only the specific heading widget’s text/tag — layout, styling, and every other widget are left untouched, verified via targeted JSON updates rather than a full page rebuild.
What happens if my Pro license expires? The plugin keeps working exactly as configured — it just stops receiving updates and support until renewed. Nothing is ever hard-locked.
Does this work with custom post types? Yes, by default (toggleable in Settings).
Is my data sent anywhere? All scanning, editing, and saving happens within your own WordPress site via standard admin-ajax requests — nothing is sent externally. (The Pro version’s licensing/update checks do talk to Freemius’s servers, the same way any licensed plugin does.)