← All migration guides
Easy 30-60 minutes

Migrate from Split.io

Move your feature flags and experiments from Split.io to ShipSilently. Simpler SDK, transparent pricing, and edge-native flag evaluation.

Overview

Split.io uses “splits” and “treatments” to evaluate feature flags. ShipSilently maps these concepts directly: a split becomes a flag, and the “on” treatment becomes a true evaluation. This guide covers replacing the Split SDK while keeping your application behavior identical.

Before you begin

  • You have an existing Split.io workspace with splits in production
  • You have a ShipSilently account (create one free)
  • Your application uses the Split Node.js or browser SDK

Step 1: Set up your ShipSilently project

  1. Sign in to ShipSilently and create a new project.
  2. ShipSilently creates production and development environments automatically.
  3. Copy your API key from Settings → API Keys.

Step 2: Map your splits to flags

In Split.io, every split has a name and returns a treatment (a string like "on", "off", or a custom value). ShipSilently flags are boolean by default.

For each split:

  • Boolean splits (on/off) → create a ShipSilently flag with the same name
  • Multivariate splits → use ShipSilently’s variant flag type, with each treatment as a variant

Tip: Most teams use on/off boolean splits. Keep your flag keys identical to your split names to minimize code changes.

Step 3: Replace the SDK

# Remove Split SDK
npm uninstall @splitsoftware/splitio

# Install ShipSilently
npm install @shipsilently/node

Step 4: Update initialization

Before (Split.io):

import SplitIO from '@splitsoftware/splitio';

const factory = SplitIO.SplitFactory({
  core: {
    authorizationKey: process.env.SPLIT_API_KEY,
  },
});

const client = factory.client();
await new Promise((resolve) => client.on(client.Event.SDK_READY, resolve));

After (ShipSilently):

import { initialize } from '@shipsilently/node';

export const flags = initialize(process.env.SHIPSILENTLY_KEY);

Step 5: Update flag evaluations

Before (Split.io):

const treatment = client.getTreatment(user.id, 'new-checkout');
const showNewCheckout = treatment === 'on';

After (ShipSilently):

const showNewCheckout = await flags.getFlag('new-checkout', {
  userId: user.id,
  email: user.email,
  plan: user.plan,
});

API comparison

Split.ioShipSilently
client.getTreatment(key, split)flags.getFlag(flagKey, context)
Returns a string ('on' / 'off')Returns a boolean
User identity as plain stringContext is a rich object
client.destroy() to flushNo cleanup required
Attributes as third argumentAttributes inside context object

Multivariate flags

If you use Split’s multivariate treatments, use getFlag with variant support:

Before (Split.io):

const treatment = client.getTreatment(userId, 'checkout-variant');
// treatment is 'control' | 'v1' | 'v2'

After (ShipSilently):

const variant = await flags.getVariant('checkout-variant', {
  userId: user.id,
});
// variant is 'control' | 'v1' | 'v2'

Step 6: Set your environment variable

# Remove
SPLIT_API_KEY=xxxx

# Add
SHIPSILENTLY_KEY=ss-live-xxxx

Step 7: Verify and cut over

  1. Deploy to staging with your ShipSilently key
  2. Verify flag evaluations appear in the ShipSilently dashboard under Analytics
  3. Compare evaluation results with Split.io during an overlap period if you need extra confidence
  4. Switch production traffic and decommission the Split SDK

What’s next

  • Read the ShipSilently SDK docs
  • Configure targeting rules and rollout percentages in the dashboard
  • Explore the REST API for CI/CD and server-side integrations

Ready to start your migration?

Create a free ShipSilently account and have your first flag live in minutes.