← All playbooks
CMS migration

Sanity → Contentful

Move content, assets, authors, URLs, SEO, design, forms, permissions, integrations, and publishing operations from Sanity into Contentful with an explicit exception ledger and evidence-based cutover.

Typical timeline12–30 business days55–110 hours active work
Statusneeds review
Source testedSanity documentation reviewed 2026-07-19
Destination testedContentful documentation reviewed 2026-07-19
Last reviewed2026-07-19
Sources2
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

Sanity

Reasons to stay
  • Content Lake, schema-as-code, and customizable Studio support sophisticated structured content
  • Editors get a purpose-built publishing workflow instead of raw files
Reasons to leave
  • GROQ, schema code, and custom editorial tooling demand engineering ownership
  • Themes, extensions, and content models add maintenance and portability constraints
New platform

Contentful

What gets better
  • Mature structured content APIs, localization, roles, and ecosystem support enterprise publishing
  • Editors get a purpose-built publishing workflow instead of raw files
What gets worse
  • Content-model complexity, API usage, and pricing can create significant platform dependence
  • Themes, extensions, and content models add maintenance and portability constraints
Best of the move

Contentful: Mature structured content APIs, localization, roles, and ecosystem support enterprise publishing. This removes a major source-side concern: GROQ, schema code, and custom editorial tooling demand engineering ownership.

Worst of the move

What you lose: Content Lake, schema-as-code, and customizable Studio support sophisticated structured content. What you inherit: Content-model complexity, API usage, and pricing can create significant platform dependence.

01At a glance

Know the shape of the move.

Transfer outcome12 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 5, Manual rebuild: 5, Not transferred: 2.
Clean0
Partial5
Manual5
Lost2
Mapping route9 of 9 fields have a destination path

This timeline assumes

  • Up to 10 sites, 10,000 content items, and 25,000 public routes
  • 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.
02Loss matrix

What survives the move.

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

ItemOutcomeImpactWhat happensMitigation
Content, assets, authors, structure, public URLs, and metadatapartialcriticalCore content, assets, authors, structure, public urls, and metadata can move, but Sanity and Contentful use different models, limits, identifiers, and import behavior.Pilot every feature class, preserve source IDs, and reconcile accepted, transformed, rejected, and excluded items.
Themes, hosted applications, forms, memberships, integrations, and historymanualcriticalSanity-specific runtime configuration and historical evidence do not become native Contentful behavior through the core data transfer.Inventory every active dependency, approve its destination disposition, and test the replacement before source writes stop.
Published posts and pagespartialcriticalCore 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 mediapartialcriticalExports can reference remote files instead of carrying verified local originals.Copy originals, record hashes, and keep the source public until reconciliation.
Public URLs and redirectsmanualcriticalRouting rules and slug behavior differ between the two platforms.Create a source-to-destination URL registry and test every redirect.
Authors and permissionspartialhighBylines may move, but user accounts, roles, and credentials do not transfer safely.Create destination users deliberately and assign least privilege.
Taxonomies and navigationpartialhighCategories, tags, menus, and collection semantics rarely map one-to-one.Approve a mapping and test archive, menu, and breadcrumb behavior.
SEO metadata and structured datamanualcriticalTitles, descriptions, canonicals, social cards, and schema require destination configuration.Crawl both sites and block cutover on critical SEO differences.
Forms and submissionsmanualcriticalHosted 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 reportslostmediumHistorical platform reports do not become native destination history.Export dated reports and annotate the analytics cutover.
Theme and visual presentationlosthighSource themes and design systems do not run on the destination platform.Rebuild approved templates and compare screenshots at supported breakpoints.
Integrations and scheduled jobsmanualcriticalAPI keys, webhooks, embeds, and scheduled jobs remain connected to the source.Inventory, replace, rotate, and test every production integration.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Sanity post or pageContentful content item or pagetransformPreserve source ID and public URL.
TitleTitleautomaticVerify entities and Unicode.
Slug or pathSlug or pathtransformPreserve the public URL or create one redirect.
Rich bodyDestination rich contenttransformRepair unsupported blocks and embeds.
AuthorDestination user or bylinemanualProvision users before assignment.
Category or tagDestination taxonomytransformApprove hierarchy and primary classification.
Featured image and mediaDestination mediatransformCopy originals and preserve alt text.
SEO fieldsDestination SEO fieldsmanualVerify titles, descriptions, canonical, social data, and schema.
FormDestination form or external handlermanualRebuild validation, consent, spam control, storage, and alerts.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Preserve Sanity data, configuration, and operating evidence before any destination write.

  1. Export all available Sanity content and settings.
  2. Crawl production for routes, metadata, schema, assets, forms, status codes, and integrations.
  3. Capture themes, design tokens, screenshots, DNS, domains, users, redirects, analytics, and submissions.
  4. 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.

Transformation · Crawler, spreadsheet, and content transformer

Content and route registry

Preserve public content and URL intent.

  1. Inventory source values and exceptions.
  2. Define explicit destination mappings.
  3. Reject unmapped critical records.

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

Transformation · Checksum tool and schema validator

Asset and metadata normalization

Make media, taxonomy, and SEO deterministic.

  1. Normalize encoding, dates, identifiers, and blanks.
  2. Run a representative pilot.
  3. Reconcile accepted, rejected, and transformed rows.

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.

Import

A successful import hides missing runtime behavior

criticalpossible likelihood

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.

Cutover

URLs or metadata change silently

criticalpossible likelihood

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.

Cleanup

Remote media disappears after source shutdown

highpossible likelihood

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.

06Precise timeline

Do the work in this order.

Estimate forUp to 10 sites, 10,000 content items, and 25,000 public routes
Total elapsed12–30 business days
Active work55–110 hours
BufferAdd time for large exports, unsupported Sanity features, destination limits, identity exceptions, regulated data, or strict downtime requirements.
01
Days 1–3Inventory and decisions2–3 days
02
Days 3–5Backup and reconcile1–3 days
03
Days 5–12Map and pilot3–8 days
04
Days 10–20Final delta and switch1–5 days
05
Days 12–40Observe and close3–10 days
  1. Days 1–3 · inventory

    Inventory and decisions

    6–12 hours active2–3 days elapsedOwner review waiting
    • Inventory Sanity data, features, users, domains, and integrations.
    • Approve scope, owners, mappings, and exclusions.

    Depends on: Sanity and Contentful administrator access

    Stop / go checkpoint

    Export?

    Go when: Every critical item has an owner and disposition.

    Stop when: Consent, billing, access, or system ownership is unclear.

  2. 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 checkpoint

    Transform?

    Go when: Source totals and export manifests agree.

    Stop when: Any critical dataset or configuration is absent.

  3. Days 5–12 · pilot

    Map and pilot

    10–35 hours active3–8 days elapsedDestination processing and review waiting
    • Configure Contentful and transform representative data.
    • Run a pilot containing normal records and every critical edge case.

    Depends on: Verified backup

    Stop / go checkpoint

    Scale?

    Go when: Pilot mappings, behavior, access, and evidence pass.

    Stop when: Any critical check fails or produces unexplained variance.

  4. Days 10–20 · cutover

    Final delta and switch

    5–25 hours active1–5 days elapsedDNS, import, or sync propagation waiting
    • Freeze production writes in Sanity.
    • Apply the final delta, switch ownership, and run blocking checks.

    Depends on: Passed pilot and approved rollback

    Stop / go checkpoint

    Open production?

    Go when: Counts reconcile and one destination system owns production.

    Stop when: A source writer remains active or a blocking check fails.

  5. 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 checkpoint

    Close rollback?

    Go when: No trigger occurs during the agreed observation period.

    Stop when: Data, access, delivery, routing, or business results regress.

07The point of change

Cut over with a way back.

Go live

Cutover

Make Contentful the only production system without losing the final Sanity delta.

Recommended window: A low-volume weekday morning with platform, data, DNS, and business owners available.

  1. Freeze production writes and scheduled actions in Sanity.
  2. Export, transform, and reconcile the final delta.
  3. Apply the approved delta to Contentful.
  4. Switch domains, forms, integrations, sending, or sync ownership as applicable.
  5. Run every blocking verification check and keep the source intact.

Proof to capture: Contentful owns production, totals reconcile, and every blocking check has durable evidence.

Return to safety

Rollback

Return production ownership to Sanity without losing destination-era changes.

Deadline: Within seven days and before source data, plans, credentials, domains, or billing are changed.

  1. Stop new writes and scheduled actions in Contentful.
  2. Restore the prior Sanity routing, forms, integrations, sending, or sync ownership.
  3. Export the Contentful post-cutover delta.
  4. Review and apply safe destination-era changes to Sanity.
  5. Run the same blocking checks against the restored source.

Proof to capture: Sanity again owns production with current data and no duplicate destination action.

Rollback immediately when
  • 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
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-01BlockingURL dispositionCrawl every source URL.One 200 destination or one-hop permanent redirect.Crawl diff.
V-02BlockingRecord and field reconciliationCompare counts and stratified records.Every scoped item and critical field maps.Content manifest.
V-03BlockingBinary independenceCompare URLs, hashes, sizes, and source-domain requests.No required asset depends on the source.Asset report.
V-04BlockingMetadata and index controlCompare titles, descriptions, canonicals, robots, social data, and schema.Approved parity with no accidental noindex.SEO diff.
V-05BlockingSubmission lifecycleSubmit every form and upload path.Validation, storage, consent, notification, and response pass.Submission IDs.
V-06BlockingRestricted contentTest anonymous and authorized roles.No restricted content leaks.Access matrix.
V-07Responsive templatesCompare key pages at approved breakpoints.Content and interactions meet acceptance.Screenshot set.
V-08BlockingSingle source of truthInspect publishing and integrations in both systems.Contentful alone owns production.Operating inventory.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One complete operating cycle, at least seven stable days, and owner sign-off on every blocking check.

  1. Create final Sanity exports and archive verification evidence.
  2. Revoke temporary credentials, API keys, webhooks, and elevated roles.
  3. Remove obsolete embeds, forms, jobs, integrations, and DNS records.
  4. Keep the source intact through the approved retention window.
  5. Cancel paid plans only after billing, legal, and recovery review.
  6. Schedule the next Contentful backup, access, and migration-playbook review.
Sources and maintenance

Built to be reviewed.

Tested 2026-07-19. Next scheduled review: 2026-10-19.

  1. Sanity: official migration documentationAccessed 2026-07-19
  2. Contentful: official migration documentationAccessed 2026-07-19