Actiknow
Custom Software Development

Feature Flags in Custom Software: How to Release Changes Without an All-or-Nothing Deployment

Learn how feature flags enable staged software releases, customer-specific access, safer rollbacks and governance without creating permanent technical debt.

A deployment does not have to be a launch. A team can place new code in production while keeping the customer-facing behavior disabled, then expose it to a small, deliberate audience. That separation is the practical value of feature flags. For a business that depends on custom software, it changes a release from a single high-stakes event into a sequence of decisions that can be measured and, in many cases, reversed.

Feature flags are not a substitute for testing, sound architecture or disciplined operations. They add a control surface that must be designed and governed. Used well, they reduce the blast radius of a change. Used carelessly, they create hidden combinations of behavior, inconsistent customer experiences and a growing backlog of obsolete switches.

This guide explains where flags belong in custom applications, how to stage a rollout, what a rollback can and cannot undo, and how engineering and business owners should manage the flag lifecycle.

Contents hide

Why deployment and release should be separate decisions

Deployment means distributing a version of the application or service to an environment. Release means allowing users or processes to experience a capability. In a traditional release, these events happen together: the new build goes live and everyone immediately sees the new behavior. That approach may be acceptable for small, low-risk changes, but it concentrates risk when a feature affects payments, orders, operational workflows or important customer accounts.

With a feature flag, the deployed application contains both a new path and a controlled way to decide when that path is active. A flag service, configuration store or application-side evaluator supplies the decision. The code still needs to be deployed, but the exposure decision can be changed without another build when the implementation and infrastructure support it. Microsoft’s feature management overview describes this separation, including targeted release and gradual exposure.

The business advantage is not merely that engineers can switch something off. Product owners can choose who receives a capability, support teams can prepare selected customers, and operations can observe actual behavior before expanding access. The release plan becomes an explicit, reviewable business decision rather than an implicit side effect of deployment.

What feature flags should control

Release flags are temporary switches around a new feature or replacement implementation. For example, a new invoice approval screen can be deployed but enabled only for internal testers, then a pilot customer group, then everyone. The intended end state is usually one code path, with the temporary flag removed.

Operational or kill-switch flags are longer-lived controls for capabilities that may need emergency disabling. Examples include a resource-intensive export or a nonessential third-party enrichment call. They require clear default behavior, on-call ownership and periodic exercises to confirm the switch actually works.

Experiment flags expose different experiences to deliberately assigned cohorts so teams can compare outcomes. They require consistent assignment, appropriate measurement and a defined experiment end date. A rollout is not automatically a valid A/B test: measuring causality needs a suitable design, adequate sample and attention to confounding factors.

Entitlement controls determine whether a customer is contractually allowed to use a capability. These are often long-lived, but they should not be confused with temporary release flags. A subscription plan, permission or purchased add-on belongs in an authoritative entitlement model; a rollout flag can temporarily restrict exposure to an entitled audience.

Migration flags can route work between an old and new implementation while data, integrations or services are being transitioned. They need additional safeguards because the two paths may not produce identical side effects. The LaunchDarkly guide to flag types distinguishes temporary release and migration flags from longer-lived operational and entitlement controls.

A practical rule: if the business would still need the decision after the rollout is complete, it probably belongs in configuration, entitlement or policy rather than an endlessly retained release flag.

A five-stage rollout that operations can actually run

Stage 1: Deploy dark

Put the new code into production with the flag off by default. Confirm the old workflow still works. Check that the disabled path does not unexpectedly create database writes, background jobs, external API calls or UI elements. Record the deployed version, the flag key, owner and planned exposure sequence.

Stage 2: Internal access

Enable the feature for named employees or test accounts with production-like permissions. Validate the full workflow, not just the new screen. For an order feature, test creation, cancellation, notifications, refunds, reporting and support tooling. Internal testers may not reproduce real customer data or load, so passing this stage is necessary but not sufficient.

Stage 3: Pilot accounts

Select a small set of customers who can be supported closely. Define why those customers are suitable and what they have agreed to try. In multi-tenant products, customer-account targeting is often safer than a random fraction of individual users, because a workflow may require everyone within an account to see the same state.

Stage 4: Controlled expansion

Increase exposure in predetermined steps, for example 5%, 20%, 50% and 100% of eligible accounts. These percentages are illustrative, not universal thresholds. Between steps, inspect both technical health and business outcomes. Expand only after the agreed observation window and exit criteria are satisfied.

Stage 5: Stabilize and remove

Once the feature is the default, verify the old path is no longer needed, remove the temporary flag and obsolete code, and complete regression testing. Archiving a flag in a dashboard does not itself remove its conditional branches from the application. Cleanup is part of the release, not optional housekeeping.

For each stage, define the approver, activation time, target audience, monitoring window, stop condition, rollback action and communication owner. A rollout without those decisions is simply a sequence of uncoordinated toggles.

Customer-specific enablement: decide what the unit of rollout is

The most consequential targeting choice is often whether to expose a feature by user, account, organization, region, device or transaction. A user-level percentage can work for a cosmetic interface change. It can be dangerous for an account-wide workflow in which one employee sees the new approval process and another sees the old one.

For B2B SaaS, start by asking whether the feature changes shared records, team permissions, financial calculations or collaboration. If it does, use a stable tenant or organization identifier as the targeting key unless there is a strong reason not to. Keep the decision consistent across the frontend, API, workers and integrations. An account should not be shown a new workflow in the browser while its background jobs still run the old one.

A deterministic assignment avoids users bouncing between experiences on successive requests. The OpenFeature evaluation-context specification explains how targeting keys and context attributes support rule-based and fractional evaluation. In implementation, use trusted server-side context for tenant identity and eligibility rather than accepting arbitrary client-supplied values.

Document precedence explicitly. For example: global emergency disable overrides all; regulatory or geographic exclusions come next; entitlement checks follow; named pilot accounts are next; then percentage rollout; and finally the default state. Different products may require a different order, but ambiguity is unacceptable. Test conflicts between rules, not just each rule individually.

Design the technical architecture around failure behavior

A flag is a runtime dependency. Decide whether evaluation happens in the application process, at a service boundary or in the browser. Server-side evaluation is preferable when the decision protects sensitive operations or controls expensive side effects. Client-side flags can help with presentation, but they are not security controls: browser code and network responses can be inspected or manipulated.

A robust implementation needs a central registry, environment-specific configuration, SDK or evaluation abstraction, consistent identity context, change audit history and observability. Teams building custom web application development projects should decide these boundaries during architecture design rather than adding scattered Boolean checks after the codebase has grown.

Flag naming should communicate purpose, such as billing.new_invoice_review.release, not a vague name such as newFeature2. Each entry should include a description, owner, flag type, creation date, default, affected services, dependencies, expiration or review date, and a link to the work item. Names should remain stable because they appear in code, logs and deployment records.

Define what happens when the flag provider is unreachable. A cached last-known value can preserve continuity, but it can also keep a recently disabled feature enabled. A conservative default may be appropriate for risky writes, yet disabling a critical read path could create an outage. Choose fallback behavior by flag and failure mode; test it under network loss, stale caches and partial service recovery.

If flags are evaluated at several layers, ensure changes propagate within a documented interval. Otherwise a UI can advertise a feature that an API rejects, or a worker can process records differently from the service that created them. For high-risk operations, evaluate the decision at the authoritative execution boundary and include the resulting variant in diagnostic events.

Security and data consistency cannot be toggled away

Feature flags must not grant access that the authorization layer denies. A user who guesses a hidden endpoint must still fail permission checks. Entitlement data should remain authoritative even if a rollout flag says a feature is enabled. Treat flag-editing permissions as production privileges, with least access, change history and approval controls for sensitive switches.

Database migrations need particular care. A flag can route code to an old or new query path, but it cannot make an incompatible schema change instantly reversible. Prefer expand-and-contract migrations: introduce backward-compatible schema changes, deploy readers and writers that tolerate both forms, migrate or backfill data, then remove the old representation only after validation.

For irreversible side effects, a kill switch prevents future actions but does not undo completed ones. A payment already captured, an email already sent or a record already exported needs compensation or reconciliation. Describe rollback as a combination of stopping new exposure, restoring compatible behavior and repairing effects where necessary.

A useful preflight question is: if we turn the flag off at 14:03, what happens to requests already in flight, queued jobs, partially written records and customers who began a workflow at 14:02? If the answer is unknown, the feature is not ready for a high-risk progressive release.

Test the combinations that matter, not every theoretical combination

Flags increase the number of possible application states. Ten independent binary flags imply 1,024 theoretical combinations, but testing all of them may be neither feasible nor valuable. Prioritize combinations that share data, call the same services or change a critical business outcome.

At minimum, test the disabled path, enabled path, transitions in both directions, conflicting targeting rules, missing identity context, provider outage, stale cache and cross-service consistency. Include authorization tests for both variants. Test migrations and asynchronous jobs with records created before and after activation.

Contract and integration tests should assert that downstream systems receive valid data in either supported path. Performance tests should check whether the enabled cohort increases database load, queue depth or external API usage. The business acceptance test should verify outcomes such as correct invoice totals or completed approvals, not just the absence of exceptions.

Do not use a production rollout as the first meaningful test. Production observations complement automated tests and staging, especially where real traffic and real integrations differ from test environments. They do not replace them.

Observe both software health and business health

Technical telemetry should distinguish flag variants and, where privacy and cardinality permit, rollout cohorts. Track error rate, latency, timeout rate, saturation, queue age, integration failures and resource consumption. For a new checkout flow, a healthy API response time is insufficient if payment completion drops or duplicate orders rise.

Business telemetry depends on the feature: approval completion rate, time to complete a task, abandoned workflow rate, support contacts, conversion, billing discrepancies or manual interventions. Define a baseline and expected direction before enabling the flag. Separate pilot accounts from the general population when interpreting changes; early adopters may not represent all customers.

A practical rollout scorecard records: exposure percentage; number of eligible accounts; number actually exposed; critical error rate; p95 latency for affected endpoints; workflow success rate; customer-reported issues; reconciliation exceptions; and the decision to expand, hold or disable. Select only metrics relevant to the feature. Do not bury the decision in dozens of unrelated dashboards.

Guardrails need thresholds and owners. For example, the release plan might pause if the new variant shows a sustained increase in failed invoice submissions versus its baseline, even when system-wide error rate is unchanged. Thresholds should be based on business tolerance and baseline variability, not copied from another organization.

Rollback is a procedure, not a promise

A successful flag rollback should have a named operator, a tested control path, a known propagation time and an expected customer impact. Keep an emergency override independent of ordinary rollout targeting where possible. Record who changed the state, why, when and which environments were affected.

Run a controlled rollback exercise before a major launch. Confirm that the old path still works, new requests stop entering the risky path, background workers honor the intended decision, and support teams know what customers will see. Check whether cached clients or mobile app versions continue using the old flag state after the server changes.

Some releases are only partially reversible. If the new path has already written data that the old code cannot read, disabling the flag may make matters worse. This is why schema compatibility, forward fixes, compensation and incident response must be designed alongside the flag.

For especially sensitive features, a rollback plan should state three distinct actions: stop new exposure; preserve or reconcile in-flight operations; and restore a known-good customer experience. The flag may accomplish only the first action.

Governance: make every flag accountable

The main long-term failure mode is flag debt. A temporary switch survives the rollout, new code is built around it, and eventually nobody remembers whether it can be removed. The application accumulates branches that complicate testing, debugging and incident response.

Maintain a small flag register with owner, type, affected services, risk tier, current state by environment, rollout ticket, review date and cleanup criterion. Review temporary flags during sprint planning or release reviews. An overdue temporary flag should trigger a decision: remove it, extend it with justification, or formally reclassify it as a permanent operational control.

Separate permissions for creating a flag, changing production targeting and approving a high-risk release. For payment, privacy or regulatory workflows, require a second reviewer for production changes. Ensure emergency responders can act quickly under a documented break-glass process with retrospective review.

Retirement requires code removal, test updates, documentation cleanup and verification that no service still evaluates the old key. Do not delete a live flag definition before removing or updating every caller. The cleanup task should be tracked with the same seriousness as the initial implementation.

Illustrative example: introducing a new approval workflow

Consider a fictional B2B operations platform replacing a two-step purchase approval process with a configurable approval chain. The company wants to pilot it with five customer organizations while protecting the existing workflow. This is an architecture illustration, not an Actiknow case study or a claim about measured results.

The team deploys the new interface, API validation and approval-state transitions behind purchase.approval_v2.release. The flag defaults to off. A separate entitlement check ensures only authorized users can approve purchases, regardless of rollout state. A stable organization ID determines whether the new workflow is active.

Before activation, the team verifies that requests created under the old process can still be completed, that pending approvals do not change meaning when the flag changes, and that notification jobs use a workflow version stored on each request. The latter is important: reevaluating the current flag halfway through an in-flight approval could move a request into an incompatible state.

The pilot begins with internal test organizations, then the five selected customer organizations. The team monitors approval completion, time to decision, failed transitions, duplicate notifications and support requests. If an issue appears, it stops new requests from entering the new flow while allowing existing versioned requests to finish or be handled through a documented recovery process.

After a stable rollout to all eligible organizations, the team migrates remaining legacy requests, removes the old path and deletes the temporary release flag. This example shows why a feature flag is most effective when paired with explicit workflow versioning and recovery design.

A four-week adoption plan for a custom software team

Week 1

Choose one bounded feature with a clear business outcome and a reversible path. Identify the release owner, technical owner, target cohort, acceptance criteria and fallback behavior. Select a managed platform or a lightweight internal solution based on audit, targeting, availability and operational requirements, not simply the number of toggles.

Week 2

Add a consistent evaluation abstraction and environment separation. Implement a flag registry, stable targeting keys, logging, permission controls and a tested default. Integrate variant-aware telemetry and create a runbook for rollout and rollback. Avoid creating a general-purpose experimentation platform before the first release needs it.

Week 3

Run automated tests and a staged pilot. Exercise disabled and enabled behavior, identity targeting, stale-cache conditions, partial outages and database compatibility. Review the scorecard with product, support and operations. Make the expand/hold/rollback decision explicit.

Week 4

Expand only if the evidence supports it. Record operational findings, resolve exceptions and document the cleanup date. Review whether the pilot reduced the practical risk of this release and whether the process was understandable to non-engineering stakeholders. Standardize the pattern only after these lessons are incorporated.

For teams planning broader custom software development and integrations, this approach embeds progressive delivery in the application architecture without making every feature dependent on an elaborate release-control program.

How leaders should evaluate success

Do not judge the program by the number of flags created. More flags may simply mean more unresolved complexity. Instead, examine the proportion of high-risk releases with a documented staged plan, the time required to disable a problematic path, the number of customer accounts affected by release incidents, the percentage of temporary flags removed on schedule, and the completeness of audit evidence.

Compare incidents and deployment patterns cautiously. A lower incident count in one quarter may reflect smaller changes or different traffic rather than a direct effect of feature flags. Review individual releases to determine whether staged exposure actually limited impact and whether the rollback mechanism worked as designed.

The executive question is simple: can the organization introduce meaningful changes to a controlled audience, know whether those changes work, and recover without exposing every customer to the same risk? If the answer is yes and the temporary controls are cleaned up, the practice is delivering value.

Common mistakes to avoid

  • Using a flag as a substitute for authorization or contractual entitlements. Release eligibility and access rights are separate decisions.
  • Applying random user-level rollout to workflows that must be consistent for an entire customer organization.
  • Assuming turning off a flag reverses database writes, payments, emails or other completed side effects.
  • Leaving old and new code paths indefinitely, with no owner or removal date.
  • Allowing every engineer to change production targeting without audit or approval.
  • Measuring only infrastructure health and missing declines in workflow completion or data correctness.
  • Deploying incompatible database changes that make the old path unusable.
  • Treating a vendor dashboard as the complete release process instead of defining owners, thresholds and recovery steps.

Frequently asked questions

What is a feature flag in custom software?

A feature flag is a runtime decision mechanism that controls which application behavior a particular user, account or process experiences. It can separate deployment from release, support targeted rollout or provide an operational switch. Its usefulness depends on sound targeting and tested fallback behavior.

Do feature flags eliminate the need to redeploy software?

No. New code still needs deployment. A properly implemented flag lets teams change exposure to code that is already deployed without rebuilding the application. Structural changes, fixes and cleanup may still require new deployments.

Are feature flags the same as configuration settings?

They overlap, but intent and lifecycle differ. A temporary release flag helps introduce a change; a permanent configuration setting controls ongoing behavior. Entitlements and security permissions need their own authoritative controls even if a flag is also present.

Can a feature flag roll back a database migration?

Not by itself. A flag may select a compatible application path, but it cannot undo irreversible schema changes or completed data writes. Use backward-compatible migrations, versioned records, reconciliation and explicit recovery procedures.

How should flags work in a multi-tenant SaaS application?

For account-wide workflows, use a stable tenant identifier and consistent evaluation across UI, API and background services. Keep subscription entitlements and authorization separate from rollout targeting. Test mixed-version and in-flight operations.

Should we build our own feature flag service?

A small, low-risk application may only need a carefully controlled configuration mechanism. More complex products may benefit from a managed service or standardized SDK, especially when they need audit trails, segmentation, resilient evaluation and multiple environments. Compare total operating responsibility, not just licensing cost.

What happens if the feature flag service is unavailable?

The application should follow a deliberately chosen fallback such as a cached value or a conservative default. The correct choice varies by feature. Test outage behavior and understand how long cached or client-side values may remain active.

How long should a release flag remain in the code?

Only as long as the rollout and stabilization require. Assign a removal owner and target date when creating it. Once the new path is fully adopted and the old path is no longer needed, remove the conditional code and retire the flag safely.

Can feature flags replace staging and QA?

No. Flags help limit production exposure and observe real usage, but they also introduce new states that must be tested. Automated tests, integration tests, security checks and staging remain essential.

What should a CTO ask before approving a flagged release?

Who is exposed first? What metrics and business outcomes will be monitored? Who can expand or disable the feature? What happens to in-flight work and data if the flag is turned off? When will the temporary flag and old code be removed?

Conclusion: control the release, not just the deployment

Feature flags make software releases more manageable when they are part of a disciplined operating model: stable targeting, reliable evaluation, measurable rollout stages, safe fallback behavior and timely cleanup. They are most valuable for changes where an all-customer launch would expose the business to unnecessary operational risk.

Actiknow’s custom solutions work covers web applications, integrations and automation, including discovery, development, testing and post-launch support. If you are planning a new customer-facing workflow or modernizing an existing application, contact Actiknow to discuss how staged releases, testing and recovery requirements can be designed into the delivery plan from the start.