Step-by-step guide to migrating your feature flags from LaunchDarkly to Flaggr
Last updated March 15, 2026
Migrate from LaunchDarkly
This guide walks you through migrating feature flags from LaunchDarkly to Flaggr.
Concept Mapping
| LaunchDarkly | Flaggr | Notes |
|---|---|---|
| Project | Project | 1:1 mapping |
| Environment | Environment | Same concept |
| Feature flag | Flag | Same concept |
| Context kind | Targeting context | Flaggr uses flat key-value context |
| Segment | Cohort | Rule-based or static audience |
| Targeting rule | Targeting rule | Similar operator set |
| Percentage rollout | Percentage rollout | Deterministic hashing |
| Experiment | Experiment | Both support A/B testing |
| Relay Proxy | Self-hosted instance | Run Flaggr on your infra |
Step 1: Export Flags from LaunchDarkly
Use the LaunchDarkly API to export your flag configurations:
curl -s -H "Authorization: YOUR_LD_API_KEY" \
"https://app.launchdarkly.com/api/v2/flags/YOUR_PROJECT" | jq '.items'Step 2: Create a Flaggr Project
- Sign in at flaggr.dev/console
- Create a new project matching your LaunchDarkly project
- Create services for each application that evaluates flags
Step 3: Map Flag Types
| LaunchDarkly Type | Flaggr Type |
|---|---|
| Boolean | boolean |
| String | string |
| Number | number |
| JSON | object |
| Multivariate | Use variants on any type |
Step 4: Import Flags
Use the Flaggr import API or the dashboard import feature:
# Export from Flaggr format
curl -s -H "Authorization: Bearer flg_your_token" \
"https://flaggr.dev/api/flags/export?serviceId=YOUR_SERVICE" > flags.json
# Or create flags via API
curl -X POST https://flaggr.dev/api/flags \
-H "Authorization: Bearer flg_your_token" \
-H "Content-Type: application/json" \
-d '{
"key": "checkout-v2",
"name": "Checkout V2",
"type": "boolean",
"defaultValue": false,
"serviceId": "YOUR_SERVICE",
"projectId": "YOUR_PROJECT"
}'Step 5: Migrate Targeting Rules
LaunchDarkly targeting rules map to Flaggr targeting rules:
// LaunchDarkly rule
{
"clauses": [
{ "attribute": "plan", "op": "in", "values": ["enterprise", "pro"] }
],
"variation": 0
}
// Flaggr equivalent
{
"conditions": [
{ "attribute": "plan", "operator": "in", "value": ["enterprise", "pro"] }
],
"value": true
}Operator Mapping
| LaunchDarkly | Flaggr |
|---|---|
in | in |
endsWith | ends_with |
startsWith | starts_with |
matches | regex |
contains | contains |
lessThan | less_than |
greaterThan | greater_than |
before | before |
after | after |
segmentMatch | in_cohort |
Step 6: Update SDK Integration
Before (LaunchDarkly)
import * as ld from 'launchdarkly-js-client-sdk'
const client = ld.initialize('YOUR_CLIENT_ID', { key: 'user-123' })
await client.waitForInitialization()
const value = client.variation('checkout-v2', false)After (Flaggr)
import { createFlaggr } from '@flaggr/sdk'
const client = createFlaggr({
serviceId: 'web-app',
apiKey: 'flg_your_token',
})
const value = await client.getBooleanValue('checkout-v2', false, {
targetingKey: 'user-123',
})Step 7: Parallel Running
Run both systems in parallel during migration:
// Evaluate from both, log discrepancies
const ldValue = ldClient.variation('checkout-v2', false)
const flaggrValue = await flaggrClient.getBooleanValue('checkout-v2', false)
if (ldValue !== flaggrValue) {
console.warn('Flag mismatch', { flag: 'checkout-v2', ld: ldValue, flaggr: flaggrValue })
}
// Use Flaggr value (or LD during transition)
return flaggrValueStep 8: Decommission LaunchDarkly
Once all flags are migrated and verified:
- Remove LaunchDarkly SDK dependencies
- Delete LaunchDarkly environment variables
- Cancel LaunchDarkly subscription