← All playbooks
Newsletter migration

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.

Typical timeline6–14 calendar days12–24 hours active work
Statusneeds review
Source profileWordPress documentation reviewed 2026-10-30
Destination profileSubstack documentation reviewed 2026-10-30
Documentation date
Review window
Evidence4 sources
This route needs review.Use it as a planning baseline, then verify the dated sources and test with representative data before production.
Before you migrate

Should you make this move?

Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.

Current platform

WordPress

Reasons to stay
  • Unmatched ecosystem breadth and content ownership support almost any publishing model
  • Editors get a purpose-built publishing workflow instead of raw files
Reasons to leave
  • Plugin, hosting, security, and performance maintenance accumulate over time
  • Themes, extensions, and content models add maintenance and portability constraints
New platform

Substack

What gets better
  • Publishing, email, recommendations, network discovery, and paid subscriptions work out of the box
  • Audience, campaigns, automations, and reporting live in one publishing system
What gets worse
  • Brand control, automation, data depth, and platform independence are limited
  • Automation logic, analytics history, and deliverability settings are not very portable
Best of the move

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.

Worst of the move

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
01At a glance

Know the shape of the move.

Transfer outcome12 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 5, Manual rebuild: 4, Not transferred: 3.
Clean0
Partial5
Manual4
Lost3
Mapping route7 of 9 fields have a destination path

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.
02What transfers

What survives the move.

“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.

ItemOutcomeImpactWhat happensMitigation
Posts via the WordPress URLpartialcriticalSubstack 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 fallbackpartialcriticalSubstack 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 mediapartialcriticalImported 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 markuppartialhighWordPress 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 publishedpartialhighSubstack 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 themelosthighWordPress pages, menus, widgets, and the theme do not become a Substack website.Rebuild About, landing, and navigation in Substack before DNS.
Comments and WordPress userslostmediumSubstack's switch guide says likes and comments do not import.Export comments if you need an archive. Create Substack staff separately.
Subscribers and newsletter pluginsmanualcriticalWordPress 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 pluginslostcriticalCPTs, membership plugins, and WooCommerce do not run on Substack.Keep those systems or recast essential records as posts before import.
Public URLsmanualcriticalWordPress 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 metadatamanualhighYoast or Rank Math titles and canonicals do not become Substack SEO fields automatically.Check titles, descriptions, and canonicals on high-traffic posts.
Sending overlapmanualcriticalIf WordPress or a plugin still sends after the CSV import, people get two newsletters.Pause WordPress newsletters first. Import emails last.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
WordPress post titleSubstack post titleautomaticCompare entities and dates.
WordPress post bodySubstack post bodytransformRepair blocks, footnotes, and leftover subscribe widgets.
WordPress permalinkSubstack /p/slug plus a provider redirecttransformBuild the map before DNS.
Featured image and mediaSubstack images you hosttransformRe-upload anything still on WordPress.
Category or tagSubstack tags or sectionsmanualApprove a short tag list.
AuthorSubstack publication authormanualProvision people before bylines matter.
Newsletter plugin CSVSubstack subscriberstransformConfirm opt-in. Reconcile skipped rows.
WordPress pages and themeNo destinationunsupportedRebuild About and navigation.
CommentsNo destinationunsupportedKeep a WordPress comment export.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Preserve WordPress content, media, subscribers, and URLs before Substack publishes the archive.

  1. Run Tools → Export for posts, pages, and media.
  2. Crawl production URLs, titles, and image hosts.
  3. Export every newsletter plugin list with status columns.
  4. Capture DNS, redirects, and theme screenshots.
  5. Store files with checksums.

Proof to capture: A dated manifest with WXR hash, post count, list counts, and URL count.

Transformation · Substack Import posts plus a WordPress export zip

Import the WordPress archive

Get posts into Substack without relying on a 20-item RSS feed.

  1. Keep WordPress public.
  2. Paste the site URL into Import posts.
  3. If the count is short, import the WXR through a temporary WordPress.com site and retry, or paste remaining posts.
  4. Do not send imported posts to the list.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

Transformation · Plugin CSV plus Substack Add subscribers by upload

Import subscribers once

Move a consented list without a welcome blast.

  1. Pause WordPress and plugin sending.
  2. Upload the CSV. Confirm opt-in. Skip welcome email.
  3. Reconcile imported, skipped, and unsubscribed counts.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

05Handle with care

The things most likely to hurt.

These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.

Import

RSS import silently drops the archive

criticalpossible likelihood

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.

Content

Images stay on WordPress

criticalpossible likelihood

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.

Content

Imported posts email the list

criticalpossible likelihood

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.

Content

Footnotes point back to WordPress

highpossible likelihood

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.

06Precise timeline

Do the work in this order.

Estimate forUp to 2,000 posts, 25,000 subscribers, one custom domain
Total elapsed6–14 calendar days
Active work12–24 hours
BufferAdd time for page-builder posts, a held list review, or a large image re-upload.
01
Days 1–3Export WordPress and the list2–3 days
02
Days 3–4Configure Substack1 day
03
Days 4–8Import posts, then subscribers2–4 days
04
Days 8–11Verify routes and seed mail1–2 days
05
Days 11–14Move DNS and the first send1–3 days
  1. 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 checkpoint

    Export complete?

    Go when: Post, media, list, and URL inventories reconcile.

    Stop when: A sending plugin or custom post type is unowned.

  2. 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 checkpoint

    Safe to import?

    Go when: No production send is enabled.

    Stop when: Ownership or DNS is unclear.

  3. 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 checkpoint

    Counts match?

    Go when: Posts and consented emails reconcile.

    Stop when: The archive is short or images still depend on WordPress.

  4. 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 checkpoint

    Can Substack go public?

    Go when: Blocking checks pass.

    Stop when: A seed send fails or a cornerstone URL 404s.

  5. 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 checkpoint

    Retire WordPress sending?

    Go when: The first full send is clean.

    Stop when: Duplicate mail or missing images appear.

07The point of change

Cut over with a way back.

Go live

Cutover

Make Substack the public site and the only sender without losing the last WordPress posts.

Recommended window: 48–72 hours before the next planned newsletter, during support hours.

  1. Freeze WordPress publishing and newsletter plugins.
  2. Import the final post and subscriber delta.
  3. Switch DNS only after the URL map works.
  4. Run blocking content, image, consent, and seed checks.
  5. Keep the full list unscheduled until those checks pass.

Proof to capture: Freeze time, count reconciliation, redirect sample, and named approval.

Return to safety

Rollback

Return the domain and next send to WordPress without a second blast.

Deadline: Before the first full Substack send. Keep WordPress up for at least seven days after that send.

  1. Cancel Substack campaigns.
  2. Restore WordPress DNS.
  3. Leave the Substack list in place. Do not send from both.
  4. Keep the WXR and subscriber CSV.

Proof to capture: WordPress serves the domain and is the only sender.

Rollback immediately when
  • 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
08Verification report

Prove the migration worked.

Every blocking check must pass. Capture the evidence before cleanup begins.

0%
Interactive report preview0 / 8 checks passed
PassIDCheckMethodExpected resultEvidence
V-01BlockingPost countCompare WXR posts with Substack posts.Every expected post exists once or has a signed exception.Post ledger.
V-02BlockingImage independenceInspect image hosts on a stratified sample.No required image depends on WordPress.Image-host report.
V-03BlockingFootnotes and blocksOpen footnote, gallery, and builder posts.No body link depends on WordPress.Sample screenshots.
V-04BlockingSubscriber consentCompare plugin CSV with Substack import totals.Unsubscribed stay out. No unexplained opt-in.Import summary.
V-05BlockingPermalink mapRequest high-value WordPress URLs.One 301 to the matching /p/ path.Redirect results.
V-06BlockingSeed deliverySend to controlled addresses.Links and unsubscribe work. WordPress is quiet.Seed headers.
V-07Titles and canonicalsCompare high-traffic posts.Approved titles. No accidental noindex.SEO sample.
V-08BlockingSingle senderInspect WordPress plugins and Substack schedules.Only Substack can send.Schedule screenshots.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One successful full send, 24 hours of acceptable delivery, seven stable days, and a signed report.

  1. Archive the WXR, subscriber CSV, URL map, and evidence.
  2. Re-upload leftover WordPress media.
  3. Keep WordPress readable through the retention window.
  4. Cancel hosting only after images are independent.
  5. Revoke migration users.
  6. Schedule the next Substack review.
10Experiences from the field

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.

First-person accountClaire Tak · Claire Tak

Doing nothing with your website? Me too. I moved my travel blog to Substack2023

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.

What they recommend
  • 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.
Worth noticing
  • 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.
First-person accountJoshua Hatch · Hatchomatic

WordPress to Substack With a Medium Bypass2023

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.

What they recommend
  • 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.
Worth noticing
  • A long, low-traffic WordPress archive can move to Substack without a plugin stack.
  • Ease of import is not proof that organic search survived.
Sources and evidence

Verify against the primary material.

Platform behavior changes. Check these sources and the review dates above before executing a production migration.

  1. Substack: import posts from WordPress, Medium, Ghost, and othersAccessed 2026-10-30
  2. WordPress.org: export screenAccessed 2026-10-30
  3. WordPress.com: export website contentAccessed 2026-10-30
  4. Substack: import a mailing listAccessed 2026-10-30