Most migration guides treat content as the easy part: export a CSV, import a CSV, done. In practice, content is where the hours go. Rich text loses its formatting, images keep pointing at the old platform, references break, and dead pages get faithfully moved to the new site. This guide walks through the full pipeline we use and links to a deeper guide for each step.
What is CMS content migration?
CMS content migration is the process of moving structured content, such as blog posts, case studies, team members and resource pages, along with their images and metadata, from one content management system to another. It's one part of a website migration, alongside design, build, redirects and analytics.
It applies whether you're moving between visual builders like Webflow and Framer, from WordPress or HubSpot to a headless CMS, or between headless platforms like Contentful, Sanity, Payload and Strapi. The tools differ; the pipeline doesn't.
- Content: text fields, rich-text bodies, dates, flags and options.
- Structure: collections, references between them, and URL slugs.
- Assets: images, files and videos, including those embedded inside rich text.
- Metadata: SEO titles, descriptions, social images and canonicals.
- Behavior: forms, filters and anything else that depended on the old CMS.
Behavior is the part people forget. Forms in particular often post to the old platform's built-in handler, so they need their own plan; see migrating forms and lead capture.
How do you migrate CMS content between website platforms?
You migrate CMS content with an export, transform and import pipeline, wrapped in an audit at the start and a check at the end. Each stage has a clear output, which makes the work easy to divide and easy to rerun.
Inventory
Crawl the site and export every CMS collection so you have a full list of URLs and items, with traffic and backlinks next to each.
Audit
Mark every item keep, merge, rewrite, redirect or delete. Only kept and rewritten items move forward.
Model
Design the new collections and map each old field to a new field type, including references.
Export
Pull content out by CSV, API or platform export, plus every asset file.
Transform
Clean rich text, re-host images, convert references to slugs and normalize dates and options.
Import
Load collections in dependency order into the new CMS, starting with a small test batch.
Verify
Compare imported items with the originals, check metadata and links, and test on staging.
Redirect and launch
Add a 301 for every changed URL, launch, and watch Search Console and analytics.
Scripts make the pipeline repeatable. If an import goes wrong, you fix the transform and rerun it instead of editing hundreds of items by hand. That matters most on sites with large blogs or many collections.
Why should you audit content before a migration?
You should audit content before a migration because every page you move costs time to clean, import, check and maintain. Most sites carry pages nobody visits, old announcements, thin tag pages and duplicates, and a migration is the cheapest moment to drop them.
The audit is a copy decision as much as an SEO one. For each item, look at traffic, backlinks and conversions, then ask whether the message is still true and clear. A post with traffic but an outdated pitch is a rewrite, not a straight copy. Our content audit before migration template gives you the columns and decision rules.
Decision | When to use it | What happens to the URL |
|---|---|---|
Keep | Traffic or links, message still accurate | Same URL, or 301 if the path changes |
Merge | Several thin pages on one topic | 301 from each to the merged page |
Rewrite | Traffic or links, but outdated or unclear | Same URL, new copy |
Redirect | No reason to exist, but has links | 301 to the closest relevant page |
Delete | No traffic, no links, no purpose | 404 or 410, removed from the sitemap |
If the audit shows many pages need new copy, decide whether to rewrite during the migration or after. We weigh the trade-offs in rewriting content during a migration. For pages you want AI engines to quote, consider an answer-first page structure while you're rewriting anyway.
How do you export content from your current CMS?
Export content using the platform's own export first, and its API when the export is incomplete. Most exports miss something: images inside rich text, references, SEO fields or drafts.
Platform | Main export route | Watch out for |
|---|---|---|
Webflow | Per-collection CSV export, or the Data API | Image URLs point at Webflow's CDN |
WordPress | Built-in export file, REST API or plugins | Shortcodes, page-builder markup, category URLs |
Framer | CMS collections via plugins or CSV where available | Limited API compared with headless CMSs |
HubSpot CMS | Blog and page exports, or the API | Modules and HubL templates don't transfer |
Contentful | CLI export or Management API | Rich text is JSON, not HTML |
Sanity | Dataset export | Portable Text needs serializing |
Each platform has its own quirks. We cover them in detail in how to export Webflow CMS content and how to export a WordPress site's content.
How do you map content models between CMSs?
Map content models by listing every field in every old collection and choosing its new field type, collection and purpose. Do it in a spreadsheet, agree it with whoever edits the content, and only then build templates or write scripts.
The mapping is where you fix old mistakes. Free-text category fields can become references. Repeated blocks pasted into rich text can become structured fields. Fields used once can go. Our guide to content modeling for CMS migrations covers how to avoid copying the old structure, and content modeling 101 shows a good baseline for a SaaS site.
Old field | Common problem | Better model |
|---|---|---|
Category as text | Typos create duplicate categories | Reference to a Categories collection |
Author name in each post | Bios and photos repeated everywhere | Reference to an Authors collection |
Pull quotes inside rich text | Styled by hand, inconsistent | Separate quote field or block type |
SEO title missing | Falls back to post title | Dedicated SEO title and description fields |
Hero image in rich text | Hard to reuse in cards | Dedicated image field |
Check the destination's limits as you map. Framer CMS has no multi-reference fields, Webflow's plans set item limits, and Contentful's tiers cap content types, which is one reason teams move from it. If you're between headless platforms, read headless CMS migration.
How do you transform rich text, images and references?
Transform each of the three with its own rule: convert rich text to the format the new CMS expects, re-host every image and rewrite its URL, and turn references into slugs that match items already imported. These are the steps that decide whether imported content looks right.
Rich text
Rich text moves between three main formats: HTML, Markdown and structured JSON such as Portable Text or Contentful's rich-text format. Strip platform-specific classes and wrappers, convert custom blocks to standard elements, and fix heading levels so each post has one H1 from the template. Our guide to migrating rich text between CMSs covers each conversion.
Images and files
Download every asset, upload it to the new CMS or your own storage, and rewrite the URLs in both image fields and rich-text bodies. Keep alt text, and add it where it's missing.
References
Export references as slugs, import the referenced collection first, then match by slug during the main import. Slugs are stable and readable, unlike internal IDs that change between platforms.
For example, suppose a 200-post blog moving from WordPress to Webflow
Hypothetical example: the audit keeps 140 posts, merges 20 into 8 stronger posts and redirects the rest. Authors and categories are imported first as their own collections.
The transform script strips page-builder shortcodes, converts each body to clean HTML, downloads every inline image and rewrites its URL, and replaces category names with category slugs. Posts are imported in batches of 20, checked on staging, and published once the batch matches the originals. WordPress date-based URLs are mapped to the new /blog/slug pattern with 301s.
How do you import content into the new CMS?
Import content with the simplest method that handles your hardest field. CSV is fine for flat collections; the API or a plugin is better for rich text with images, references and large volumes.
- Webflow: CSV import for simple collections, the Data API for rich text and references. Our guide to importing a CSV into Webflow CMS covers the known rich-text image issue.
- Framer: CSV import into CMS collections, plus plugins for syncing from other sources. See importing content into Framer CMS.
- Headless CMSs: import scripts against the platform's API. If you want Framer's design with content in a headless CMS, read Framer with a headless CMS.
- Payload: scripts using its API from inside your codebase, which we used in our Contentful to Payload migration guide.
Always import a small batch first, check it on a staging domain, then run the rest. Fixing the transform after ten items is much cheaper than fixing it after a thousand.
How do you check migrated content before launch?
Check migrated content by comparing counts, sampling items field by field, crawling the staging site, and testing everything that isn't content: forms, analytics and redirects. Each check catches a different kind of failure.
- Counts. Kept items in the audit should equal imported items, per collection.
- Samples. Open a random set of items side by side with the old site and compare text, images, links and metadata.
- Crawl. Crawl staging for broken links, missing titles, duplicate descriptions and images still on the old CDN.
- Redirects. Test every row in the redirect sheet returns a single 301 to the right page.
- Tracking. Confirm events and conversions still fire; our guide to analytics continuity in a migration lists what to check.
After launch, watch Search Console for 404s and drops in indexed pages, and fix them quickly. Content problems that slip through are usually small and quick to fix if you spot them in the first weeks.
How much does CMS content migration cost?
CMS content migration is usually priced as part of a website migration, and the agency quotes we see for full migrations typically run from $1,500 to $25,000. These are typical ranges, and they vary by site size, CMS complexity and region. Larger platform exits take longer: WordPress to a headless Next.js setup is commonly quoted at six to twelve weeks, and leaving HubSpot CMS at six to ten weeks.
What drives the content part of the cost is volume after the audit, the number of collections and references, how messy the rich text is, and how many images sit inside it. A clean 50-post blog moves quickly. A 500-post blog full of page-builder markup doesn't. The reverse direction, out of a visual builder into code, follows the same logic; see Framer to Next.js migration cost.
- Designify website package, up to 6 pages; migration scoped on the call
- $8,000
- Per extra page, fixed
- +$500
- Brand & design sprint, if the message needs work first
- $3,000
Which CMS content migration guide should you read next?
Start with the step you're on. Each guide in this series goes deep on one stage of the pipeline.
Stage | Guide |
|---|---|
Audit | |
Export from Webflow | |
Export from WordPress | |
Transform rich text | |
Import to Webflow | |
Import to Framer | |
Forms and tracking |
