Medium → Ghost
Move a Medium profile or publication into Ghost while preserving articles, canonical intent, images, authorship, members, URLs, and evidence for engagement that cannot transfer.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
Medium
- Built-in distribution and a distraction-free editor remove nearly all publishing operations
- Editors get a purpose-built publishing workflow instead of raw files
- Brand, audience, monetization, and content control remain with the platform
- Themes, extensions, and content models add maintenance and portability constraints
Ghost
- A focused publishing and membership platform is fast and pleasant for writers
- Editors get a purpose-built publishing workflow instead of raw files
- Its narrower ecosystem is less suitable for complex sites and custom application behavior
- Themes, extensions, and content models add maintenance and portability constraints
Ghost: A focused publishing and membership platform is fast and pleasant for writers. This removes a major source-side concern: Brand, audience, monetization, and content control remain with the platform.
What you lose: Built-in distribution and a distraction-free editor remove nearly all publishing operations. What you inherit: Its narrower ecosystem is less suitable for complex sites and custom application behavior.
Jump to a section
Know the shape of the move.
This timeline assumes
- Up to 1,000 stories, 20 authors, and one publication
- The source remains publicly reachable until media and route verification passes.
- Dynamic features outside the documented scope require an approved replacement.
- The destination is built and reviewed on a private preview before DNS changes.
- The migration team records evidence for every blocking verification check.
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 |
|---|---|---|---|---|
| Claps, highlights, responses, and story analytics | lost | medium | Medium engagement data does not become native Ghost engagement history. | Export or capture reports and keep them as a read-only archive. |
| Medium followers and email relationship | lost | critical | Followers are not a portable consented member list. | Import only addresses you can lawfully export with consent evidence. |
| Publication roles and author identity | partial | high | Medium authors do not automatically become configured Ghost staff users. | Create approved staff accounts and map every byline. |
| Embeds and Medium-specific formatting | partial | high | Some story markup and embeds require transformation into Ghost cards or HTML. | Test code, media, embeds, footnotes, and paywalled stories before full import. |
| Published posts and pages | partial | critical | Core titles and body content can move, but platform-specific blocks and metadata need review. | Compare every route and a stratified content sample. |
| Images and downloadable media | partial | critical | Exports can reference remote files instead of carrying verified local originals. | Copy originals, record hashes, and keep the source public until reconciliation. |
| Public URLs and redirects | manual | critical | Routing rules and slug behavior differ between the two platforms. | Create a source-to-destination URL registry and test every redirect. |
| Authors and permissions | partial | high | Bylines may move, but user accounts, roles, and credentials do not transfer safely. | Create destination users deliberately and assign least privilege. |
| Taxonomies and navigation | partial | high | Categories, tags, menus, and collection semantics rarely map one-to-one. | Approve a mapping and test archive, menu, and breadcrumb behavior. |
| SEO metadata and structured data | manual | critical | Titles, descriptions, canonicals, social cards, and schema require destination configuration. | Crawl both sites and block cutover on critical SEO differences. |
| Forms and submissions | manual | critical | Hosted form processing, spam controls, notifications, and submission history are platform-specific. | Export history and test each replacement from submission through durable receipt. |
| Analytics and historical reports | lost | medium | Historical platform reports do not become native destination history. | Export dated reports and annotate the analytics cutover. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| Medium post or page | Ghost content item or page | transform | Preserve source ID and public URL. |
| Title | Title | automatic | Verify entities and Unicode. |
| Slug or path | Slug or path | transform | Preserve the public URL or create one redirect. |
| Rich body | Destination rich content | transform | Repair unsupported blocks and embeds. |
| Author | Destination user or byline | manual | Provision users before assignment. |
| Category or tag | Destination taxonomy | transform | Approve hierarchy and primary classification. |
| Featured image and media | Destination media | transform | Copy originals and preserve alt text. |
| SEO fields | Destination SEO fields | manual | Verify titles, descriptions, canonical, social data, and schema. |
| Form | Destination form or external handler | manual | Rebuild validation, consent, spam control, storage, and alerts. |
Make the move recoverable.
Create the source-of-truth backup
Preserve Medium data, configuration, and operating evidence before any destination write.
- Export all available Medium content and settings.
- Crawl production for routes, metadata, schema, assets, forms, status codes, and integrations.
- Capture themes, design tokens, screenshots, DNS, domains, users, redirects, analytics, and submissions.
- Record counts and cryptographic hashes in an immutable manifest.
Proof to capture: A signed manifest reconciles every scoped record class, runtime dependency, export file, count, and hash.
Content and route registry
Preserve public content and URL intent.
- Inventory source values and exceptions.
- Define explicit destination mappings.
- Reject unmapped critical records.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Asset and metadata normalization
Make media, taxonomy, and SEO deterministic.
- Normalize encoding, dates, identifiers, and blanks.
- Run a representative pilot.
- Reconcile accepted, rejected, and transformed rows.
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.
A successful import hides missing runtime behavior
A page renders while forms, access, search, or integrations fail.
- Consequence
- Visitors lose content or business actions.
- Mitigation
- Test behavior, not screenshots alone.
Stop if: Any critical runtime path lacks durable evidence.
URLs or metadata change silently
The destination crawl has missing routes, redirect chains, or canonical differences.
- Consequence
- Traffic and search visibility regress.
- Mitigation
- Require a route and SEO diff before DNS changes.
Stop if: A critical route lacks one valid destination.
Remote media disappears after source shutdown
Destination markup still loads source-hosted assets.
- Consequence
- Images and downloads break later.
- Mitigation
- Copy and hash every required asset.
Stop if: A critical asset depends on the source domain.
Do the work in this order.
- Days 1–3 · inventory
Inventory and decisions
6–12 hours active2–3 days elapsedOwner review waiting- Inventory Medium data, features, users, domains, and integrations.
- Approve scope, owners, mappings, and exclusions.
Depends on: Medium and Ghost administrator access
Stop / go checkpointExport?
Go when: Every critical item has an owner and disposition.
Stop when: Consent, billing, access, or system ownership is unclear.
- Days 3–5 · backup
Backup and reconcile
5–10 hours active1–3 days elapsedExport processing waiting- Create immutable exports and configuration evidence.
- Reconcile counts, totals, and hashes.
Depends on: Approved inventory
Stop / go checkpointTransform?
Go when: Source totals and export manifests agree.
Stop when: Any critical dataset or configuration is absent.
- Days 5–12 · pilot
Map and pilot
10–35 hours active3–8 days elapsedDestination processing and review waiting- Configure Ghost and transform representative data.
- Run a pilot containing normal records and every critical edge case.
Depends on: Verified backup
Stop / go checkpointScale?
Go when: Pilot mappings, behavior, access, and evidence pass.
Stop when: Any critical check fails or produces unexplained variance.
- Days 10–20 · cutover
Final delta and switch
5–25 hours active1–5 days elapsedDNS, import, or sync propagation waiting- Freeze production writes in Medium.
- Apply the final delta, switch ownership, and run blocking checks.
Depends on: Passed pilot and approved rollback
Stop / go checkpointOpen production?
Go when: Counts reconcile and one destination system owns production.
Stop when: A source writer remains active or a blocking check fails.
- Days 12–40 · observe
Observe and close
3–18 hours active3–10 days elapsedOperating-cycle evidence waiting- Monitor one complete operating cycle.
- Sign the verification report and close rollback only after stability.
Depends on: Verified cutover
Stop / go checkpointClose rollback?
Go when: No trigger occurs during the agreed observation period.
Stop when: Data, access, delivery, routing, or business results regress.
Cut over with a way back.
Cutover
Make Ghost the only production system without losing the final Medium delta.
- Freeze production writes and scheduled actions in Medium.
- Export, transform, and reconcile the final delta.
- Apply the approved delta to Ghost.
- Switch domains, forms, integrations, sending, or sync ownership as applicable.
- Run every blocking verification check and keep the source intact.
Proof to capture: Ghost owns production, totals reconcile, and every blocking check has durable evidence.
Rollback
Return production ownership to Medium without losing destination-era changes.
- Stop new writes and scheduled actions in Ghost.
- Restore the prior Medium routing, forms, integrations, sending, or sync ownership.
- Export the Ghost post-cutover delta.
- Review and apply safe destination-era changes to Medium.
- Run the same blocking checks against the restored source.
Proof to capture: Medium again owns production with current data and no duplicate destination action.
- Unexplained critical count or value variance
- Missing or exposed critical data
- Duplicate production action
- Failed access, routing, delivery, or integration check
- A critical feature has no safe destination replacement
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | URL disposition | Crawl every source URL. | One 200 destination or one-hop permanent redirect. | Crawl diff. | |
V-02Blocking | Record and field reconciliation | Compare counts and stratified records. | Every scoped item and critical field maps. | Content manifest. | |
V-03Blocking | Binary independence | Compare URLs, hashes, sizes, and source-domain requests. | No required asset depends on the source. | Asset report. | |
V-04Blocking | Metadata and index control | Compare titles, descriptions, canonicals, robots, social data, and schema. | Approved parity with no accidental noindex. | SEO diff. | |
V-05Blocking | Submission lifecycle | Submit every form and upload path. | Validation, storage, consent, notification, and response pass. | Submission IDs. | |
V-06Blocking | Restricted content | Test anonymous and authorized roles. | No restricted content leaks. | Access matrix. | |
V-07 | Responsive templates | Compare key pages at approved breakpoints. | Content and interactions meet acceptance. | Screenshot set. | |
V-08Blocking | Single source of truth | Inspect publishing and integrations in both systems. | Ghost alone owns production. | Operating inventory. |
Remove the scaffolding safely.
Safe after: One complete operating cycle, at least seven stable days, and owner sign-off on every blocking check.
- Create final Medium exports and archive verification evidence.
- Revoke temporary credentials, API keys, webhooks, and elevated roles.
- Remove obsolete embeds, forms, jobs, integrations, and DNS records.
- Keep the source intact through the approved retention window.
- Cancel paid plans only after billing, legal, and recovery review.
- Schedule the next Ghost backup, access, and migration-playbook 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.
Carlo Mencarelli moved eighteen posts from Medium to a self-hosted Ghost installation on AWS Lightsail. Medium’s export supplied HTML, which pasted into Ghost with good formatting, but image references needed attention. The author prebuilt the destination, used Cloudflare Bulk Redirects for Medium’s hashed slugs, tested a low-traffic URL first, and only then changed the production DNS record.
- Rehost Medium images and verify every embedded asset rather than assuming long-term hotlinking will remain available.
- Test a small set of redirects and the destination host before switching DNS, especially when Medium’s hashed slugs must be normalized.
- For an eighteen-post archive, manual HTML transfer was more practical than building a general conversion pipeline.
- DNS and redirect continuity mattered more to downtime and reader experience than the post-copying operation itself.
Verify against the primary material.
Platform behavior changes. Check these sources and the review dates above before executing a production migration.
- Ghost: import contentAccessed 2026-07-19
- Medium: export account dataAccessed 2026-07-19
- Ghost: import membersAccessed 2026-07-19