<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Delivery &amp; platform &#8211; Product Blueprint</title>
	<atom:link href="https://product-blueprint.com/category/delivery-platform/feed/" rel="self" type="application/rss+xml" />
	<link>https://product-blueprint.com</link>
	<description>Strategy, JTBD &#38; Roadmaps for Real Results</description>
	<lastBuildDate>Sat, 30 Aug 2025 17:48:41 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://product-blueprint.com/wp-content/uploads/2025/08/ChatGPT-Image-Aug-24-2025-11_19_26-PM-e1756056169662-150x150.png</url>
	<title>Delivery &amp; platform &#8211; Product Blueprint</title>
	<link>https://product-blueprint.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Feature Flags: A Complete Guide to Implementing Dynamic Application Control</title>
		<link>https://product-blueprint.com/feature-flags/</link>
					<comments>https://product-blueprint.com/feature-flags/#respond</comments>
		
		<dc:creator><![CDATA[Rashdi Chowdhury]]></dc:creator>
		<pubDate>Tue, 22 Oct 2024 17:47:00 +0000</pubDate>
				<category><![CDATA[Delivery & platform]]></category>
		<guid isPermaLink="false">https://product-blueprint.com/feature-flags/</guid>

					<description><![CDATA[TL;DR Feature flags let us turn code on and off for specific users without redeploying our application. We&#8230;]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">TL;DR</h2>



<p class="wp-block-paragraph"><strong>Feature flags</strong> let us turn code on and off for specific users without redeploying our application.</p>



<p class="wp-block-paragraph">We use <strong>dark launches</strong> and <strong>staged rollouts</strong> to minimize risk. Start with 5% of users, then move to 25%, 50%, and finally 100%.</p>



<p class="wp-block-paragraph">We track <strong>one primary outcome</strong> and a few guardrails. We set clear <strong>stop and rollback rules</strong> before we start.</p>



<p class="wp-block-paragraph">Every flag needs an <strong>owner, purpose, expiry date, and cleanup plan</strong>. This keeps flag debt from piling up.</p>



<p class="wp-block-paragraph">We pair flags with ethics considerations like privacy, accessibility, and non-manipulative growth practices.</p>



<h2 class="wp-block-heading">Key definitions (one line each)</h2>



<p class="wp-block-paragraph"><strong>Feature flag (toggle):</strong> A runtime switch that controls who sees a feature by percentage or rule.</p>



<p class="wp-block-paragraph"><strong>Dark launch:</strong> Ship the code behind a flag at 0% exposure to test in production safely.</p>



<p class="wp-block-paragraph"><strong>Staged rollout:</strong> Increase exposure in steps like 5%→25%→50%→100%.</p>



<p class="wp-block-paragraph"><strong>Kill switch:</strong> A flag that instantly disables a risky component when problems occur.</p>



<p class="wp-block-paragraph"><strong>Targeting rule:</strong> Conditions that decide exposure based on factors like plan, region, or device type.</p>



<p class="wp-block-paragraph"><strong>Guardrail metric:</strong> A &#8220;do no harm&#8221; signal that tracks error rates, accessibility defects, or complaint rates.</p>



<p class="wp-block-paragraph"><strong>Experiment flag:</strong> A flag that splits traffic for A/B tests with sticky assignment to users.</p>



<h2 class="wp-block-heading">Why PMs should care</h2>



<p class="wp-block-paragraph">Flags turn launches into controlled experiments. We learn faster and reduce risk without waiting for deployments.</p>



<p class="wp-block-paragraph">Poor governance creates <strong>flag debt</strong> and confusing user experiences. We need clear owners, metrics, guardrails, and cleanup processes to avoid compliance headaches.</p>



<h2 class="wp-block-heading">Step-by-step playbook</h2>



<h3 class="wp-block-heading">1) Choose the right flag type</h3>



<p class="wp-block-paragraph">We pick flag types based on what we need. <strong>Release flags</strong> are for normal staged rollouts in continuous delivery.</p>



<p class="wp-block-paragraph"><strong>Experiment flags</strong> help when we want causal evidence through A/B testing. <strong>Ops flags</strong> work as kill switches for high-risk systems like payments.</p>



<p class="wp-block-paragraph"><strong>Permission flags</strong> gate features by user plan or role. We document permission flags carefully to avoid logic sprawl.</p>



<h3 class="wp-block-heading">2) Define success and safety</h3>



<p class="wp-block-paragraph">We set one <strong>primary metric</strong> that should move. For example, activation increases by 2 percentage points in 14 days.</p>



<p class="wp-block-paragraph">We establish 3-5 guardrails like error rate, crash-free percentage, and latency. Clear stop rules guide rollback decisions.</p>



<p class="wp-block-paragraph">If error rate exceeds 0.5% for 10 minutes, we roll back immediately.</p>



<h3 class="wp-block-heading">3) Pick the rollout path</h3>



<p class="wp-block-paragraph">Our feature rollout follows this path: <strong>dark launch at 0%</strong> → internal only → 5% → 25% → 50% → 100%.</p>



<p class="wp-block-paragraph">We start with low-risk cohorts like new users or one region. We keep a 5-10% hold-back group as control when measuring lift in progressive delivery.</p>



<h3 class="wp-block-heading">4) Instrument before exposure</h3>



<p class="wp-block-paragraph">We log <strong>exposure events</strong> with user ID, flag name, variant, and timestamp. Success and guardrail events use the same user ID for accurate tracking.</p>



<p class="wp-block-paragraph">We check dashboards and alerts at 0% before starting feature management. This helps us avoid measurement issues later.</p>



<h3 class="wp-block-heading">5) Launch and monitor per step</h3>



<p class="wp-block-paragraph">We verify exposures, primary metrics, guardrails, and support tickets at each step. Each step runs long enough for stable signals.</p>



<p class="wp-block-paragraph">Error rates stabilize in hours. User behavior changes take days. We move forward only when all checks pass.</p>



<h3 class="wp-block-heading">6) Decide quickly</h3>



<p class="wp-block-paragraph">We scale up when outcomes improve and guardrails hold. If results are neutral, we tweak copy or placement and try again.</p>



<p class="wp-block-paragraph">We roll back right away if stop rules trigger. No debates during emergencies.</p>



<h3 class="wp-block-heading">7) Clean up and record</h3>



<p class="wp-block-paragraph">We remove flags within two sprints after reaching 100%. If features become permanent policy, we move rules into permissions and delete the flag.</p>



<p class="wp-block-paragraph">We jot down what shipped, metrics, and decisions in a short record.</p>



<h3 class="wp-block-heading">8) Govern your flags</h3>



<p class="wp-block-paragraph">We keep a <strong>flag registry</strong> with name, owner, purpose, creation date, and cleanup ticket links. Naming conventions help us stay organized.</p>



<p class="wp-block-paragraph">We use formats like <code>area_feature_purpose</code> such as <code>onboarding_streaks_release</code>. Monthly registry reviews help us retire stale feature flags.</p>



<h2 class="wp-block-heading">Trade-offs at a glance</h2>



<figure class="wp-block-table"><table><thead><tr><th>Choice</th><th>Pros</th><th>Cons</th><th>Use when</th></tr></thead><tbody><tr><td><strong>Staged rollout</strong></td><td>Limits risk; real-world learning</td><td>Slower to 100%; config overhead</td><td>Most product features</td></tr><tr><td><strong>Dark launch</strong></td><td>Test infra safely</td><td>No behavioral data yet</td><td>Risky dependencies / perf</td></tr><tr><td><strong>Big-bang</strong></td><td>Simple</td><td>High blast radius; low diagnosability</td><td>Tiny, reversible tweaks only</td></tr><tr><td><strong>A/B via flag</strong></td><td>Causal read</td><td>Needs power &amp; clean assignment</td><td>Pricing, onboarding, UX bets</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Each deployment method balances <strong>speed</strong> against <strong>deployment risk</strong>.</p>



<h2 class="wp-block-heading">Metrics you must watch</h2>



<p class="wp-block-paragraph">Track one primary outcome per feature flag. Focus on conversion, activation, time-to-X, or retention metrics.</p>



<p class="wp-block-paragraph">Monitor technical guardrails like error rates, crash-free percentages, and p95 latency. Watch for CPU and memory spikes that signal trouble.</p>



<p class="wp-block-paragraph">Check user trust metrics like complaint rates from exposed users, refund rates, and accessibility defects.</p>



<p class="wp-block-paragraph">Track rollout operations through exposure data by cohort, step duration, and variant traffic splits.</p>



<p class="wp-block-paragraph">Keep dashboards simple with three panels: <strong>Outcome</strong> charts, <strong>Guardrails</strong> monitoring, and <strong>Rollout</strong> tracking.</p>



<h2 class="wp-block-heading">Worked example: how big should each step be?</h2>



<p class="wp-block-paragraph">We need to figure out the right sample size for each rollout step. The formula helps us find how many exposures we need per variant.</p>



<p class="wp-block-paragraph">Let&#8217;s say we want a 5% conversion rate with ±0.5 percentage point accuracy. We use this formula:</p>



<p class="wp-block-paragraph"><strong>n ≈ p(1−p) × (1.96 / ME)²</strong></p>



<p class="wp-block-paragraph">First, we calculate 1.96 divided by 0.005, which equals <strong>392</strong>. When we square this, we get <strong>153,664</strong>.</p>



<p class="wp-block-paragraph">Next, we find p(1−p): 0.05 × 0.95 = <strong>0.0475</strong>.</p>



<p class="wp-block-paragraph">We multiply these together: 0.0475 × 153,664 ≈ <strong>7,299 exposures per variant</strong>.</p>



<p class="wp-block-paragraph">Now timing. If we have <strong>10,000 visitors per day</strong> and <strong>25% exposure rate</strong>, we get <strong>2,500 exposures daily</strong> per variant.</p>



<p class="wp-block-paragraph">This means each step takes about <strong>2.9 days</strong> to reach our target sample size.</p>



<h2 class="wp-block-heading">Realistic Examples</h2>



<p class="wp-block-paragraph">A B2B audit export feature used LaunchDarkly with a release flag and kill switch. We started with a 0% dark launch, then rolled to enterprise customers at 10%, 50%, and 100%.</p>



<p class="wp-block-paragraph">The primary goal was reducing audit ticket rates by 30%. We set guardrails for export errors under 0.5%, complaints under 0.3%, and latency under 60 seconds.</p>



<p class="wp-block-paragraph">At 50% rollout, we saw a 27% ticket reduction while keeping all guardrails green.</p>



<p class="wp-block-paragraph">For a fitness app&#8217;s streak feature, we ran A/B tests using OpenFeature. We targeted iOS users at 10%, 25%, then 50% over seven-day periods.</p>



<p class="wp-block-paragraph">Our goal was increasing D7 workout rates by 2 percentage points. We monitored accessibility defects and crash rates as guardrails.</p>



<p class="wp-block-paragraph">The test delivered 2.6 percentage points improvement, so we expanded to Android with a 5% control group.</p>



<h2 class="wp-block-heading">Targeting rules: do&#8217;s and don&#8217;ts</h2>



<p class="wp-block-paragraph"><strong>Do:</strong></p>



<ul class="wp-block-list">
<li>Target stable IDs like logged-in users, not just devices</li>



<li>Start with low-risk groups such as new users or single locations</li>



<li>Document all rules in the PRD using clear language</li>
</ul>



<p class="wp-block-paragraph"><strong>Don&#8217;t:</strong></p>



<ul class="wp-block-list">
<li>Target users based on health data or protected classes</li>



<li>Build complex nested rules that teams cannot review</li>



<li>Include staff or bots in our performance metrics</li>
</ul>



<h2 class="wp-block-heading">Privacy, accessibility, and ethics (non-negotiable)</h2>



<p class="wp-block-paragraph">We protect user privacy by avoiding personal data sharing with vendors. We use fake IDs and set clear data retention limits.</p>



<p class="wp-block-paragraph">Users can delete their information when needed. Our accessibility testing includes screen readers and keyboard navigation.</p>



<p class="wp-block-paragraph">We check color contrast and proper labels. We track accessibility issues as key metrics.</p>



<p class="wp-block-paragraph">We practice fair growth through clear consent and honest pricing. Users can easily cancel or reverse changes.</p>



<p class="wp-block-paragraph">We never withhold safety fixes from any user group. If these standards fail, we pause or roll back right away.</p>



<h2 class="wp-block-heading">Pitfalls &amp; better alternatives</h2>



<p class="wp-block-paragraph"><strong>Flag debt</strong> happens when old toggles pile up in our codebase. We should set expiry dates when we create flags.</p>



<p class="wp-block-paragraph">Auto-ticket removal within two sprints of hitting 100% keeps our git repositories clean. <strong>Config drift</strong> across environments causes bugs.</p>



<p class="wp-block-paragraph">We need to version flag configs and promote them like code through our github workflows. <strong>No clear ownership</strong> leads to abandoned flags.</p>



<p class="wp-block-paragraph">Every flag needs an owner, purpose, metrics, and stop rules in our registry. <strong>Measuring views instead of exposure</strong> gives wrong data.</p>



<p class="wp-block-paragraph">We must log exposure events and join them with outcomes for accurate results. <strong>Skipping dark launches</strong> for infrastructure changes creates risk.</p>



<p class="wp-block-paragraph">Always run 0% tests on queues, caches, and services under real load first. <strong>Jumping straight to 100%</strong> rollout skips safety checks.</p>



<p class="wp-block-paragraph">Use at least three steps and hold each phase for stable data collection.</p>



<h2 class="wp-block-heading">Mini FAQ</h2>



<p class="wp-block-paragraph"><strong>How many flags should we maintain?</strong> Keep only the flags we can actively manage. We need a registry that tracks the owner, purpose, and expiry date for each flag.</p>



<p class="wp-block-paragraph">We should retire flags promptly when they&#8217;re no longer needed.</p>



<p class="wp-block-paragraph"><strong>Who controls rollout timing?</strong> Product managers and engineering teams share this responsibility. Product managers set the metrics and guardrails.</p>



<p class="wp-block-paragraph">Engineering teams ensure reliability and maintain the kill switch.</p>



<p class="wp-block-paragraph"><strong>Should we buy or build flag tooling?</strong> We should buy existing tools for speed and governance features. Only build custom solutions if we have strict data residency requirements or need custom routing.</p>



<p class="wp-block-paragraph">We must include total cost of ownership and on-call expenses in our decision.</p>



<p class="wp-block-paragraph"><strong>How long should we keep control groups?</strong> We should maintain 5-10% of users in the control group for 1-2 weeks after reaching 100% rollout. This helps us catch any regressions before retiring the flag completely.</p>



<h2 class="wp-block-heading">Copy-ready rollout checklist</h2>



<p class="wp-block-paragraph"><strong>Before 0% dark launch:</strong></p>



<ul class="wp-block-list">
<li>Set up success and guardrail events with dashboards.</li>



<li>Arm all alerts.</li>



<li>Test the kill switch to make sure it works.</li>



<li>Write down the rollback playbook.</li>



<li>Get the privacy and accessibility review sign-offs.</li>
</ul>



<p class="wp-block-paragraph"><strong>At each rollout step (5% / 25% / 50%):</strong></p>



<ul class="wp-block-list">
<li>Check exposures and outcome trends.</li>



<li>Review guardrails and support tickets.</li>



<li>Wait until signals look stable before going further.</li>



<li>Record a quick decision: scale, iterate, or roll back.</li>
</ul>



<p class="wp-block-paragraph"><strong>After reaching 100%:</strong></p>



<ul class="wp-block-list">
<li>Keep a 5-10% control group for 1-2 weeks.</li>



<li>Delete the feature flag and targeting rules.</li>



<li>Log an ADR with the full results.</li>
</ul>



<p class="wp-block-paragraph">We use feature flags to ship quietly and learn fast.</p>



<p class="wp-block-paragraph">Clear metrics matter, as do tight guardrails, named owners, and disciplined cleanup.</p>



<p class="wp-block-paragraph">Start small. Keep an eye on the right numbers.</p>



<p class="wp-block-paragraph">And honestly, always make sure you can reverse a launch—moving fast shouldn’t mean breaking what matters.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://product-blueprint.com/feature-flags/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: product-blueprint.com @ 2026-06-08 18:26:42 by W3 Total Cache
-->