WordPress → Substack
Move a WordPress blog into Substack by pasting the site URL, then import a consented subscriber CSV. Imported posts publish immediately. RSS alone can stop after about 20 posts. Images and footnotes need a pass before you send.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
WordPress
- Unmatched ecosystem breadth and content ownership support almost any publishing model
- Editors get a purpose-built publishing workflow instead of raw files
- Plugin, hosting, security, and performance maintenance accumulate over time
- Themes, extensions, and content models add maintenance and portability constraints
Substack
- Publishing, email, recommendations, network discovery, and paid subscriptions work out of the box
- Audience, campaigns, automations, and reporting live in one publishing system
- Brand control, automation, data depth, and platform independence are limited
- Automation logic, analytics history, and deliverability settings are not very portable
Substack: Publishing, email, recommendations, network discovery, and paid subscriptions work out of the box. This removes a major source-side concern: Plugin, hosting, security, and performance maintenance accumulate over time.
What you lose: Unmatched ecosystem breadth and content ownership support almost any publishing model. What you inherit: Brand control, automation, data depth, and platform independence are limited.
Jump to a section
Know the shape of the move.
This timeline assumes
- Up to 2,000 posts and pages, 25,000 consented subscribers, and 10 GB of media
- You control WordPress admin, the Substack publication, DNS, and any newsletter plugin.
- WordPress stays public until Substack images no longer load from the old host.
- No full-audience Substack email goes out until content, media, consent, and seed checks pass.
- Custom post types, page builders, and WooCommerce stay out of this playbook.
What survives the move.
“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.
| Item | Outcome | Impact | What happens | Mitigation |
|---|---|---|---|---|
| Posts via the WordPress URL | partial | critical | Substack lists WordPress as a first-class URL import. Paste the site URL under Settings → Import/Export → Import posts. Every imported post publishes. You cannot cherry-pick during import. | Keep WordPress online. Compare post counts after import. Delete what should not stay public. |
| RSS-only fallback | partial | critical | Substack also accepts RSS. It warns some feeds only include the latest 20 posts. | Do not use RSS as the only path for a long archive. Use the WordPress site URL or a WXR export through a temporary WordPress.com site if the URL import is thin. |
| Images and media | partial | critical | Imported posts can keep image src values on the WordPress host. A later hosting cancel breaks the archive. | Inspect image hosts. Re-upload anything that still points at the WordPress domain. |
| Footnotes, blocks, and page-builder markup | partial | high | WordPress footnotes can become superscript links back to the old post. Gutenberg and builder shortcodes do not become Substack blocks. | Sample footnote, gallery, and embed posts. Repair or rewrite them in Substack. |
| Imported posts go live as published | partial | high | Substack says imported posts appear in Home and Archive as published. Drafts in WordPress can land public if they were reachable to the importer. | Unpublish or delete imported drafts. Reset dates only if you pasted by hand. |
| Pages, menus, and theme | lost | high | WordPress pages, menus, widgets, and the theme do not become a Substack website. | Rebuild About, landing, and navigation in Substack before DNS. |
| Comments and WordPress users | lost | medium | Substack's switch guide says likes and comments do not import. | Export comments if you need an archive. Create Substack staff separately. |
| Subscribers and newsletter plugins | manual | critical | WordPress users are not a Substack list. Export Jetpack, MailPoet, or Kit subscribers as CSV. Substack skips duplicates and invalid domains and may hold large lists for review. | Pause WordPress sending first. Confirm opt-in. Skip welcome email. |
| Custom post types and plugins | lost | critical | CPTs, membership plugins, and WooCommerce do not run on Substack. | Keep those systems or recast essential records as posts before import. |
| Public URLs | manual | critical | WordPress permalinks do not become /p/ slugs. Substack has no redirect UI. | Map every public URL and add provider redirects before you move the domain. |
| SEO plugin metadata | manual | high | Yoast or Rank Math titles and canonicals do not become Substack SEO fields automatically. | Check titles, descriptions, and canonicals on high-traffic posts. |
| Sending overlap | manual | critical | If WordPress or a plugin still sends after the CSV import, people get two newsletters. | Pause WordPress newsletters first. Import emails last. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| WordPress post title | Substack post title | automatic | Compare entities and dates. |
| WordPress post body | Substack post body | transform | Repair blocks, footnotes, and leftover subscribe widgets. |
| WordPress permalink | Substack /p/slug plus a provider redirect | transform | Build the map before DNS. |
| Featured image and media | Substack images you host | transform | Re-upload anything still on WordPress. |
| Category or tag | Substack tags or sections | manual | Approve a short tag list. |
| Author | Substack publication author | manual | Provision people before bylines matter. |
| Newsletter plugin CSV | Substack subscribers | transform | Confirm opt-in. Reconcile skipped rows. |
| WordPress pages and theme | No destination | unsupported | Rebuild About and navigation. |
| Comments | No destination | unsupported | Keep a WordPress comment export. |
Make the move recoverable.
Create the source-of-truth backup
Preserve WordPress content, media, subscribers, and URLs before Substack publishes the archive.
- Run Tools → Export for posts, pages, and media.
- Crawl production URLs, titles, and image hosts.
- Export every newsletter plugin list with status columns.
- Capture DNS, redirects, and theme screenshots.
- Store files with checksums.
Proof to capture: A dated manifest with WXR hash, post count, list counts, and URL count.
Import the WordPress archive
Get posts into Substack without relying on a 20-item RSS feed.
- Keep WordPress public.
- Paste the site URL into Import posts.
- If the count is short, import the WXR through a temporary WordPress.com site and retry, or paste remaining posts.
- Do not send imported posts to the list.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Import subscribers once
Move a consented list without a welcome blast.
- Pause WordPress and plugin sending.
- Upload the CSV. Confirm opt-in. Skip welcome email.
- Reconcile imported, skipped, and unsubscribed counts.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
The things most likely to hurt.
These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.
RSS import silently drops the archive
Post count on Substack is about 20 while WordPress has hundreds.
- Consequence
- You cut over an incomplete site.
- Mitigation
- Compare counts against the WXR before any DNS change.
Stop if: The imported count is unexplained.
Images stay on WordPress
Imported HTML still requests the old media library.
- Consequence
- The archive dies when you cancel hosting.
- Mitigation
- Re-upload before cleanup.
Stop if: A high-traffic post still loads WordPress media.
Imported posts email the list
Substack offers to send each cleaned imported post.
- Consequence
- Readers get years of old posts in one week.
- Mitigation
- Refuse send on import. Keep the list unscheduled.
Stop if: Any imported post is queued for everyone.
Footnotes point back to WordPress
Superscript links open the old post.
- Consequence
- Readers leave Substack for a site you are about to retire.
- Mitigation
- Rewrite footnotes on posts that use them.
Stop if: A cornerstone post still deep-links to WordPress for body content.
Do the work in this order.
- Days 1–3 · inventory
Export WordPress and the list
3–5 hours active2–3 days elapsedExport generation waiting- Export WXR and media.
- Export newsletter subscribers.
- Crawl public URLs.
Stop / go checkpointExport complete?
Go when: Post, media, list, and URL inventories reconcile.
Stop when: A sending plugin or custom post type is unowned.
- Days 3–4 · setup
Configure Substack
2–3 hours active1 day elapsedDomain and Stripe if used waiting- Create the publication.
- Rebuild About and navigation.
- Disable welcome email on import.
Depends on: inventory
Stop / go checkpointSafe to import?
Go when: No production send is enabled.
Stop when: Ownership or DNS is unclear.
- Days 4–8 · import
Import posts, then subscribers
4–8 hours active2–4 days elapsedImporter and possible list review waiting- Import from the WordPress URL.
- Repair images and footnotes.
- Pause WordPress sending and upload the CSV.
Depends on: setup
Stop / go checkpointCounts match?
Go when: Posts and consented emails reconcile.
Stop when: The archive is short or images still depend on WordPress.
- Days 8–11 · verify
Verify routes and seed mail
2–4 hours active1–2 days elapsedSeed delivery waiting- Test redirects.
- Send to a seed list.
- Check unsubscribe and images in the email.
Depends on: import
Stop / go checkpointCan Substack go public?
Go when: Blocking checks pass.
Stop when: A seed send fails or a cornerstone URL 404s.
- Days 11–14 · cutover
Move DNS and the first send
1–3 hours active1–3 days elapsedDNS and SSL waiting- Point the domain.
- Keep WordPress readable.
- Send the first issue with a named operator.
Depends on: verify
Stop / go checkpointRetire WordPress sending?
Go when: The first full send is clean.
Stop when: Duplicate mail or missing images appear.
Cut over with a way back.
Cutover
Make Substack the public site and the only sender without losing the last WordPress posts.
- Freeze WordPress publishing and newsletter plugins.
- Import the final post and subscriber delta.
- Switch DNS only after the URL map works.
- Run blocking content, image, consent, and seed checks.
- Keep the full list unscheduled until those checks pass.
Proof to capture: Freeze time, count reconciliation, redirect sample, and named approval.
Rollback
Return the domain and next send to WordPress without a second blast.
- Cancel Substack campaigns.
- Restore WordPress DNS.
- Leave the Substack list in place. Do not send from both.
- Keep the WXR and subscriber CSV.
Proof to capture: WordPress serves the domain and is the only sender.
- Imported archive emails the list
- High-traffic images still load from WordPress
- Consent totals cannot be reconciled
- Cornerstone URLs 404 after one redirect fix
- A blocking check cannot be fixed in two hours
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | Post count | Compare WXR posts with Substack posts. | Every expected post exists once or has a signed exception. | Post ledger. | |
V-02Blocking | Image independence | Inspect image hosts on a stratified sample. | No required image depends on WordPress. | Image-host report. | |
V-03Blocking | Footnotes and blocks | Open footnote, gallery, and builder posts. | No body link depends on WordPress. | Sample screenshots. | |
V-04Blocking | Subscriber consent | Compare plugin CSV with Substack import totals. | Unsubscribed stay out. No unexplained opt-in. | Import summary. | |
V-05Blocking | Permalink map | Request high-value WordPress URLs. | One 301 to the matching /p/ path. | Redirect results. | |
V-06Blocking | Seed delivery | Send to controlled addresses. | Links and unsubscribe work. WordPress is quiet. | Seed headers. | |
V-07 | Titles and canonicals | Compare high-traffic posts. | Approved titles. No accidental noindex. | SEO sample. | |
V-08Blocking | Single sender | Inspect WordPress plugins and Substack schedules. | Only Substack can send. | Schedule screenshots. |
Remove the scaffolding safely.
Safe after: One successful full send, 24 hours of acceptable delivery, seven stable days, and a signed report.
- Archive the WXR, subscriber CSV, URL map, and evidence.
- Re-upload leftover WordPress media.
- Keep WordPress readable through the retention window.
- Cancel hosting only after images are independent.
- Revoke migration users.
- Schedule the next Substack review.
When the plan met reality.
First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.
Claire Tak moved the six-year ClairesHoliday.com travel blog from WordPress to Substack. She exported WordPress as XML and uploaded the file in Substack settings. She says six years of posts moved in about two minutes with no broken links or odd image sizing. Featured thumbnail images did not transfer, and she planned to add those by hand. A later move of ClaireTak.com warned that images and media often fail to copy cleanly.
- Export WordPress as XML rather than relying on an RSS URL, which Substack says can stop after about 20 posts.
- Budget time to add featured images by hand even when body images look fine.
- A small personal archive can move in minutes if you use the XML upload, not a short RSS feed.
- Homepage thumbnails are a separate pass from post bodies.
Joshua Hatch moved Hatchomatic off WordPress after about 17 years and roughly 300 posts. Medium's WordPress import had ended in 2018, so he skipped Medium and landed on Substack. In a later comment he said the migration was surprisingly easy. He had little traffic, so he could not judge SEO loss. The old WordPress site announced that old posts had been migrated.
- Do not plan a Medium hop as a WordPress exit. Hatch found that import closed in 2018.
- If search traffic matters, measure rankings yourself. He could not, because the blog was mostly personal.
- A long, low-traffic WordPress archive can move to Substack without a plugin stack.
- Ease of import is not proof that organic search survived.
Verify against the primary material.
Platform behavior changes. Check these sources and the review dates above before executing a production migration.
- Substack: import posts from WordPress, Medium, Ghost, and othersAccessed 2026-10-30
- WordPress.org: export screenAccessed 2026-10-30
- WordPress.com: export website contentAccessed 2026-10-30
- Substack: import a mailing listAccessed 2026-10-30