Feature Flag Platforms
Build vs Buy Decision
Building a basic feature flag system takes about a week. A database table, an SDK that checks it, some caching. But basic is where most in-house solutions stop. The hard parts are targeting rules (show feature X to users in region Y with plan Z), percentage rollouts with consistent bucketing, real-time flag updates without redeployment, and audit logs. LaunchDarkly charges roughly $10/seat/month for their pro tier. Unleash is open source and self-hostable. The build-vs-buy decision usually comes down to how many engineers will use the system. Under 30 engineers, self-hosted Unleash works great. Over 100, LaunchDarkly's polish and reliability start to justify the cost.
SDK Architecture Matters
There are two models for flag evaluation. Local evaluation means the SDK downloads all flag configurations on startup and evaluates them in-process. No network call per check. This is how LaunchDarkly and Unleash work by default. Evaluation takes microseconds.
Remote evaluation means the SDK calls an API for every flag check. Split.io uses this model for some features. It's simpler to implement but adds network latency. In a request that checks 5 flags, that's 5 round trips or one batched call that still adds 10-50ms.
For platform teams building golden paths, mandate local evaluation SDKs. The performance difference compounds fast across services.
Flag Lifecycle Management
Every flag needs three things defined at creation: an owner, an expected removal date, and a description of what "fully launched" means. Without this, flags accumulate. One fintech company I worked with had 1,200 active flags and fewer than 200 were still relevant. The rest were fully launched features that nobody bothered to remove.
Build automated alerts. If a flag has been 100% enabled in production for 30 days, notify the owner. After 60 days, escalate to the team lead. Some teams use a "flag tax" where each active flag counts against the team's tech debt budget. That gets flags cleaned up fast.
Progressive Delivery Integration
Feature flags unlock progressive delivery when combined with your deployment pipeline. The pattern works like this: deploy new code behind a flag that's off in production. Enable the flag for internal users. Then 1% of external users. Monitor error rates and latency. Ramp to 10%, 50%, 100%. If anything breaks, flip the flag off instantly.
This is fundamentally different from canary deployments at the infrastructure level. A canary routes a percentage of traffic to new pods. A feature flag routes a percentage of users to new code running on all pods. Flags give you user-level granularity that infrastructure canaries can't match.
Multi-Environment Flag Management
Flags need different states across environments. A flag might be on in dev, on for QA testers in staging, and off in production. The mistake is managing each environment independently. Instead, treat flag configurations like code: changes start in dev, get promoted to staging after testing, and reach production through an approval workflow. LaunchDarkly and Unleash both support environment-aware flag management. If you're building in-house, model your flag config as a promotion pipeline, not independent environment toggles.
Key Points
- •Local SDK evaluation (flags cached client-side) adds zero latency to feature checks while remote evaluation adds a network round trip per check
- •LaunchDarkly handles 20+ trillion feature evaluations per day which proves the pattern scales, but self-hosted Unleash or Flagsmith can work at 90% lower cost
- •Stale flags are technical debt with real cost. Teams that don't enforce flag cleanup end up with 500+ flags and nobody knows which ones are safe to remove
- •Feature flags enable progressive delivery: canary releases to 1% of users, ring-based rollouts, and instant kill switches without redeployment
- •Multi-environment flag management requires a promotion workflow similar to code promotion through dev, staging, and production
Common Mistakes
- ✗Using feature flags as a permanent configuration system instead of temporary release toggles with defined expiration dates
- ✗Evaluating flags with remote API calls in hot paths which adds 10-50ms latency per evaluation without local caching
- ✗Skipping flag ownership assignment so nobody takes responsibility for cleaning up flags after features are fully launched