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
- Sign in to ShipSilently and create a new project.
- ShipSilently creates
productionanddevelopmentenvironments automatically. - 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/offboolean 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.io | ShipSilently |
|---|---|
client.getTreatment(key, split) | flags.getFlag(flagKey, context) |
Returns a string ('on' / 'off') | Returns a boolean |
| User identity as plain string | Context is a rich object |
client.destroy() to flush | No cleanup required |
| Attributes as third argument | Attributes 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
- Deploy to staging with your ShipSilently key
- Verify flag evaluations appear in the ShipSilently dashboard under Analytics
- Compare evaluation results with Split.io during an overlap period if you need extra confidence
- 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.