Migrate WordPress to EmDash, step by step
EmDash ships a WordPress importer, so the content moves in an afternoon. The parts that need thought are the ones the importer does not do: redirects, your theme, and signing in on your own domain. This guide covers all of it on a $7/mo InstaPods pod.
The short answer
Deploy the EmDash 1-Click app ($7/mo Build plan) and create your admin on the pod's own address. Import from a WordPress export file or the EmDash Exporter plugin while WordPress is still online, so media can be copied. Add 301 redirects from your old permalinks to EmDash's /posts/slug/ routes, then point your domain and register a passkey on it. Plugins and themes do not come across; if your site depends on them, stay on WordPress.
What moves from WordPress to EmDash, and what does not
EmDash imports WordPress content two ways, a WXR export file or the EmDash Exporter plugin, and the plugin route brings more across.
| Content | WXR export file | EmDash Exporter plugin |
|---|---|---|
| Posts, pages, custom post types | Yes | Yes |
| Categories and tags | Yes. Custom taxonomies need a matching EmDash definition or they are skipped | Yes |
| Authors | Mapped to EmDash users, or kept as guest bylines | Same |
| Media files | Copied in a separate step from your live WordPress site | Downloaded and re-linked |
| Custom fields and ACF | Listed, but not written | Copied into matching fields |
| Comments, menus, logo, favicon | No | Yes, with exporter 1.2.0 or later |
| SEO titles and descriptions | No | Yes, from Yoast or Rank Math |
| Plugins and themes | No | No |
From EmDash's Migrate from WordPress and Content Import docs, read 2026-10-24. Post status: published stays published; drafts, pending, private, scheduled and trashed posts all arrive as drafts. There is no WordPress.com sign-in source and the REST API option only counts public posts, so a WordPress.com site uses a WXR export or the exporter.
Step 1: Back up WordPress and list your URLs
Before touching EmDash, back up the WordPress database and the uploads folder, and save a list of every public URL the site has today.
The URL list is what you will build redirects from in step 6. WordPress 5.5 and later publish one at /wp-sitemap.xml, and Yoast or Rank Math publish /sitemap_index.xml. Note your permalink setting under Settings → Permalinks too. EmDash's own checklist also asks you to record menus, custom post types, taxonomies and any fields a plugin adds, since those are what the importer has to map.
Step 2: Deploy EmDash on InstaPods
Pick EmDash from the InstaPods app catalog and it is live in under 60 seconds on the Build plan at $7/mo (2 vCPU, 2 GB RAM, 25 GB disk), with HTTPS on its own instapods.app address.
The admin lives at /_emdash/admin and stays behind a per-pod password, on any domain, so nobody else can grab your setup wizard; your public site is open. Those credentials are on the pod's dashboard and in your welcome email. EmDash moved from 1.1 to 1.3.1 during October 2026 alone, so if the dashboard offers an update, apply it before importing so the importer matches EmDash's current docs.
A new pod starts from EmDash's blog template, which seeds sample posts, an About page, a few categories and tags, and a menu. Delete them before you import: they would otherwise go live on your domain, and with skip existing on, a seeded about page can stop your real About page from importing.
Step 3: Create your admin on the pod address
EmDash signs you in with a passkey (Touch ID, Windows Hello, a security key or a password manager), and a passkey only works on the exact hostname it was created on.
Set up your admin on the pod's instapods.app address for now. That lets you import while WordPress keeps serving your real domain, which matters because EmDash copies media from the live WordPress site. You will move your sign-in to your own domain in step 7. If you are moving to a brand-new domain that nothing else uses yet, skip the move: point that domain at the pod and set EMDASH_SITE_URL to it first (step 7), then create your passkey there directly.
Step 4: Export from WordPress
WordPress gives EmDash its content either as a WXR file from Tools → Export, or live through the EmDash Exporter plugin.
- WXR file: in WordPress go to Tools → Export, choose All content, and download the XML. It holds your text and the addresses of your media, not the image files themselves.
- EmDash Exporter plugin: install it on WordPress, then either generate a migration key under Tools → EmDash Migration (exporter 1.2.0 or later) or connect from EmDash with a WordPress application password. Use this route if you want comments, menus, custom fields or Yoast and Rank Math SEO fields.
- Site behind Cloudflare? EmDash's docs say to add a Skip rule for the exporter and media paths, and to turn Bot Fight Mode off during the migration, since it cannot be skipped on the Free plan.
Step 5: Run the EmDash import wizard
The EmDash import wizard lives under Import in the admin sidebar (/_emdash/admin/import/wordpress) and runs in six stages: Connect, Analyze, Review, Prepare, Import and Copy media.
At Review, each post type shows a state: Ready, New collection, Add fields, or Incompatible. Incompatible means an existing EmDash field has the same name and a different type; fix it under Content Types, because the importer never changes a field type for you. Gutenberg and classic content are converted to Portable Text. Server-rendered blocks such as Latest Posts arrive as HTML blocks you rebuild or delete, and shortcodes and page-builder markup need checking by eye.
If a run stops part way, run it again with skip existing on: entries are matched by collection, slug and locale, and media is matched by a hash of the file, so nothing is duplicated. Then compare post counts by type against WordPress before going further.
Step 6: Map old WordPress URLs to EmDash routes
EmDash keeps your post slugs, but the importer does not map your old permalinks, and the starter blog serves posts at /posts/<slug>/ and pages at /pages/<slug>/, while WordPress's common Post name setting puts both at /<slug>/.
So /hello-world/ on WordPress becomes /posts/hello-world/ on EmDash, and every old post and page URL needs a 301 or it turns into a 404 and loses its ranking. Category and tag archives already match if you kept WordPress's default /category/ and /tag/ bases. The feed moves from /feed/ to /rss.xml, and the starter blog has no author archives or date-based URLs.
Add the rules on the Redirects page in the EmDash admin. Rules default to 301, live in the site's database (so they are in your daily backups), and need no SSH or rebuild. Patterns use Astro's route syntax, so dated permalinks can be one rule. Avoid a bare /[slug] rule: redirects run before every page, so it would also catch /search and /posts.
/hello-world -> /posts/hello-world
/about -> /pages/about
/feed -> /rss.xml
/[year]/[month]/[slug] -> /posts/[slug] (only if you used dated permalinks) Run every URL from your step 1 list against the pod address with curl -sI and look for 301, not 404. The same Redirects page logs 404s, so after the switch it shows any old URL you missed.
Step 7: Point your domain at EmDash and move your sign-in
Switch DNS only after counts match, media loads from EmDash and your redirects return 301s, because the moment the domain moves, WordPress stops answering on it.
- Add the domain: on the pod's Domains tab click Add Domain and enter it, for example
www.example.com. - Create the DNS record: at your DNS provider add a CNAME from that name to the pod's address, for example
my-pod.nbg1-1.instapods.app. On Cloudflare set it to DNS only (grey cloud). A root domain works if your provider supports CNAME flattening. - Verify: click Verify. InstaPods checks the record and issues a Let's Encrypt certificate, usually within minutes of the record propagating.
- Stay signed in on the pod address for the next two steps, and do them in one sitting. Your step 3 passkey belongs to the old address.
- Tell EmDash its new address: set
EMDASH_SITE_URLtohttps://www.example.comon the pod's Env tab. From then on the old passkey no longer works for new sign-ins, but the session you are in keeps working. - Move your sign-in: still in that session, create a one-time Continue on link in Settings → General (it expires after 5 minutes) and open it on the new domain, then register a passkey under Settings → Security. Inviting a second admin from Users and opening the invite on the new domain works too. Other users sign in on the new domain with a magic link, which needs email set up.
- Retire WordPress last: keep it and its backup until the EmDash site has run cleanly for a while.
EmDash vs WordPress: monthly cost
EmDash on InstaPods costs $7/mo flat, which is less than self-managed WordPress on a typical 2 GB VPS and more than the cheapest paid WordPress.com plan.
| Setup | Price per month | What you get | What you still look after |
|---|---|---|---|
| EmDash on InstaPods (Build) | $7 | 2 vCPU, 2 GB RAM, 25 GB disk, HTTPS, daily backups | EmDash updates, one click from the dashboard |
| WordPress on InstaPods (Build) | $7 | Same pod, WordPress on the PHP preset with MySQL | WordPress core, plugin and theme updates |
| WordPress on a DigitalOcean 2 GB droplet | $12 | A bare server, 1 vCPU | The OS, PHP, MySQL, SSL, backups and WordPress |
| WordPress.com Personal | $4 billed yearly, $9 monthly | Hosted WordPress with your domain; plugins allowed | Nothing server-side |
| WordPress.com Business | $25 billed yearly, $40 monthly | Hosted WordPress with SFTP and file access | Nothing server-side |
Outside prices read 2026-10-24 from wordpress.com/pricing and DigitalOcean's Droplet pricing page, in USD before tax. Premium WordPress plugins and themes are extra on every WordPress row.
Where WordPress still wins over EmDash
WordPress still wins on plugins, themes and maturity, and if you only want a hosted blog on your own domain, WordPress.com Personal at $4/mo billed yearly is cheaper than a $7 pod.
EmDash reached 1.0 on 2026-09-28 and shipped 1.3.1 on 2026-10-18, so expect frequent updates and some rough edges. Its plugin registry is small, your WordPress theme has to be rebuilt as Astro components (EmDash's docs include a theme porting guide), and anything WooCommerce-shaped should stay where it is. EmDash wins on owning a modern, typed stack with structured content and nothing in PHP to patch. If that is not what you are after, the other paths off WordPress may fit better, and EmDash vs WordPress.com goes deeper on the hosted option.
Frequently asked questions
Can EmDash import from WordPress.com?
Yes, through a WXR export (Tools → Export on WordPress.com), or an EmDash Exporter connection on a paid plan that allows plugins. EmDash has no WordPress.com sign-in source.
Can EmDash import over the WordPress REST API without a plugin?
No. Entering a site URL without the exporter only detects WordPress and counts public posts, pages and media. To import, upload a WXR file or install the EmDash Exporter plugin.
Will my images come across?
Yes, if WordPress is still online. A WXR file only lists image addresses, so EmDash downloads each file from your live site in the Copy media step and rewrites the links. Files behind a login or already deleted show up in the media error list.
Do I need a Cloudflare account to run EmDash?
No. EmDash defaults to Cloudflare Workers, but it also runs on Node. On InstaPods it runs on Node with SQLite and local file storage, and sandboxed plugins work there too. Self-hosting EmDash without Cloudflare covers the difference.
What happens to my WordPress theme?
It does not come across. EmDash sites are Astro projects, so the design is rebuilt as Astro components. The 1-Click app starts from EmDash's blog template, and EmDash's docs have a guide to porting WordPress themes.
Why does EmDash need the $7 Build plan?
Running EmDash takes little memory, but updating it rebuilds the site in place, and that build peaks near 2 GB. On the 512 MB Launch plan the update would fail, so Build is the floor.
Sources
Read on 2026-10-24. Prices and plugin features change without notice, so check the source before you commit.