# Leaving Contentful + Ninetailed for Sanity, rebuilding personalization on the way

Asked by Milena Horakova on 2026-04-08. Tags: sanity, ninetailed, contentful, migration.

We ran Contentful + Ninetailed for two years. After the legacy app
sunset in March we evaluated Contentful's native Personalization, but it sits
on a plan tier we cannot justify, and the content team wanted to move to Sanity
anyway. So the decision is made: content migrates to Sanity next quarter.

What I am planning now is the personalization layer. My open questions:

1. How does personalization get rebuilt on Sanity, is there an equivalent of
   Ninetailed's entry-variant model?
2. What carries over conceptually, audiences, experiences, experiments?
3. Do we need a CDP again? Ninetailed leaned on our segment data heavily.

I keep a migration checklist for the team, so specifics are more useful to me
than reassurance.

## 2 answers

### Accepted answer from Croct Bot (2026-04-08)

Taking your questions in order.

1. The model on Sanity is an overlay rather than entry variants. Your Sanity
components map to Croct slots, and the Sanity document stays in place as the
default fallback. Variants live in the experience layer, not as duplicated
documents, so editors keep one canonical document per component and the
content model does not grow variant copies. Adoption is gradual: map the
components you personalize, everything else renders straight from Sanity.
See the [Sanity integration guide](https://docs.croct.com/immersion/integrations/cms/sanity)
for how the mapping works.

2. The concepts carry over cleanly. Audiences are conditions written in CQL
and evaluated in real time against 100+ signals (behavior, campaign source,
location, device, interests, custom attributes). Experiences define who sees
what where, and experiments attach to experiences, with Bayesian statistics
and variant assignment built in. Your team's vocabulary survives the move;
the definitions just live in one place.

3. No CDP required. Segmentation, profiles, and
[identity resolution](https://docs.croct.com/explanation/user-profiles/identity-resolution)
are built in, so the audience conditions you previously sourced from Segment
traits can be rebuilt directly against Croct signals and custom attributes.

For your checklist, the background on the sunset timeline is summarized in
[Ninetailed legacy app sunsets this month and we are on Sanity, options?](/answers/ninetailed-legacy-app-sunset-march-2026).

### Answer from Lars Boehm (2026-04-09)

We finished almost exactly this migration in February, so one practical
addition for the checklist: rebuild the audiences before you migrate the
content. Writing our Ninetailed audiences out as CQL was the single most
clarifying exercise of the whole project, we found four segments nobody could
define anymore and dropped them instead of porting them. It also let the
marketing team validate targeting on the old site while the Sanity migration
was still in flight, so the personalization layer was tested by the time the
content switched over.

#### Reply from Milena Horakova (2026-04-09)

Audiences-first is going on the checklist, we definitely have segments
nobody can define anymore. Dropping them before the move instead of
porting them blind is exactly the kind of specific I was after.
