WordPress → Ghost
Move WordPress posts, pages, authors, media, taxonomies, subscribers, URLs, and publishing operations to Ghost without mistaking a content import for a complete site migration.
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
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: 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: Its narrower ecosystem is less suitable for complex sites and custom application behavior.
Know the shape of the move.
This timeline assumes
- Up to 2,500 posts and pages, 20 authors, and 10 GB of media
- 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 |
|---|---|---|---|---|
| Custom post types | lost | critical | Ghost’s built-in WordPress migrator does not support custom post types. | Model essential records as posts, pages, tags, or a separate system before import. |
| Page-builder and uncommon shortcodes | partial | high | The migrator handles selected shortcodes, but uncommon and plugin-defined markup can remain broken. | Inventory every shortcode and convert representative content before the full import. |
| WordPress categories | partial | medium | Ghost converts categories to tags and uses the first category as the primary tag. | Approve the taxonomy mapping and audit primary-tag selection after import. |
| Plugins and plugin-controlled access | lost | critical | WordPress plugins and content whose access they modify do not run in Ghost. | Choose explicit Ghost or external replacements before cutover. |
| 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 |
|---|---|---|---|
| WordPress 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 WordPress data, configuration, and operating evidence before any destination write.
- Export all available WordPress 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 WordPress data, features, users, domains, and integrations.
- Approve scope, owners, mappings, and exclusions.
Depends on: WordPress 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 WordPress.
- 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 WordPress delta.
- Freeze production writes and scheduled actions in WordPress.
- 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 WordPress without losing destination-era changes.
- Stop new writes and scheduled actions in Ghost.
- Restore the prior WordPress routing, forms, integrations, sending, or sync ownership.
- Export the Ghost post-cutover delta.
- Review and apply safe destination-era changes to WordPress.
- Run the same blocking checks against the restored source.
Proof to capture: WordPress 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 WordPress 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.
Neville Hobson evaluated moving more than 4,000 WordPress posts and pages, then chose a new-domain Ghost site while keeping WordPress online as an archive. Thousands of CDN-hosted images, shortcodes, custom formatting, redirect risk, and SEO uncertainty made a full import conflict with the goal of simplification. A Ghost Pro trial validated the new writing and newsletter workflow before the March cutover.
- Audit image hosting, shortcodes, custom formatting, and redirect coverage before promising a full historical migration.
- Consider an archived source plus a fresh destination when preserving every legacy page would create permanent cleanup work.
- The best migration decision was not to migrate everything; the old WordPress site remained a deliberate archive and fallback.
- Ghost reduced publishing overhead but offered less customization and no WordPress-style media library.
Built to be reviewed.
Tested 2026-07-19. Next scheduled review: 2026-10-19.
- Ghost: migrate from WordPressAccessed 2026-07-19
- WordPress.com: export website contentAccessed 2026-07-19
- Ghost: import membersAccessed 2026-07-19