← All playbooks
Newsletter migration

Medium → Substack

Move Medium stories into Substack with the URL importer, then bring a consented email list separately. Medium followers are not a mailing list. Imported posts publish immediately and often keep Medium chrome at the bottom.

Typical timeline5–12 calendar days before first full send10–20 hours active work
Statusneeds review
Source profileMedium 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

Medium

Reasons to stay
  • Built-in distribution and a distraction-free editor remove nearly all publishing operations
  • Editors get a purpose-built publishing workflow instead of raw files
Reasons to leave
  • Brand, audience, monetization, and content control remain with the platform
  • 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: Brand, audience, monetization, and content control remain with the platform.

Worst of the move

What you lose: Built-in distribution and a distraction-free editor remove nearly all publishing operations. 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: 4, Manual rebuild: 5, Not transferred: 3.
Clean0
Partial4
Manual5
Lost3
Mapping route7 of 9 fields have a destination path

This timeline assumes

  • One Medium profile or publication with up to 1,000 stories and a separate consented email list you can lawfully export
  • You control the Medium account, the Substack publication, DNS if you use a custom domain, and any list you import.
  • Medium remains public until you prove images no longer load from Medium.
  • No full-audience Substack email goes out until content, consent, redirect, and seed-delivery checks pass.
  • Claps, highlights, Medium followers, and Partner Program earnings stay out of scope.
02What transfers

What survives the move.

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

ItemOutcomeImpactWhat happensMitigation
Published storiespartialcriticalSubstack lets you paste a Medium URL such as https://medium.com/@you. The importer finds the archive and publishes every imported post. You cannot pick which posts appear. You can delete individual posts later.Import first. Review titles, dates, and paywall flags before you import any emails.
Story body and Medium chromepartialhighSubstack says imported posts may keep a platform subscribe option or banner at the bottom. Embeds, paywalled sections, and footnotes often need a pass in the Substack editor.Open a sample of public, member-only, and embed-heavy stories. Delete leftover Medium chrome before any send.
ImagespartialcriticalThe importer can leave image hosts on Medium. A Medium export zip of HTML files is the backup if the URL import is thin.Keep Medium online. Re-upload any image that still points at Medium or miro.medium.com.
Medium followerslostcriticalFollowers are not a portable consented subscriber file. Substack only imports emails you upload and confirm opted in.Import only addresses you can lawfully export with consent evidence. Do not invent a list from follower counts.
Email list and paid compsmanualcriticalIf you have a real mailing list, Substack imports CSV, XLSX, or ODS. Duplicates and invalid domains are skipped. Paid readers from another platform are comps or trials unless you run a Stripe takeover path Substack documents for that source.Pause the old sender first. Confirm opt-in. Skip the welcome email. Comp paid readers against recorded renewal dates.
Import review holdsmanualhighSubstack can flag a list for Standards review, often within 72 hours, if it looks like it was not opted in.Answer the origin questions. Do not send until the import is approved.
Publication dates and draftspartialhighImported posts go live as published. If you paste by hand, Substack tells you to reset the publication date in post settings after you publish.Compare dates against the Medium export. Unpublish anything that should stay draft.
Canonical URLs and redirectsmanualcriticalMedium paths do not become Substack /p/ slugs. Substack has no in-app redirect table.Map every public Medium URL. Add provider redirects if you own a custom domain.
Claps, highlights, responses, and statslostmediumMedium engagement does not become Substack likes, comments, or analytics.Export Medium stats if you still need them. Tell readers comments will not follow.
Publications, editors, and Partner ProgramlostmediumMedium publication roles and Partner Program earnings do not move.Create Substack staff separately. Archive earnings reports before you leave.
Custom domain and From addressmanualhighA Substack custom domain is a separate setup. Newsletters still send from [email protected] unless Substack documents a change for your account.Add the domain in Substack before you change DNS. Bookmark the *.substack.com settings URL.
Sending overlapmanualcriticalIf you import emails while Medium or another sender still mails the same people, you send twice.Pause the old sender. Import emails last. Keep one named send owner.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Medium story titleSubstack post titleautomaticCompare punctuation after import.
Medium story bodySubstack post bodytransformRemove Medium subscribe leftovers and repair embeds.
Medium story URLSubstack /p/slug plus a provider redirecttransformSubstack cannot store the redirect itself.
Medium export HTML zipFallback archive if URL import is incompletemanualKeep the zip even when the URL importer works.
Consented email listSubstack subscribers via CSV uploadtransformConfirm opt-in. Skip welcome mail.
Medium followersNo destinationunsupportedFollowers are not emails.
Member-only Medium storiesSubstack paid posts if payments are ontransformThe importer can paywall the imported archive.
Medium canonical or custom domainSubstack custom domainmanualSet redirects at the DNS or domain provider.
Claps and Medium statsNo destinationunsupportedKeep a dated Medium stats export.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep an immutable Medium archive and a consented list snapshot before Substack publishes or sends anything.

  1. Request the Medium account export and store the zip with a checksum.
  2. Crawl public Medium URLs, titles, dates, and image hosts.
  3. Export any real mailing list with subscribed, unsubscribed, and bounce state.
  4. Record Medium publication membership, custom domains, and Partner Program reports.
  5. Work on copies. Do not edit the original zip.

Proof to capture: A dated manifest with the Medium zip hash, story count, list counts, and a named restore owner.

Transformation · Substack Settings → Import/Export → Import posts

Import stories from the Medium URL

Bring the archive into Substack without sending it.

  1. Paste https://medium.com/@yourusername or the publication URL.
  2. Confirm you own the source. Decide whether imported posts are paid.
  3. Do not tick send-as-email for the imported archive.
  4. Delete leftover Medium banners on a sample of posts.

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

Transformation · Substack Add subscribers by upload

Import only a consented email list

Move readers you can lawfully email, once.

  1. Pause every other sender first.
  2. Upload CSV, XLSX, or ODS. Confirm opt-in. Skip welcome email.
  3. Comp paid readers against recorded remaining term if you owe them access.
  4. Reconcile imported, skipped, and duplicate 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.

Members

You import followers who never opted in

criticalpossible likelihood

Someone treats Medium follower count as a mailing list.

Consequence
Substack holds or rejects the import. Complaints spike if you send.
Mitigation
Import only emails with consent evidence.

Stop if: The file includes scraped followers or purchased names.

Content

Imported posts email the list

criticalpossible likelihood

Substack asks whether to send each cleaned imported post.

Consequence
Readers get a dump of old Medium stories.
Mitigation
Choose not to send. Keep the list unscheduled until seed delivery passes.

Stop if: Any imported post is queued for the full audience.

Content

Images still load from Medium

criticalpossible likelihood

Imported posts request miro.medium.com or medium.com.

Consequence
The archive breaks when Medium hotlink or account access changes.
Mitigation
Re-upload stragglers while Medium is still up.

Stop if: A high-traffic post still depends on Medium media.

Routing

Historic Medium URLs 404

highlikely likelihood

You move a custom domain without a URL map.

Consequence
Search and shared links miss the new posts.
Mitigation
Build the Medium-to-/p/ map first.

Stop if: Any high-value Medium URL fails after one redirect correction.

06Precise timeline

Do the work in this order.

Estimate forUp to 1,000 Medium stories, one publication, and a separate consented list
Total elapsed5–12 calendar days before first full send
Active work10–20 hours
BufferAdd time if the URL importer is thin and you must walk the Medium HTML export, or if Substack holds the list for review.
01
Days 1–2Export Medium and inventory the list1–2 days
02
Day 2–3Stand up Substack without sending1 day
03
Days 3–5Import posts, then emails1–3 days
04
Days 5–8Verify content, redirects, and seed mail1–2 days
05
Days 8–12Switch the public home and first send1–4 days
  1. Days 1–2 · inventory

    Export Medium and inventory the list

    2–4 hours active1–2 days elapsedMedium export email waiting
    • Request the Medium export.
    • Crawl public story URLs.
    • Confirm whether you have a real opted-in list.
    Stop / go checkpoint

    Can we import posts?

    Go when: The Medium zip, story inventory, and consent decision exist.

    Stop when: You cannot export Medium or the only 'list' is followers.

  2. Day 2–3 · setup

    Stand up Substack without sending

    2–3 hours active1 day elapsedStripe and domain if you use them waiting
    • Create the publication and About page.
    • Turn off welcome email on import.
    • Start custom-domain setup if you own a host.

    Depends on: inventory

    Stop / go checkpoint

    Is Substack safe to receive posts?

    Go when: No production campaign is enabled.

    Stop when: Payments or publication ownership is unclear.

  3. Days 3–5 · import

    Import posts, then emails

    3–6 hours active1–3 days elapsedImporter run and possible list review waiting
    • Import from the Medium URL and clean chrome.
    • Pause other senders, then upload the consented CSV.
    • Reconcile skipped and duplicate emails.

    Depends on: setup

    Stop / go checkpoint

    Did the archive and list land?

    Go when: Story and email counts match or have signed exceptions.

    Stop when: Posts are missing, images stay on Medium, or the list is under review with no owner.

  4. Days 5–8 · verify

    Verify content, redirects, and seed mail

    2–4 hours active1–2 days elapsedAt least one seed delivery waiting
    • Compare titles, dates, and paywalls.
    • Test redirects from Medium URLs.
    • Send only to a seed list.

    Depends on: import

    Stop / go checkpoint

    Can Substack own the next send?

    Go when: Blocking content, consent, URL, and seed checks pass.

    Stop when: A seed recipient gets the wrong access or a blast of old posts.

  5. Days 8–12 · cutover

    Switch the public home and first send

    1–3 hours active1–4 days elapsedDomain verification if used waiting
    • Point the custom domain if you have one.
    • Leave a Medium pointer or redirect.
    • Send the first Substack issue with a named operator.

    Depends on: verify

    Stop / go checkpoint

    Can Medium sending stay off?

    Go when: The first full send completes without a rollback trigger.

    Stop when: Duplicate mail or broken images appear.

07The point of change

Cut over with a way back.

Go live

Cutover

Make Substack the public home and the only sender without dumping the Medium archive into inboxes.

Recommended window: A weekday before the next planned issue, with the Substack owner available.

  1. Confirm Medium or any other sender is paused.
  2. Import any final story delta and reconcile counts.
  3. Switch custom-domain DNS only after redirects are ready.
  4. Run blocking checks for posts, images, consent, and seed delivery.
  5. Keep the full audience unscheduled until those checks pass.

Proof to capture: Story and list reconciliation, image-host sample, seed headers, and named approval.

Return to safety

Rollback

Return readers to Medium or the previous sender without a second blast.

Deadline: Before the first full-audience Substack send. Keep Medium readable for at least seven days after that send.

  1. Cancel any Substack campaign.
  2. Restore previous DNS if you moved a domain.
  3. Leave the Substack list in place for investigation. Do not send from both sides.
  4. Keep the Medium export zip.

Proof to capture: Exactly one platform owns the next send. Medium stories still resolve.

Rollback immediately when
  • Imported posts email the full list
  • High-traffic images still depend on Medium
  • Consent totals cannot be reconciled
  • A list import is rejected after you already announced the move
  • A blocking check cannot be fixed within 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-01BlockingStory reconciliationCompare Medium export titles, dates, and URLs with Substack posts.Every expected story exists once or has a signed exception.Story ledger.
V-02BlockingMedium chrome and embedsOpen public, member-only, and embed-heavy samples.No leftover Medium subscribe banner on accepted posts.Paired screenshots.
V-03BlockingImage hostsInspect image URLs on a stratified sample.No required image depends on Medium.Image-host report.
V-04BlockingConsented list onlyCompare import totals with the source CSV and skipped rows.No follower scrape. Opt-outs stay out.Import summary and source CSV counts.
V-05BlockingSeed deliverySend to controlled addresses only.From, links, and unsubscribe work. No archive blast.Seed headers.
V-06BlockingMedium URLsRequest high-value Medium paths.One hop to the matching Substack post if you own the domain, or a documented Medium pointer.URL results.
V-07Comped paid readersSample readers who paid on the old stack.Access matches the remaining term you recorded.Comp ledger.
V-08BlockingSingle senderInspect Medium, Substack, and any ESP schedules.Only Substack can send after cutover.Schedule screenshots.
09Post-migration cleanup

Remove the scaffolding safely.

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

  1. Archive the Medium zip, list CSV, URL map, and verification evidence.
  2. Re-upload leftover Medium-hosted images.
  3. Leave a Medium pointer or redirect for 30 days if you still own those URLs.
  4. Cancel Medium Partner Program or custom domain only after images are independent.
  5. Revoke migration-only users.
  6. Schedule the next Substack backup and list-consent 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 accountSharon Hurley Hall · Sharon Hurley Hall

Moving From Medium to Substack2021

Sharon Hurley Hall moved most of her Medium archive to Substack after algorithm changes, a username switch that broke old links, and falling Partner Program earnings. Substack had no clean Medium importer then, so she exported Medium HTML, imported it into a temporary WordPress.com blog, dropped posts she did not want to republish, and exported WordPress XML into Substack. The URL scrape of that temporary blog failed, so she uploaded the XML. She brought over about 500 posts with images. Embeds, decks, photo credits, and Medium internal links still needed cleanup.

What they recommend
  • If the URL importer is thin, use a temporary WordPress.com blog as a bridge and clean the archive before the XML step.
  • Review co-authored and publication-exclusive pieces before you republish them on Substack.
Worth noticing
  • A Medium username change can break every old link, and Medium may not restore them.
  • The WordPress bridge let her choose which stories moved, which the Substack URL importer still does not.
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 Medium, WordPress, Ghost, and othersAccessed 2026-10-30
  2. Medium: export your account dataAccessed 2026-10-30
  3. Substack: import a mailing listAccessed 2026-10-30
  4. Substack: how email list imports are reviewedAccessed 2026-10-30