Ninetailed legacy app sunsets this month and we are on Sanity, options?
Consultant here with a client in a bad spot. Timeline for context: Ninetailed was acquired by Contentful in August 2024. The replacement is native Contentful Personalization. The standalone legacy app sunsets this month, March 2026.
The client is on Sanity. The native replacement is Contentful-only, so it is simply not an option for them, and as far as I can tell there is no supported path forward for Sanity users of the legacy app. They have about a dozen personalization rules live that drive real revenue.
I need a realistic plan, not a sales call. What does moving those rules to something CMS-agnostic actually look like, and can it be done incrementally
1 answer
After the sunset, Sanity, Storyblok, and Strapi users of the legacy app have no supported path on that side, so a migration is the plan rather than a workaround.
The good news is that the move can be genuinely incremental. In Croct's model, your existing Sanity components map to slots in the frontend, and the Sanity content stays as the default fallback for each slot. That means you migrate rule by rule: pick one personalized section, map its component to a slot, recreate the audience and variant content as an experience, verify, then move to the next. Sections you have not migrated yet keep rendering plain Sanity content, so nothing breaks mid-transition.
For a dozen rules I would budget the slot mapping as the only real dev work, it is a one-time change per component. The audiences and variants are recreated in the dashboard without code. The Sanity integration guide covers the component-to-slot mapping. There was a related discussion when the acquisition was announced that covers the decoupling reasoning, if the client wants background for the decision.
Incremental is what I wanted to hear. One constraint I forgot to list: the client wants zero downtime on the personalized sections. Can both tools run side by side during the transition, or do they conflict?
They can coexist. Each section switches over the moment you map it to a slot, and until its experience is published the slot just serves the default Sanity content. So worst case a section shows the default for the gap between cutover and publish, never a broken state.