← All playbooks
Commerce migration

WordPress → Shopify

Move WordPress posts into Shopify blog articles, then redirect the old paths. Shopify article handles do not keep a root-level post URL, and the WordPress export does not include the uploads folder.

Typical timeline1 to 3 weeks16 to 30 hours active work
Statusneeds review
Source profileWordPress Tools Export screen, last updated 2024-06-08, reviewed 2026-11-04
Destination profileShopify Article and Redirect REST resources reviewed 2026-11-04
Documentation date
Review window
Evidence3 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

Shopify

What gets better
  • A polished hosted commerce platform has an unmatched app and partner ecosystem
  • Core catalog, order, customer, and promotion workflows are integrated
What gets worse
  • Transaction economics, app dependency, and checkout constraints reduce control
  • Deep customization usually increases extension, agency, or engineering costs
Best of the move

Shopify: A polished hosted commerce platform has an unmatched app and partner ecosystem. 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: Transaction economics, app dependency, and checkout constraints reduce control.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome10 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 4, Manual rebuild: 4, Not transferred: 2.
Clean0
Partial4
Manual4
Lost2
Mapping route9 of 9 fields have a destination path

This timeline assumes

  • This guide is the content move: posts into a Shopify blog, then redirects. The site already documents WooCommerce → Shopify and Magento → Shopify for catalog, customer, and order work.
  • You can download a WordPress WXR and create articles on one Shopify blog. Articles belong to a single blog. The handle is the slug in the article URL.
  • You will add redirects before you delete WordPress. A redirect path is unique, at most 1024 characters. The target is at most 255 characters.
  • The REST Admin API is legacy as of 1 October 2024. Shopify says new public apps must use the GraphQL Admin API starting 1 April 2025. The admin CSV import is the path that does not require an app.
02What transfers

What survives the move.

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

ItemOutcomeImpactWhat happensMitigation
Root-level post URLspartialcriticalWordPress can publish a post at a path like /post-name. Shopify's article handle is the slug, and the article belongs to a blog. In a March 2024 Shopify Community thread, a partner moving a WordPress site said the new URL picked up a /blogs/news/ prefix, and a reply said a blog URL without a folder prefix is not available.Create the article, then add a redirect from the old path to the new one. Do not plan on deleting the blog prefix.
Redirects that live only in WordPresslostcriticalThe same thread points out that a redirect created inside WordPress stops working when WordPress is deleted. The redirect has to exist on Shopify.Import a CSV in Shopify admin: Online Store, Navigation, View URL redirects, Import. Columns are Redirect from and Redirect to.
Redirect limitspartialhighShopify's Redirect resource says path and target are required, paths are unique, path is at most 1024 characters, and target is at most 255. A full URL in path is stored as the path without the domain. A missing path or target returns an error, and the target cannot equal the path.Use paths such as /post-name and /blogs/news/post-name. Shorten any target that exceeds 255 characters.
Themes, plugins, and uploadslostcriticalThe WordPress export page lists posts, pages, custom post types, comments, custom fields, categories, tags, custom taxonomies, and users. All content also includes navigation menus. It does not list themes, plugins, or the uploads folder.Copy wp-content/uploads yourself. Rebuild the theme in Shopify. Leave plugins behind unless you replace each one.
Images inside post HTMLmanualhighArticle body_html is HTML. A WordPress post often points images at the old host. The export file is XML, not the image bytes. Shopify can also take an article image as a Base64 attachment.Rewrite image URLs onto files you host on Shopify before you turn the old site off.
CommentsmanualmediumThe WXR includes comments. Shopify says an article can have comments. The create-article examples set title, author, tags, body HTML, and published_at. They do not show a field for the old comment thread.Keep the WXR as the comment archive unless you find a comment import you have tested.
Pages and menusmanualhighPages and navigation menus can be in the WXR. An article is not a page. This guide's checked path creates blog articles, not Shopify pages or the online-store menu.List pages and menu items in the inventory. Recreate them in Shopify admin after the posts are in.
Authors and datespartialmediumYou can set article author, tags, body HTML, and published_at on create. published_at is the publish time. created_at on the article resource is read-only. Tags are a comma-separated string.Set author and published_at from the WXR when you create the article. Do not expect created_at to keep the WordPress date.
One article, one blogpartialmediumShopify says an article belongs to a single blog. A WordPress post in several categories does not become several articles unless you create them.Pick the blog for each post. Add the other categories as tags if you need them.
Catalog datamanualhighA WXR of posts is not a product, customer, or order file. Shops that also run WooCommerce need that migration too.Use the WooCommerce → Shopify guide for the store. Keep this guide on the posts and the redirects.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Post titlearticle.titleautomaticCreate the article on a blog id.
Post slugarticle.handletransformThe handle is the slug. The public URL still includes the blog path.
Post bodyarticle.body_htmltransformRewrite upload URLs before cutover.
Author display namearticle.authorautomaticA name string, not a WordPress user id.
Categories and tagsarticle.tagstransformComma-separated. The blog itself is the primary grouping.
Publish datearticle.published_attransformISO 8601. created_at is read-only.
Featured image filearticle.image attachmentmanualBase64 attachment, or a URL you host after you copy uploads.
Old pathredirect.pathmanualUnique, max 1024 characters, no domain in the stored path.
New article pathredirect.targetmanualMax 255 characters. Cannot equal the path.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Keep the WXR and a copy of uploads until Shopify redirects answer the old URLs.

  1. In WordPress, open Tools, Export. Download All content, then a Posts export if you want a smaller file.
  2. Copy wp-content/uploads separately. The WXR page does not include that folder.
  3. Save a spreadsheet of old path, new path, and handle.
  4. Leave WordPress up until a sample of redirects works on Shopify.

Proof to capture: The WXR, the uploads copy, and the redirect spreadsheet are stored outside both sites.

Transformation · Shopify Article resource or an admin import you trust

Posts to articles

Create one Shopify article per post on a single blog.

  1. Create the blog that will own the posts.
  2. Map title, author, tags, body HTML, handle, and published_at.
  3. Copy images and rewrite src values in the HTML.
  4. Record the public path Shopify gives each article.

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

Transformation · Shopify admin URL redirects

Redirect CSV

Send the old WordPress paths to the new article paths on Shopify.

  1. Build a CSV with Redirect from and Redirect to.
  2. Use the path only. Keep each target within 255 characters.
  3. Import at Online Store, Navigation, View URL redirects.
  4. Request the old path on the Shopify domain and confirm the target.

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.

Cutover

Redirects stay in WordPress

criticalpossible likelihood

The only redirect is a WordPress plugin or a duplicate page.

Consequence
Deleting WordPress removes the redirect. Old URLs 404.
Mitigation
Import redirects into Shopify before the domain moves.

Stop if: A sample old path does not resolve on Shopify.

Pilot

Handles are treated as the full URL

highlikely likelihood

The spreadsheet maps /post-name to /post-name on Shopify.

Consequence
The article lives under the blog prefix, so the redirect target is wrong.
Mitigation
Copy the path from the live Shopify article.

Stop if: You have not opened the article URL on the shop.

Observe

Images still point at WordPress

highpossible likelihood

body_html still contains the old uploads host.

Consequence
Images break when that host goes away.
Mitigation
Rewrite and re-upload before DNS cutover.

Stop if: The uploads copy is incomplete.

06Precise timeline

Do the work in this order.

Estimate forA WordPress site whose posts must keep working at their old paths after the domain points at Shopify
Total elapsed1 to 3 weeks
Active work16 to 30 hours
BufferImage rewrites and page rebuilds take longer than the article create calls.
01
Days 1 to 3Paths and blogs2 to 3 days
02
Days 3 to 4WXR and uploads1 day
03
Days 4 to 8A handful of articles2 to 4 days
04
Days 8 to 12The rest, then the domain2 to 4 days
05
Days 12 to 21Watch old URLs5 to 9 days
  1. Days 1 to 3 · inventory

    Paths and blogs

    4 to 8 hours active2 to 3 days elapsedA crawl of current URLs waiting
    • Export the WXR.
    • List post paths.
    • Choose the Shopify blog.

    Depends on: WordPress admin and a Shopify blog

    Stop / go checkpoint

    Is every post assigned to one blog?

    Go when: Each post has an old path and a planned handle.

    Stop when: You still expect the root path to be the article URL.

  2. Days 3 to 4 · backup

    WXR and uploads

    2 to 4 hours active1 day elapsedCopy of uploads waiting
    • Store the XML.
    • Copy uploads.
    • Start the redirect spreadsheet.

    Depends on: Inventory

    Stop / go checkpoint

    Can you restore a post without the live site?

    Go when: XML and uploads are both offline copies.

    Stop when: Uploads were assumed to be inside the WXR.

  3. Days 4 to 8 · pilot

    A handful of articles

    4 to 8 hours active2 to 4 days elapsedImage rewrite waiting
    • Create a few articles.
    • Import their redirects.
    • Request the old paths.

    Depends on: Spreadsheet

    Stop / go checkpoint

    Import the rest?

    Go when: Old paths land on the right articles and images load.

    Stop when: A target is over 255 characters or matches the path.

  4. Days 8 to 12 · cutover

    The rest, then the domain

    4 to 8 hours active2 to 4 days elapsedDNS waiting
    • Create the remaining articles.
    • Import the full redirect CSV.
    • Point the domain only after a sample works.

    Depends on: Passed pilot

    Stop / go checkpoint

    Move DNS?

    Go when: Redirects work on the Shopify domain for the sample and the full CSV imported.

    Stop when: WordPress is still the only place redirects exist.

  5. Days 12 to 21 · observe

    Watch old URLs

    2 to 4 hours active5 to 9 days elapsedSearch Console or server logs waiting
    • Request the top old paths.
    • Fix images that still point at WordPress.
    • Keep the WXR.

    Depends on: Domain on Shopify

    Stop / go checkpoint

    Turn WordPress off?

    Go when: The top paths redirect and their images load from Shopify.

    Stop when: A top path 404s.

07The point of change

Cut over with a way back.

Go live

Cutover

Serve the posts from Shopify and answer the old WordPress paths with Shopify redirects.

Recommended window: A low-traffic DNS window after the redirect import, with the WXR already stored.

  1. Finish article create for the posts you are keeping.
  2. Import the redirect CSV in Shopify admin.
  3. Request old paths against the Shopify domain.
  4. Rewrite any body HTML that still points at WordPress.
  5. Move DNS after those checks. Leave WordPress running until then.

Proof to capture: A sample of old paths redirects on Shopify, and those articles do not load images from the WordPress host.

Return to safety

Rollback

Point the domain back at WordPress if Shopify articles or redirects are wrong.

Deadline: Before you delete the WordPress host or the uploads copy.

  1. Move DNS back to WordPress if the new site is the problem.
  2. Keep the Shopify articles and redirects in place so you can fix them.
  3. Compare the redirect spreadsheet with the WXR paths.
  4. Do not delete WordPress until a later attempt passes the same URL checks.

Proof to capture: The domain serves WordPress again, and the WXR plus uploads are still on disk.

Rollback immediately when
  • An old path 404s on Shopify
  • The article URL has no blog prefix in your sheet
  • Images still load from WordPress
  • A redirect target exceeds 255 characters
  • Two rows use the same path
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-01BlockingWXR contentsConfirm the file came from Tools, Export, and that uploads were copied separately.XML is stored, and uploads are a second copy.Backup folder.
V-02BlockingOne blog per articleRead blog_id on a created article.Each article sits on the blog you chose.Article admin.
V-03BlockingLive pathOpen the article and copy the path.The path includes the blog segment. The handle is only the last part.Browser URL.
V-04BlockingColumns and limitsCheck Redirect from, Redirect to, unique paths, and target length.Paths are unique and within 1024 characters. Targets are within 255 and differ from the path.CSV.
V-05BlockingAdmin importImport at Online Store, Navigation, View URL redirects.The row count matches the spreadsheet.Redirect list.
V-06BlockingOld pathRequest a sample of old paths on the Shopify domain.Each one lands on the matching article.Request log.
V-07BlockingHTML hostsSearch body HTML for the WordPress host.Kept articles do not depend on that host.HTML search.
V-08published_atCompare a few articles with the WXR dates.The publish time matches. You did not rely on created_at.Article dates.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: Top WordPress paths redirect on Shopify and article images load without the old host.

  1. Keep the WXR and the uploads copy through the rollback window.
  2. Leave WordPress available until those checks pass.
  3. Recreate pages and menus that were not articles.
  4. Store the redirect CSV with the migration notes.
  5. Use the commerce guides if products and orders still have to move.
  6. Schedule a check of the redirect list after the first week of logs.
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 accountalex-stoykov · Shopify Community

WordPress post URLs gained a Shopify blog prefix2024

On 28 March 2024, Shopify partner alex-stoykov wrote that a WordPress site was in the middle of a move to Shopify. Posts lived at /blog-post-name. On Shopify they were becoming /blogs/news/blog-post-name. Rankings depended on those posts. He considered duplicating each WordPress URL into the Shopify shape and redirecting inside WordPress, then noted that deleting WordPress would cancel that redirect. He also asked whether Shopify would let a page keep the old root path. A same-day reply from P1Commerce said a blog URL cannot drop the folder prefix, and described a CSV with Redirect from and Redirect to, imported at Online Store, Navigation, View URL redirects. The thread does not report a finished domain cutover or a measured ranking result.

What they recommend
  • Copy the live Shopify article path into the redirect target. The handle alone is not the public URL.
  • Put the redirects in Shopify before you delete WordPress. A redirect that exists only in WordPress leaves with it.
Worth noticing
  • The mid-migration report is the prefix: root WordPress posts became /blogs/news/ paths on Shopify.
  • The useful reply is an admin CSV import. The thread never shows that rankings were preserved.
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. WordPress: Tools Export screenAccessed 2026-11-04
  2. Shopify: Article resourceAccessed 2026-11-04
  3. Shopify: Redirect resourceAccessed 2026-11-04