Migrate from Optimizely Feature Flags
Move your feature flags from Optimizely Feature Experimentation (formerly Rollout) to ShipSilently. Developer-first SDK, no complex decision service, and a simpler API.
Overview
Optimizely Feature Experimentation (formerly Optimizely Feature Flags / Rollout) is a powerful platform with a more complex API centered around experiments, variations, and a decision service. ShipSilently focuses on developer experience — simpler initialization, in-memory evaluation, and a clean context-based API.
Before you begin
- You have an existing Optimizely Feature Experimentation project with flags/experiments in production
- You have a ShipSilently account (create one free)
- Your application uses the Optimizely Node.js or JavaScript SDK
Step 1: Set up your ShipSilently project
- Sign in to ShipSilently and create a new project.
- Copy your API key from Settings → API Keys.
Step 2: Map Optimizely concepts to ShipSilently
| Optimizely | ShipSilently |
|---|---|
| Feature Flag | Flag |
| Feature Variable | Flag variant |
| Experiment | Flag with percentage rollout |
| Audience | Targeting rule |
| User ID | userId in context |
| User Attributes | Context object fields |
| Datafile | Managed automatically |
Step 3: Recreate your flags
For each Optimizely feature flag:
- Create a flag in ShipSilently with the same key
- Recreate audience conditions as targeting rules (e.g.,
plan === 'enterprise',country === 'US') - For feature variables, use ShipSilently variant flags
Step 4: Replace the SDK
# Remove Optimizely SDK
npm uninstall @optimizely/optimizely-sdk
# Install ShipSilently
npm install @shipsilently/node
Step 5: Update initialization
Before (Optimizely):
import { createInstance } from '@optimizely/optimizely-sdk';
const optimizely = createInstance({
sdkKey: process.env.OPTIMIZELY_SDK_KEY,
});
await optimizely.onReady();
After (ShipSilently):
import { initialize } from '@shipsilently/node';
export const flags = initialize(process.env.SHIPSILENTLY_KEY);
Step 6: Update flag evaluations
Before (Optimizely):
const isEnabled = optimizely.isFeatureEnabled(
'new-checkout',
user.id,
{ plan: user.plan, country: user.country }
);
After (ShipSilently):
const isEnabled = await flags.getFlag('new-checkout', {
userId: user.id,
plan: user.plan,
country: user.country,
});
API comparison
| Optimizely | ShipSilently |
|---|---|
optimizely.isFeatureEnabled(key, userId, attrs) | flags.getFlag(key, context) |
optimizely.getFeatureVariable(key, varKey, userId, attrs) | flags.getVariant(key, context) |
optimizely.getEnabledFeatures(userId, attrs) | flags.getAllFlags(context) |
Requires datafile fetch + onReady() | In-memory evaluation after initial sync |
Step 7: Feature variables migration
Optimizely’s feature variables allow attaching configuration values to features. Use ShipSilently variant flags for the same capability.
Before (Optimizely):
const headerColor = optimizely.getFeatureVariable(
'redesign',
'header_color',
user.id,
{ plan: user.plan }
); // '#00E5FF'
After (ShipSilently):
const headerColor = await flags.getVariant('redesign-header-color', {
userId: user.id,
plan: user.plan,
}); // '#00E5FF'
Step 8: Set your environment variable
# Remove
OPTIMIZELY_SDK_KEY=xxxx
# Add
SHIPSILENTLY_KEY=ss-live-xxxx
Step 9: Verify and cut over
- Deploy to staging with
SHIPSILENTLY_KEY - Verify all flags evaluate as expected in the ShipSilently Analytics view
- Run any A/B experiment segments through the new SDK to confirm targeting parity
- Deploy to production, remove the Optimizely SDK, and revoke your Optimizely credentials
What’s next
- Read the ShipSilently SDK docs
- Set up percentage rollouts and A/B targeting in the dashboard
- Use the REST API to automate flag management in your deployment pipeline
Ready to start your migration?
Create a free ShipSilently account and have your first flag live in minutes.