Migrate from Mutiny

Rebuild your personalized experiences on Croct.

Mutiny discontinued its website personalization product on April 8, 2026, and relaunched as an AI tool for generating GTM content. Teams that ran account-based personalization on their website need a different platform.

This migration is different from most because Mutiny was largely no-code: there is no SDK to swap out and no variant entries to port. You’re moving a set of experiences, the audiences behind them, and a workflow.

In this tutorial, you will map Mutiny’s concepts to ours, connect your firmographic provider (if you need one), and rebuild your experiences as experiments you can measure.

How the concepts map

MutinyCroctNotes
SegmentAudienceReal-time evaluation
ExperienceExperienceSame concept
Personalization (element edit)Slot contentThe main workflow changes, covered below
Firmographic data layerIntegrationsYou choose the provider
Visitor dataUser profileBuilt in, real time
GoalGoalCompleted eventTyped event catalog
A/B testExperimentBayesian, unsampled

The one significant difference is how changes reach the page. Mutiny is installed through a tag manager, letting a marketer click any element on a live page and change it. We require a one-time developer integration that connects your components to slots, which makes server-side, flicker-free delivery possible.

After that integration, the day-to-day workflow is the same as Mutiny’s. Audiences, content, preview, approval, and scheduling all happen in the platform, with no per-experience deployment.

In practice, most Mutiny implementations personalized a small number of high-impact areas, such as the hero, logo cloud, testimonials, and CTAs. Those map directly to slots. If your workflow depended on editing arbitrary elements anywhere on the page, plan for that adjustment.

Before you start

You need:

  • A Croct account with a workspace and application set up.
  • Access to your CMS and your frontend repository.
  • Your firmographic provider’s tag still active on the site, if you were using it.
  • A list of your old Mutiny experiences, their audiences, and the pages they run on.

Migrate your experiences

The migration follows the same flow as any other experiment, with your Mutiny inventory as the starting point.

Connect your firmographic provider

We integrate with the mail account intelligence providers. If you were using any of them, you can keep the same strategy. The tool that identifies anonymous companies does not change:

ProviderGuide
6senseIntegration guide
DemandbaseIntegration guide
ZoomInfoIntegration guide

The provider resolves the visitor to a company, the firmographic attributes land on the visitor profile, and audiences read them from there.

Integrate the SDK

Run the CLI in your project:

Command to initialize your project
npx croct@latest init

The CLI detects your framework, installs the SDK, wires the provider, and generates the type definitions. This is additive: nothing changes on your site until you fetch a slot, so you can merge it safely before migrating any experience.

Map personalized elements to slots

Group the elements each Mutiny experience changed into slots, one per area of the page:

Mutiny experience changedSlot
Headline, subheadline, CTA labelhome-hero
Customer logoslogo-cloud
Testimonials or case studiessocial-proof
Pricing page CTApricing-cta

Then, for each slot:

  1. Create a component and a slot.

  2. Add the slot to your project:

    npx croct@latest add slot

    The CLI generates the type definitions and downloads the default content for use as an automatic fallback.

  3. Fetch the content where the component renders, passing your CMS content as the fallback:

    components/HomeHero.jsx
    1234567891011121314151617
    export default async function HomeHero() {  const {content} = await fetchContent('home-hero', {    fallback: {      title: 'Ship faster with confidence',      subtitle: 'The platform teams trust to move quickly.',      ctaLabel: 'Start free',    },  });
      return (    <section>      <h1>{content.title}</h1>      <p>{content.subtitle}</p>      <a href="/signup">{content.ctaLabel}</a>    </section>  );}

The fallback is what visitors see when no experience matches, so it should be your current default copy. Unmatched visitors then see exactly what they see today.

Track conversions

Mutiny goals become goalCompleted events tracked where the conversion happens:

croct.track('goalCompleted', {  goalId: 'demo-requested',});

To fuel your experience dashboards, also track the leadGenerated and orderPlaced events.

If you use HubSpot forms for demo requests, the HubSpot integration tracks submissions as goals and maps form fields into the visitor profile without custom code.

Implement goals before publishing any experience. Otherwise, early data will show exposures with no conversions.

Rebuild your segments as audiences

Mutiny segments were built from firmographic and behavioral attributes, and Croct is no different. We evaluate audiences on the server against a live profile, so behavioral conditions reflect the current session rather than a value synced earlier.

Relaunch as experiments

Create an experience for each audience, attach the slots it should affect, and write the content for each variant.

Croct's mascot neutral
Relaunch with experiments

Migrating is the cheapest opportunity you will ever have to check whether your personalization strategy was earning its keep. Rather than switching each experience back on and assuming it still works, run it against your default content as an experiment. Some experiences will turn out to have been neutral, and finding that out now costs nothing.

Review and publish

Before you let the experiments run, confirm that everything behaves as expected:

  1. Preview each variant

    Use preview mode to render the page as a member of each audience.

  2. Confirm that firmographic data is arriving

    Check that company attributes appear on visitor profiles before relying on them in an audience.

  3. Confirm that the content is in the HTML

    View the page source, or disable JavaScript, and check that the personalized content is in the initial response.

  4. Confirm that goals are firing

    Complete the conversion yourself and check that the event appears with the correct goal.

What does not carry over

Keep these differences in mind when planning the work:

  • We personalize the components connected to slots, not arbitrary elements on a live page, so there is no element-level visual editing.
  • We still do not support the creation of one-to-one outbound pages built from CRM records or CSV uploads for named accounts. We personalize for firmographic audiences rather than per-contact pages.

Troubleshooting

SymptomLikely cause
Company attributes missing from profilesThe provider’s tag is not firing, or the integration is not enabled. Verify that the provider resolves the visitor first.
Account-based experience does not trigger on the first pageviewExpected. Firmographic providers resolve after the initial request, so target the first impression on campaign, referrer, or location instead.
Wrong variant for a visitor matching two audiencesThe audience priority is not set. Define the order explicitly.
All visitors see the same contentThe route is statically generated. Confirm that the component calls fetchContent and renders dynamically. See Prerendering.
Content flashes before updatingThe slot is rendering on the client. Move it to a server-side fetch.
Exposures recorded, but no conversionsThe goal in the experiment does not match the goalId in your event.
Fallback content appears in productionContent requests are failing. Check the application credentials and the timeout option.