Migration
How do you migrate from Sitecore (XP or SitecoreAI) to Sanity?
Short answer
A Sitecore to Sanity migration, from Sitecore Experience Platform (XP) or SitecoreAI, is a scripted rebuild: templates become schema types, layouts become page-builder arrays, and Rich Text HTML becomes Portable Text (Sanity Docs; Sanity Learn, October 2026). Personalization rules and xDB (Experience Database) data need their own plan, because Sitecore's own migration app doesn't move them (Sitecore, October 2026).
- Sitecore Rich Text field
- Stores HTML, with internal links and imagesConvert it with htmlToBlocks() and a deserializer rule per HTML pattern; internal links become references to the linked documentsSources: Sitecore (The simple field types); Sanity Learn (Convert rich text to Portable Text)
- Export route
- Authoring and Management GraphQL APIDocumented with read/write access on SitecoreAI and on XP 10.5; check an older XP version's own docs before you rely on itSources: Sitecore (Sitecore Authoring and Management GraphQL API (SitecoreAI), Sitecore Authoring and Management GraphQL API (XP 10.5))
- What Sitecore's own app leaves behind
- Personalization, xDB data, page designsSitecoreAI Pathway, Sitecore's app for moving XM and XP sites to SitecoreAI, leaves them behind, so plan replacements before cutoverSource: Sitecore (Migrate a site to SitecoreAI)
- Sanity's migration skill for AI agents
- No Sitecore guide among its eight source guidesGuides cover Adobe Experience Manager, Contentful, Strapi, Webflow, WordPress, Payload, Drupal and Markdown; Sanity calls the skill agent-scaffolded, not fully automatedSources: Sanity on GitHub (sanity-migration skill); Sanity (What's new in August: inline tables, functions calling functions, and visual editing without React)
Deploi’s call
Move from Sitecore to Sanity one site at a time, starting with the site that has the least personalization, and remodel as you go instead of copying the content tree. Choose what replaces personalization, forms and email before the first cutover, because those don't migrate; they get rebuilt or replaced.
PhaseMove from Sitecore to Sanity one site at a time when
- Several sites or brands share one Sitecore instance, so you can move one site, prove the content model and redirects, and keep the rest running.
- Personalization rules run on some pages, so those pages stay on Sitecore until a replacement service is live.
- Your Sitecore version gets security fixes for the whole move, because Sitecore says that since 1 June 2026 its Extended support includes them only as an option you arrange with Sitecore (Sitecore Support, as of October 2026).
StayStay on Sitecore while
- Sitecore Experience Platform (XP) features such as xDB (Experience Database) personalization, Marketing Automation or EXM (Email Experience Manager) run daily with no replacement chosen, because Sitecore's own migration app, which moves sites to SitecoreAI, leaves them behind.
- Your content store must be self-hosted, because Sanity Studio "always connects to a dataset in the hosted Content Lake" (Sanity Docs, Studio development, as of October 2026).
- No JavaScript developer on your team will own Sanity Studio after launch, so the new stack would have no owner.
How do Sitecore templates, items, renderings and placeholders map to Sanity?
Sitecore templates map to Sanity schema types, content items to documents, and each page's layout to an array field on a page document. Sitecore compares templates to classes and items to instances; a page's layout is renderings in placeholders, each fed by a datasource item (Sitecore, Content authoring concepts, October 2026). A Sanity page builder is an array of objects or references, with no pre-built blocks (Sanity Docs, Page building, October 2026).
| Sitecore | Sanity | Migration note |
|---|---|---|
| Data template | Document or object type | Model what the content is |
| Template field | Field | Pick a Sanity type per field type |
| Standard values | initialValue | Fills new documents only |
| Content item | Document | Reuse its Sitecore ID |
| Page item with layout | page document with an array | One array per placeholder |
| Rendering | Object type in the array | Its datasource template sets the fields |
| Datasource used once | Inline object | Stays in the page |
| Shared datasource | Referenced document | One edit updates every page |
| Site or site collection | Dataset or Studio workspace | Split by who edits what |
How do you get content out of Sitecore?
The Authoring and Management GraphQL API (application programming interface) is the export route on SitecoreAI and on Sitecore Experience Platform (XP) 10.5. Sitecore documents it on both as one endpoint and schema with read/write access (Sitecore, SitecoreAI docs; Sitecore, XP 10.5 docs, October 2026). SitecoreAI is the new name for XM Cloud, Sitecore's cloud Experience Manager (XM) (Sitecore, October 2026). On an older XP release, confirm the route in that version's documentation first. Two other routes do narrower jobs:
- Sitecore Content Serialization writes items to YAML for structural items such as templates, renderings and placeholder settings (Sitecore, Content Serialization, October 2026). It mainly feeds your schema map; read structure from it, and take content through the GraphQL API.
- Experience Edge serves published content and a snapshot of the Layout Service output for a route (Sitecore, Experience Edge, October 2026). Call it per URL to record each page's layout; it's a delivery API, not a bulk export.
Export effective values, not stored ones. A Sitecore field left unset (NULL) shows its template's standard value, and Sitecore advises keeping layout settings there (Sitecore, Standard values, October 2026). Sanity initial values only fill new documents created in Sanity Studio (Sanity Docs, Initial Value Templates, October 2026), so an import that skips standard values lands with blank fields.
How does Sitecore Rich Text become Portable Text?
Sitecore Rich Text becomes Portable Text through htmlToBlocks() and custom deserializer rules, because the field stores HTML text, including internal links and images (Sitecore, The simple field types, October 2026). Sanity's Learn course converts rich text this way and turns internal links into references through a URL map (Sanity Learn, Convert rich text to Portable Text, October 2026). Sanity's migration skill for AI agents has no Sitecore guide, only ones for Adobe Experience Manager, Contentful, Strapi, Webflow, WordPress, Payload, Drupal and Markdown (Sanity on GitHub, October 2026), and Sanity calls it "agent-scaffolded, not fully automated" (Sanity August releases, October 2026). Write a rule for each pattern in your own HTML:
- Internal links: resolve each linked item to its Sanity document and store a reference, so links survive URL changes.
- Images: swap each media item for a Sanity image asset with its alt text.
- Tables: the Portable Text Editor edits tables from Studio v6.6.0; the feature is off by default and needs a
tableschema type you declare (Sanity Docs, Configure the Portable Text Editor; Sanity's August 2026 release notes, October 2026). - Inline styles and wrapper markup: keep what editors need and drop the rest, because it's presentation.
Log every element no rule handles, since each one is a schema decision. How Portable Text stores rich text explains the target format.
What happens to the Sitecore Media Library, language versions and numbered versions?
Sitecore Media Library items become Sanity assets, language versions become localized documents or fields, and numbered versions mostly stay behind. Sitecore keeps two kinds of versions per item: numbered versions in one language, such as a promotion copy of a page, and language versions (Sitecore, Versioning, October 2026).
| Sitecore | Sanity, October 2026 | What to decide |
|---|---|---|
| Media Library item | Image or file asset | Imports on every plan |
| Assets shared across sites | Media Library | Enterprise add-on |
| Language version | Document-level localization | Each language publishes alone |
| Short shared values | Field-level localization | All languages publish together |
| Live numbered version | Published document | Import only this one |
| Promotion version | Scheduled drafts or Content Releases | Releases is an Enterprise add-on |
Sitecore keeps alt text on each language version of an image (Sitecore, Versioning, October 2026); in Sanity, put it on the image field of each language's document. Our review of Sanity's localization models helps you choose.
How do you import Sitecore items into Sanity?
Import Sitecore items as NDJSON (newline-delimited JSON) with sanity datasets import, and use each item's globally unique identifier (GUID) as its Sanity document ID, so a rerun with --replace overwrites the same documents instead of duplicating them (Sanity Docs, Datasets command reference, October 2026). Key each language version as the item GUID plus the language code, such as <guid>-en. Sanity accepts IDs made of letters, numbers, hyphens and underscores (Sanity Docs, Import data, October 2026), so strip any other characters; reused source IDs make the script idempotent (Sanity Learn, Migrating without downtime, October 2026).
Shared datasources can land in any order. References import as weak and flip to strong once every document is in place (Sanity Docs, Import data, October 2026), so a shared datasource document and the pages that use it need no set import sequence.
The rest of a safe import is the same for every source CMS (content management system): validation, a rehearsal, --missing for datasets editors already use, paused webhooks and rollback. Safe imports into Sanity covers them.
What happens to Sitecore URLs, redirects and SEO?
Every Sitecore URL needs a matching Sanity route or a permanent redirect to protect search engine optimization (SEO), aliases included. Sanity's re-platforming course says to crawl the live site as well as export its content, and that the new front end "should not create a new link structure without appropriate redirects" (Sanity Learn, re-platforming course, October 2026).
Sitecore aliases need their own entries in the URL map. An alias gives one content item more than one URL, and Sitecore warns that this "can confuse search engines" (Sitecore, Aliases, October 2026). So export every alias, give each item one canonical URL in Sanity, and redirect every alias to that URL instead of rebuilding aliases as extra routes (Deploi's judgment).
Where the redirects run, how many your host allows and the checks after launch work the same for every source CMS (content management system): keeping SEO through a move to Sanity covers them.
What replaces Sitecore's workflow, roles and modules?
Sitecore's workflow and modules don't migrate to Sanity: each is mapped to Sanity roles, rebuilt in a separate service, or dropped. Sitecore's own list of what SitecoreAI lacks names the marketing pieces, from xDB (Sitecore's Experience Database) personalization rules to EXM (Email Experience Manager) and Sitecore Forms (Sitecore, Limitations and restrictions, October 2026), so moving to SitecoreAI rebuilds them too. SitecoreAI keeps workflows in its Content Editor (Sitecore, SitecoreAI, October 2026).
| Sitecore | Sanity side, October 2026 | What you do |
|---|---|---|
| Workflow states | Contributor drafts, Editor publishes | Map each state to a role |
| Security roles | 5 roles on Growth, custom on Enterprise | Re-invite members by role |
| Personalization, Forms and EXM | Plugin stores variants; no built-in forms or email | Rebuild in separate services |
| Custom search indexes | GROQ (Graph-Relational Object Queries) search; semantic search on every plan, within a monthly query quota | Query Sanity first; add a search service for facets |
How Sanity and Sitecore compare weighs the full marketing suite, and Sanity Workflows tracks its release.
What is the step-by-step plan for a Sitecore to Sanity migration?
A Sitecore to Sanity migration runs in seven steps, one site at a time, so each site's content model and redirects are proven before the next starts. Sanity's course advises starting with low-risk content (Sanity Learn, October 2026). Leaving Sitecore says whether your Sitecore version's support dates set the pace.
Migrating Sitecore to Sanity
- Inventory. Serialize templates and renderings, crawl every URL, and list each page's personalization rules. Owner: Sitecore developer.
- Model. Turn templates into schema types and renderings into page-builder objects. Owner: developer and content lead.
- Export. Pull items through the Authoring and Management GraphQL endpoint with standard values resolved. Owner: developer.
- Convert rich text. Run
htmlToBlocks()with a rule per pattern. Owner: developer. - Import and validate. Load NDJSON keyed by Sitecore item IDs, then validate. Owner: developer.
- Redirect. Map every URL and alias. Owner: search lead.
- Cut over one site. Switch it, crawl it, then plan the next. Owner: site owner.
Deploi’s point of view
- Where we disagree
- The common pitch treats a Sitecore exit as a content export: pull the items, push them into the new CMS. Sitecore content isn't only items. A page's meaning sits in layout data, standard values and datasource items, and its marketing value sits in xDB and personalization rules that Sitecore's own migration app leaves behind. The second wrong claim is that XP is ending, so you must leave now. Sitecore says it shipped XP 10.5 in August 2026. Leave because the content model or the cost no longer fits, not because of a deadline that doesn't exist for every version.
- What we’ve seen
- We convert Markdown into Portable Text for our own content: deploi.ca's FAQ hub stores its answers as Portable Text extended with custom table, callout and code blocks, filled by our own converter, and 229 of 256 live answers carry at least one custom table block, counted 24 October 2026. We load content with NDJSON imports, document IDs prefixed drafts. so it lands unpublished, weak references so import order doesn't matter, and an export to restore from. Our view of Sitecore rests on its documentation and public sources.
- What we'd tell you to do first
- Before any schema work, pull three lists from Sitecore: every template with its base templates and standard values, every rendering with the datasource template it expects, and every personalization rule with the pages it runs on. The first two become the Sanity schema. The third is the list of things you rebuild elsewhere or drop.
- What we refuse to promise
- We won't promise that personalization carries over, a cutover date before those three lists exist, or a price on this page. Cost depends on templates, renderings, languages and the rules you rebuild, so we scope it on a call.
When this answer changes
- Sitecore updates its Product Support Lifecycle page, where changes apply 30 days after posting
- Sanity publishes a Sitecore migration course, importer or migration-skill guide
- Sitecore changes the Authoring and Management GraphQL API or Experience Edge
- Sanity Workflows leaves early access
- Sanity moves Media Library or Content Releases to another plan
- SitecoreAI Pathway starts moving personalization, xDB data or page designs
Sources
Every source opened and checked on 25 October 2026.
- Sitecore, Content authoring concepts for developers new to Sitecore
- Sitecore, Migrate a site to SitecoreAI
- Sitecore, Limitations and restrictions
- Sitecore, The simple field types
- Sitecore, Versioning
- Sitecore, Standard values for data template fields
- Sitecore, Sitecore Authoring and Management GraphQL API (SitecoreAI)
- Sitecore, Sitecore Authoring and Management GraphQL API (XP 10.5)
- Sitecore, Experience Edge
- Sitecore, Sitecore Content Serialization
- Sitecore, Sitecore Product Support Lifecycle
- Sitecore, Aliases
- Sitecore, SitecoreAI
- Sanity Docs, How to use structured content for page building
- Sanity Learn, Convert rich text to Portable Text
- Sanity Docs, Import data
- Sanity Learn, Planning a re-platforming project
- Sanity Learn, Re-modelling your existing content
- Sanity Learn, Migrating without downtime
- Sanity Docs, Initial Value Templates
- Sanity Docs, Localization
- Sanity, Plans that scale with you
- Sanity Docs, Configure your studios and CLI to use Media Library
- Sanity Docs, Import assets to Media Library
- Sanity Docs, Scheduled drafts
- Sanity, Scheduled Drafts: Stop manually publishing content at midnight
- Sanity Docs, Workflows
- Sanity Docs, How early access works
- Sanity Docs, Roles and permissions
- Sanity Docs, How to implement multi-tenancy with Sanity
- Sanity, @sanity/personalization-plugin
- Sanity Docs, Configure the Portable Text Editor
- Sanity, What's new in August: inline tables, functions calling functions, and visual editing without React
- Sitecore, Deploying SitecoreAI
- Sitecore, Workflow
- Sanity Docs, Workspaces
- Sanity Docs, Datasets CLI command reference
- Sanity Docs, Studio development
- Sanity on GitHub, sanity-migration skill
- Sanity Docs, Dataset Embeddings