Variations
Variations extend feature flags beyond simple on/off switches, enabling A/B testing, multi-variant experiments, and dynamic configuration management.
What Are Variations?
Variations allow you to assign different values to users based on targeting rules. Instead of just true
/false
, you can assign any value: strings, numbers, JSON objects, or custom variants.
// Simple variation usage
const variant = getFeatureVariation('button-color', user)
// Returns: 'blue', 'green', 'red', etc.
switch (variant) {
case 'blue':
return <BlueButton />
case 'green':
return <GreenButton />
case 'red':
return <RedButton />
default:
return <DefaultButton />
}
Types of Variations
1. A/B Testing Variations
Compare two versions of a feature.
// A/B test for pricing
const variant = getFeatureVariation('pricing-test', user)
if (variant === 'control') {
showOriginalPricing()
} else if (variant === 'variant-a') {
showDiscountedPricing()
}
2. Multi-Variant Experiments
Test multiple versions simultaneously.
// Multi-variant test
const variant = getFeatureVariation('onboarding-flow', user)
switch (variant) {
case 'control':
return <OriginalOnboarding />
case 'variant-a':
return <ShortOnboarding />
case 'variant-b':
return <VideoOnboarding />
case 'variant-c':
return <InteractiveOnboarding />
default:
return <OriginalOnboarding />
}
3. Configuration Variations
Dynamic configuration values.
// Dynamic configuration
const maxRetries = getFeatureVariation('max-retries', user)
const timeout = getFeatureVariation('api-timeout', user)
const theme = getFeatureVariation('app-theme', user)
// Use the values
apiClient.setTimeout(timeout)
apiClient.setMaxRetries(maxRetries)
app.setTheme(theme)
4. Content Variations
Dynamic content delivery.
// Content variations
const welcomeMessage = getFeatureVariation('welcome-message', user)
const buttonText = getFeatureVariation('cta-button-text', user)
return (
<div>
<h1>{welcomeMessage}</h1>
<button>{buttonText}</button>
</div>
)
Creating Variations
In the Dashboard
- Navigate to Features in your DarkFeature dashboard
- Click “Create Feature”
- Choose “Variation” as the type
- Define your variants:
- Control:
"original"
- Variant A:
"new-design"
- Variant B:
"minimal-design"
- Control:
Variation Configuration
{
"name": "button-design-test",
"type": "variation",
"variants": {
"control": {
"value": "original",
"weight": 25
},
"variant-a": {
"value": "new-design",
"weight": 25
},
"variant-b": {
"value": "minimal-design",
"weight": 25
},
"variant-c": {
"value": "bold-design",
"weight": 25
}
},
"targeting": {
"rules": [
{
"attribute": "user.country",
"operator": "in",
"value": ["US", "CA", "UK"]
}
]
}
}
A/B Testing with Variations
Setting Up an A/B Test
// Define your experiment
const experiment = {
name: 'pricing-page-test',
variants: ['control', 'variant-a', 'variant-b'],
metrics: ['conversion-rate', 'revenue-per-user'],
duration: '2 weeks',
}
// Track experiment exposure
df.track('experiment-exposed', {
experiment: 'pricing-page-test',
variant: variant,
userId: user.userId,
})
Measuring Results
// Track conversion events
df.track('conversion', {
experiment: 'pricing-page-test',
variant: variant,
userId: user.userId,
revenue: 99.99,
timestamp: Date.now(),
})
Statistical Significance
// Check if results are statistically significant
const results = await df.getExperimentResults('pricing-page-test')
if (results.isSignificant) {
console.log(`Winner: ${results.winner}`)
console.log(`Confidence: ${results.confidence}%`)
} else {
console.log('Need more data for statistical significance')
}
Advanced Variation Strategies
Progressive Rollout
// Gradually increase variant exposure
const rolloutPercentage = getFeatureVariation('rollout-percentage', user)
if (rolloutPercentage <= 10) {
// 10% of users see new variant
return <NewVariant />
} else {
// 90% see control
return <ControlVariant />
}
User Segmentation
// Different variants for different user segments
const userSegment = getUserSegment(user)
const variant = getFeatureVariation('personalized-content', {
...user,
segment: userSegment,
})
switch (variant) {
case 'new-user':
return <NewUserContent />
case 'returning-user':
return <ReturningUserContent />
case 'premium-user':
return <PremiumUserContent />
default:
return <DefaultContent />
}
Geographic Variations
// Location-based variations
const variant = getFeatureVariation('localized-content', {
...user,
country: user.country,
language: user.language,
})
// Different content for different regions
if (variant === 'us-english') {
return <USEnglishContent />
} else if (variant === 'uk-english') {
return <UKEnglishContent />
} else if (variant === 'spanish') {
return <SpanishContent />
}
Best Practices
Variant Naming
// ✅ Good naming
'control'
'variant-a'
'variant-b'
'new-design'
'minimal-layout'
// ❌ Avoid
'v1'
'test'
'new'
'better'
Weight Distribution
// Equal distribution (recommended for A/B tests)
{
"control": { "weight": 25 },
"variant-a": { "weight": 25 },
"variant-b": { "weight": 25 },
"variant-c": { "weight": 25 }
}
// Unequal distribution (for gradual rollouts)
{
"control": { "weight": 90 },
"variant-a": { "weight": 10 }
}
Statistical Significance
// Ensure adequate sample size
const minSampleSize = 1000 // per variant
const experimentDuration = '2 weeks'
// Monitor statistical significance
const results = await df.getExperimentResults('my-test')
if (results.sampleSize < minSampleSize) {
console.log('Need more data')
}
Cleanup Strategy
// Remove old variants after experiment
if (variant === 'deprecated-variant') {
// Fallback to control
return <ControlVariant />
}
Performance Considerations
Caching Variations
// Variations are cached like flags
const variant = await df.getFeatureVariation('my-test', user)
// Subsequent calls are fast
const sameVariant = await df.getFeatureVariation('my-test', user)
// Returns cached result
Batch Evaluation
// Evaluate multiple variations at once
const variations = await df.evaluateMultipleVariations(
['button-test', 'pricing-test', 'layout-test'],
user,
)
// Use results
const buttonVariant = variations['button-test']
const pricingVariant = variations['pricing-test']
Monitoring and Analytics
Variation Exposure Tracking
// Track when users see variations
df.track('variation-exposed', {
featureKey: 'button-test',
variant: variant,
userId: user.userId,
timestamp: Date.now(),
})
Conversion Tracking
// Track conversions per variant
df.track('conversion', {
featureKey: 'pricing-test',
variant: variant,
userId: user.userId,
revenue: 99.99,
conversionType: 'purchase',
})
Performance Metrics
// Track performance per variant
df.track('performance', {
featureKey: 'new-ui',
variant: variant,
userId: user.userId,
loadTime: 1200,
errorRate: 0.01,
})
Next Steps
- Targeting Rules - Learn about advanced targeting
- Analytics & Metrics - Measure experiment performance
- Best Practices - Implementation guidelines
- Client-Side SDKs - Integrate variations in web apps
Last updated on