Migration
How do you migrate from Adobe Experience Manager to Sanity?
Short answer
An Adobe Experience Manager (AEM) to Sanity migration is a remodel you script yourself, because Sanity has no AEM importer (Sanity blog, October 2026). Sanity's migration skill for AI agents only scaffolds scripts (Sanity August releases, October 2026). Export published pages as .model.json (Adobe, October 2026), convert their rich text to Portable Text, and decide early what replaces Multi Site Manager and Launches.
- AEM path from Sanity
- No AEM importer or course; an agent skill scaffolds scriptsSanity's MCP server lists guided migrations from Contentful, WordPress, Strapi and Drupal; its WordPress course says many of its techniques transfer to AEM; its migration skill is agent-scaffolded, not fully automatedSources: Sanity (You'll need a CMS eventually. Let your agent set it up., August releases 2026); Sanity Learn (Migrating content from WordPress to Sanity: Introduction)
- Page export
- .model.json on each published pageCustom components need Adobe's exporter interface to appear in the JSON; static HTML export through .export.zip is AEM 6.5 onlySource: Adobe Experience League (Export AEM assets and content using supported methods)
- Launches counterpart
- Content Releases, an Enterprise add-onScheduled drafts, on Growth with Studio v4.14.0 or later, schedules one document at a time; as of October 2026Sources: Sanity Docs (Content Releases, Scheduled drafts); Sanity (Plans that scale with you)
- Live copy counterpart
- No direct equivalent in SanityModel fields per market or a dataset per market; cross-dataset references and custom roles need Enterprise as of October 2026 (Deploi's reading of Sanity's docs)Sources: Sanity Docs (Multi-tenancy implementation, Cross-dataset references)
Deploi’s call
Move from AEM to Sanity in phases, one site or content type at a time, starting with Content Fragments because they're already structured. Before you commit, price the Enterprise features AEM's daily tools land on: Content Releases for Launches, custom roles for permissions finer than Growth's five roles and Media Library for AEM Assets, as of October 2026.
PhaseMove from Adobe Experience Manager (AEM) to Sanity in phases when
- Several sites or brands run on AEM, so you move one site or one content type at a time while AEM serves the rest.
- Content Fragments already hold structured content, which you move first because each Content Fragment Model gives you a head start on a Sanity document type.
- Adobe Target, Adobe Analytics or AEM forms stay in use, so each needs its own replacement before its pages move.
MigrateMigrate from AEM to Sanity in one cutover when
- One site runs on AEM with a modest component library and few live copies.
- An idempotent import script re-runs against a fresh export, so the content freeze shrinks to the final run.
- Nobody depends on Launches for coordinated releases, because Content Releases, the nearest match, is an Enterprise add-on as of October 2026.
Why is an AEM to Sanity migration a remodel, not a copy?
An Adobe Experience Manager (AEM) to Sanity migration is a remodel because AEM builds pages from components, and its Text component edits rich text as HTML (Adobe, Text Component, October 2026). Sanity's re-platforming course says recreating your structure as-is "opens the door to recreating your existing problems, just on a new stack" (Sanity Learn, Planning a re-platforming project, October 2026). Sanity's own tools leave the scripting to you, as of October 2026:
- Sanity has no AEM course or importer; its migration skill for AI agents has an AEM guide (Sanity agent toolkit, October 2026) and is "agent-scaffolded, not fully automated" (Sanity August releases, October 2026).
- Sanity's WordPress course says many of its techniques "will be directly transferable" to AEM (Sanity Learn, WordPress migration introduction, October 2026).
- Sanity's MCP (Model Context Protocol) server lists guided paths from Contentful, WordPress, Strapi and Drupal only (Sanity blog, October 2026).
- Sanity says Tata Digital moved 20,000 documents out of AEM with a single script in under 17 hours (Sanity, Tata Digital, October 2026).
Whether to leave AEM is a separate call: Adobe's core support for AEM 6.5 on premises ends 28 February 2027 and extended support, critical fixes only, ends 28 February 2028 (Adobe, AEM 6.5 support timelines; Adobe, AEM 6.5 FAQ, October 2026), and the AEM 6.5 deadline decision weighs every exit.
How do AEM pages, templates and fragments map to Sanity?
Adobe Experience Manager (AEM) pages map to Sanity document types, and their components become objects in an array. Content Fragments are the easy part: each comes from a Content Fragment Model, a structured model built in AEM's model editor (Adobe, Introduction to Headless for AEM, October 2026). Sanity's course says to use as few pages as possible and reference meaningful content documents instead (Sanity Learn, re-platforming course, October 2026), so Experience Fragments, AEM's reusable groups of components, become referenced documents.
| AEM structure | Sanity equivalent | Notes |
|---|---|---|
| Page and editable template | Page document type | One type per content type, not per template |
| Components in a paragraph system | Array of object types | A page builder array |
| Content Fragment Model | Document type | Fields carry over closely |
| Content Fragment | Document | Keep the AEM path as a source field |
| Experience Fragment | Referenced document | Variations become fields |
| Tag | Taxonomy document | Pages reference it |
| AEM Assets item | Image or file asset | Media Library for a shared library |
| Live copy | No direct equivalent | Fields per market, or a dataset per market |
How do AEM components and rich text become Portable Text?
Convert each Adobe Experience Manager (AEM) Text component to Portable Text, Sanity's structured rich text format, with htmlToBlocks() from @sanity/block-tools and custom deserializer rules. The Text component's Rich Text Editor edits HTML, and its Source Edit view shows "the raw HTML" (Adobe, Text Component, October 2026). The default converter handles paragraphs, headings, lists and inline formatting; "anything else needs an explicit deserializer rule" (Sanity Learn, Convert rich text to Portable Text, October 2026).
Tables need a decision up front. AEM's Rich Text Editor inserts tables, and the Portable Text Editor's built-in table editing, available from Studio v6.6.0, is disabled by default and binds to a table schema type you declare (Sanity Docs, Configure the Portable Text Editor, October 2026).
Every other component becomes an object type in a page builder, which Sanity describes as "an array of custom object or reference types that can be reordered" (Sanity Docs, page building guide, October 2026). Use objects for content that lives on one page and references for content reused across pages, such as Experience Fragments. Name types for meaning, such as a hero or a promotion, not for layout. Log every component type the converter skips, because each one is a schema decision. How Portable Text stores rich text explains the target format.
How do you get content and assets out of AEM?
Adobe's knowledge base lists the supported ways out of Adobe Experience Manager (AEM): append .model.json to a published page URL for its component JSON, export asset metadata as CSV (comma-separated values), download assets in bulk as zip packages, script exports through the Assets HTTP API (application programming interface), and build packages in Package Manager (Adobe, Export AEM assets and content, October 2026). Static HTML through .export.zip works on AEM 6.5 only.
- Custom components appear in
.model.jsononly if they implement the exporter interface, so test every component type before you write the converter. - Script the Assets HTTP API and confirm the output keeps the folder hierarchy, as Adobe's article advises.
- None of these routes gives Sanity-ready content. They give component JSON, files and repository packages to transform.
Content Fragments are also readable over AEM's GraphQL API (Adobe, Introduction to Headless for AEM, October 2026). Adobe's Content Transfer Tool moves content from one AEM instance to AEM as a Cloud Service (Adobe, Content Transfer Tool, October 2026), so it doesn't help here. Because .model.json reads live published pages, the import script can re-run against fresh content until cutover, which is the idempotent script Sanity's course recommends (Sanity Learn, Migrating without downtime, October 2026). AEM export routes in depth and moving AEM Assets go further.
How do you keep AEM URLs, vanity URLs and redirects?
Keep Adobe Experience Manager (AEM) URLs by crawling the live site, exporting every redirect and vanity URL, and storing each as a redirect document in Sanity that your front end serves. AEM defines "redirects, vanity URLs, and virtual hosts" through resource mapping (Adobe, Resource Mapping, October 2026), and its two kinds of rule move differently:
- Pattern mappings pair a regular expression with a replacement (Adobe, Resource Mapping, October 2026), so each needs rewriting in your front end's syntax.
- Vanity URLs "do not support regex patterns" (Adobe, Resource Mapping for AEM as a Cloud Service, October 2026), so each one moves as a one-to-one redirect.
Sanity's redirects guide says there's no "one size fits all" approach, because frameworks handle redirects differently (Sanity Docs, Managing redirects with Sanity, October 2026). Sanity's refactoring course adds the first step: crawl the existing site "to find every route that needs recreating" (Sanity Learn, refactoring course, October 2026).
Count vanity URLs and pattern mappings before you pick the redirect method, because the count against your host's redirect limit decides between a configuration file and middleware. Keeping search traffic through a migration covers those limits, the URL map and monitoring.
What replaces AEM workflows, Launches, Multi Site Manager and permissions?
Sanity has a counterpart for every Adobe Experience Manager (AEM) governance tool except live copies, but the matches for workflows, Launches and custom permissions are in early access or on Enterprise as of October 2026. AEM workflows automate steps "such as approval and sign-off" (Adobe, Administering Workflows); Launches hold future page versions you promote to the source (Adobe, Launches); Multi Site Manager syncs live copies with a source (Adobe, Multi Site Manager, October 2026).
| AEM tool | Sanity counterpart | Plan or status, October 2026 |
|---|---|---|
| Workflow model | Sanity Workflows or custom Studio code | Early access |
| Launch | Content Releases | Enterprise add-on |
| One page scheduled | Scheduled drafts | Growth, Studio v4.14.0 or later |
| Live copy | None; per-market fields or datasets | Cross-dataset references are Enterprise |
| Group permissions | Five built-in roles | Growth |
| Custom permissions | Custom roles | Enterprise |
What else do you replace when AEM goes?
Leaving Adobe Experience Manager (AEM) also retires its delivery tier, so plan four replacements before cutover:
- Publish and Dispatcher. Your front end and its CDN (content delivery network) serve pages. Adobe's own Edge Delivery Services "replaces AEM Publish / Dispatcher" (Adobe, Edge Delivery Services, October 2026), which shows where that layer sits.
- Adobe Target and Adobe Analytics. Their page hooks move into the new front end, in Deploi's judgment; the Adobe stack after AEM covers each one.
- Forms. Forms built as components need a form service or an API (application programming interface) route, in Deploi's judgment.
- AEM Assets. Images and files move to Sanity assets. Media Library, Sanity's app to "centrally store assets for use across multiple applications and datasets", is an Enterprise add-on (Sanity Docs, Media Library; Sanity pricing, October 2026).
Each replacement is a cost driver, alongside component count and redirect volume (Deploi's judgment).
What are the steps of an AEM to Sanity migration, and what goes wrong?
An Adobe Experience Manager (AEM) to Sanity migration runs in seven steps, and the import re-runs. A re-run of sanity datasets import fails on existing IDs unless you pass --replace or --missing (Sanity Docs, Import data, October 2026); choosing between them has its own guide.
Migrating from AEM to Sanity
- Inventory. Crawl live URLs; list component types, live copies and vanity URLs. Owner: developer and content lead.
- Model. Define document types by meaning. Owner: developer and content lead.
- Export. Pull
.model.jsonper page and assets through the Assets HTTP API (application programming interface). Owner: developer. - Convert. Run
htmlToBlocks()with your rules; map components to page builder objects. Owner: developer. - Import. Run an idempotent script, Content Fragments first. Owner: developer.
- Redirect. Add a redirect document per changed URL. Owner: search lead.
- Validate and cut over. Run
sanity documents validate(Sanity Learn, October 2026), check old URLs, switch one site at a time. Owner: developer.
Deploi’s point of view
- Where we disagree
- The common pitch treats a headless migration as an export job. From AEM it isn't: every supported export route gives you component JSON, files or repository packages, never content shaped for Sanity, and Multi Site Manager inheritance has no Sanity equivalent to export into. The second mistake is reading a vendor's fast import run as a project timeline. The script's run time is the smallest part of the job; the content model, the rich text rules, the component mapping and the redirects are the work.
- What we’ve seen
- Rich text conversion is the part of this move closest to our own Sanity work: our Shopify FAQ hub converts Markdown to Portable Text with custom block types for tables, callouts and code, and 229 of its 256 live answers carried at least one table on 24 October 2026. Our FAQ release scripts are dry runs until an apply flag runs them, and they skip any document edited since the snapshot. We ship content as packages with count checks and a rollback by document ID list; the first wave package of our Shopify data section held 406 documents and 159 images. Our view of AEM rests on Adobe's documentation and public sources.
- First steps we'd suggest
- Before any schema work, pull three lists from AEM: every component type in use with a count of pages that use it, every blueprint and live copy, and every vanity URL and resource mapping rule. The first sizes the Sanity schema, the second decides between fields per market and a dataset per market, and the third picks the redirect method.
- What we refuse to promise
- We won't quote hours or a timeline for an AEM to Sanity move from a call, because each estimate starts from your own AEM estate. Sanity's 17-hour Tata figure is one script run in a vendor story, not a project duration.
When this answer changes
- Sanity publishes an AEM importer or course, or changes its migration skill's AEM guide
- Adobe changes the supported export routes in its knowledge base, such as .model.json or .export.zip
- Sanity moves Content Releases, custom roles or Media Library onto the Growth plan
- Sanity Workflows leaves early access
- Adobe changes the AEM 6.5 core support end date of 28 February 2027
Sources
Every source opened and checked on 25 October 2026.
- Adobe Experience League, Export AEM assets and content using supported methods
- Adobe Experience League, Text Component
- Adobe Experience League, Introduction to Headless for AEM
- Adobe Experience League, Experience Fragments
- Adobe Experience League, Reusing Content: Multi Site Manager and Live Copy
- Adobe Experience League, Using Launches to develop content for a future release
- Adobe Experience League, Administering Workflows
- Adobe Experience League, Resource Mapping (AEM 6.5)
- Adobe Experience League, Resource Mapping (AEM as a Cloud Service)
- Adobe Experience League, Edge Delivery Services Overview
- Adobe Experience League, AEM 6.5 On-premise support timelines and service pack policy
- Sanity Learn, Planning a re-platforming project
- Sanity Learn, Re-modelling your existing content
- Sanity Learn, Migrating without downtime
- Sanity Learn, Convert rich text to Portable Text
- Sanity Docs, Import data
- Sanity Docs, Configure the Portable Text Editor
- Sanity Docs, Managing redirects with Sanity
- Sanity Learn, Reducing SEO impact
- Sanity Docs, Media Library introduction
- Sanity, Plans that scale with you
- Sanity Docs, Content Releases
- Sanity Docs, Scheduled drafts
- Sanity Docs, Roles and permissions
- Sanity Docs, Multi-tenancy implementation
- Sanity Docs, Workflows: How early access works
- Sanity, Scaling a multi-brand e-commerce mobile app (Tata Digital)
- Sanity Learn, Migrating content from WordPress to Sanity: Introduction
- Sanity, You'll need a CMS eventually. Let your agent set it up.
- Sanity Docs, How to use structured content for page building
- Adobe Experience League, Overview to Content Transfer Tool
- Sanity Docs, Cross-dataset references
- Sanity Docs, Workflows: Limits
- Adobe Experience League, AEM 6.5 LTS Frequently Asked Questions
- Sanity, August releases 2026
- Sanity, sanity-migration skill (agent toolkit)