PostHog feature flags vs LaunchFlag: when you need analytics and when you need a switch
PostHog feature flags come with an analytics platform attached. LaunchFlag is only the switch. Setup, evaluation, pricing and kill switch, compared fairly.
Comparisons · · 8 min read · Adarsh Mishra
PostHog flags are the right choice when you already run PostHog for analytics and want experiments on top. LaunchFlag is the right choice when you need a switch you can flip from your phone in seconds, with no analytics pipeline attached.
The short answer
#Both products give you a boolean you can flip without a deploy. The difference is everything attached to that boolean.
PostHog feature flags are one surface on a product analytics platform. The flag sits next to your events, your session replays and your experiments, and that is the point: you roll a feature out to 5 percent and then look at what those 5 percent did. Flags and experiments are billed on the same request meter.
LaunchFlag is one surface. A switch, three environments, an audit log, and nothing else. No event pipeline, no funnel, no metric attached to a flag, and none of that is coming. It is $12 a month flat, and the fastest thing it does is turn something off.
So the question is not which product is better. It is which job you are hiring for. If the job is "which variant won", that is PostHog. If the job is "the checkout is broken and I am on a train", that is LaunchFlag.
What PostHog feature flags are good at
#Start with what PostHog actually ships, because it is a lot more than a boolean.
Four flag types. When you create a flag, PostHog offers boolean, multivariate, remote config and experiment. Boolean flags return "false if the flag is disabled, true if the flag is enabled and has a matching release condition, and null or undefined if no release condition matches". Multivariate flags "return a key, for example control or test", and users are bucketed by the rollout percentages you set.
Targeting that knows your users. Release conditions take a rollout percentage with precision down to 0.01 percent, plus person properties, cohorts and groups. That last part is the real advantage and it is easy to undersell. PostHog already knows which users are on the Pro plan, signed up in March and fired checkout_started twice, so you can target that cohort without assembling it yourself. A standalone flag service cannot do that, because it knows nothing about your users except what you hand it at evaluation time.
Local evaluation on the server. The Node, Ruby, Go, Python, C# / .NET, PHP, Java, Rust and Elixir SDKs can decide flags in your process: "Instead of making a request for each flag, PostHog will periodically request and store feature flag definitions locally." Definitions refresh every 30 seconds, or every 5 minutes in the Go SDK. It needs a separate secure API key, and you have to pass in the person properties yourself, since your server holds them and PostHog is not in that loop. It does not work with experience continuity, early access links, static cohorts or is_not_set operators.
The measurement loop. This is the actual reason to use PostHog flags. The flag is wired to session replays, events and exceptions, and experiments are billed with flags, so "did the rollout work" is answered in the same tool that served the flag, with the statistics done for you. I am not building that and would not try. If you already run PostHog, its flags cost you one dashboard visit of setup and give you a measurement loop nobody standalone can match.
What LaunchFlag is for
#LaunchFlag exists for one job: making a shipped feature reversible in seconds, by one person, from a phone, with no deploy involved.
That job has four requirements and none of them are analytics.
- The old path still runs. A kill switch is a design decision you make before you ship, not a setting you turn on afterwards. If you deleted
oldCheckoutthe day you shippednewCheckout, no flag service saves you. - Off is the safe side. Every flag carries a fail mode. Closed for money, auth and deletion. Open for cosmetics, where a nav bar vanishing because a config fetch timed out is worse than the new nav.
- You can reach it from a phone. The dashboard is mobile first because incidents do not wait for you to be at a desk.
- Every flip leaves a record. Who, what, when, which environment, in an audit log, with roles (owner, developer, viewer) deciding who can flip what.
Around that sit the things the job needs and nothing more. Boolean and multivariate flags. Three environments (dev, staging, prod) with one-tap promotion. Targeting by everyone, logged-in, percentage, first N users or an allowlist. One Emergency off that kills every flag in a project at once. Flags register themselves the first time your code evaluates them, off everywhere, so you never have to create a flag before writing the branch that reads it.
The other half is agents. More of what goes to production now was not typed by the person who approved it. LaunchFlag ships an agent skill and a hosted MCP server, so Claude Code or Cursor can wrap a risky change in a flag and register it without you. A flag around code you read but did not write is the cheapest insurance in the business.
Side by side
#| PostHog | LaunchFlag | |
|---|---|---|
| Setup | Install posthog-js or a server SDK, init with a project token and api_host, create the flag in the dashboard | npx launchflag init, then one if; the flag creates itself on first evaluation |
| Dependencies | The PostHog SDK and its request pipeline, plus your api_host being reachable | launchflag, no dependencies, or 15 lines of fetch and no package at all |
| Evaluation | Remote per request by default; local evaluation on server SDKs, definitions polled every 30s (5 min in Go), person properties passed by you | Local by default, from one config document per environment cached 5s and cached at the edge |
| Environments | PostHog recommends three separate projects: local development, staging, production | dev, staging and prod built in, one-tap promotion between them |
| Targeting | Rollout percentage to 0.01 percent, person properties, cohorts, groups | Everyone, logged-in, percentage, first N users, allowlist |
| Kill switch | Disable the flag in the UI: "when something breaks, flip it off" | Per-flag switch plus one Emergency off for the whole project |
| Failure behaviour | Bootstrapping avoids a flash on first load; "a partial or errored response updates the flags it computed and preserves previous values for the others" | Fail open or closed declared per flag, last known config kept, 800 ms timeout, declared defaults on a cold process |
| Audit and roles | Not covered by the pages cited below; check their docs | Audit log of every change, roles owner / developer / viewer |
| Agents and MCP | Not covered by the pages cited below | Hosted MCP server and an agent skill, installed by npx launchflag init |
| Pricing model | Per flag request, 1M requests a month free, experiments on the same meter; a local evaluation definitions fetch is charged as 10 requests; the rate after the free million is on their pricing page | Flat $12 Pro or $29 Launch a month, no seats, 7-day trial |
| Analytics | The whole platform: events, session replay, funnels, experiments | None by design; one number per flag, evaluations per day |
Two rows deserve a note rather than a cell. On pricing, a PostHog frontend request fires when the SDK initialises, when a user is identified, when user properties update, when you call reloadFeatureFlags, and when you create a group. That is a usage shape worth modelling before you assume 1M is generous or stingy for your traffic. And on the audit and agent rows, "not covered by the pages cited below" means exactly that: I checked the pages listed at the end and did not find it, not that the feature is missing.
When to pick PostHog
#Pick PostHog if any of these is true.
- You already run PostHog. The marginal cost of using its flags is close to zero and the measurement is free. Adding a second vendor to flip booleans is a worse trade than it looks.
- You are running experiments, not rollouts. If the sentence you want to say is "variant B lifted conversion 4 percent with p under 0.05", you need the analytics attached to the assignment. Nothing I ship gives you that.
- Your targeting depends on behaviour. Cohorts built from events, person properties set months ago, group analytics for B2B accounts. That data lives in PostHog, and targeting is much cheaper where the data already is.
- You want early access programmes and remote config in the same place as the flag.
There is no clever counter-argument to any of those. If that is your situation, use their flags.
When to pick LaunchFlag
#Pick LaunchFlag if any of these is true.
- The flag is a kill switch, not an experiment. You are not going to analyse it. You are going to turn it off at 19:12 on a Tuesday.
- You do not run product analytics and do not want to start. Installing an analytics platform to get a boolean is a large amount of surface area for a small amount of switch, and it comes with a cookie banner conversation you did not ask for.
- You want a flat bill. $12 or $29 a month, no seats, no per-request meter to model. See pricing.
- A coding agent writes some of your code. The skill and the MCP server mean the agent wraps its own risky change in a flag.
- You want the flag to be boring. Three environments, an audit log, fail modes, an emergency off, and nothing else to learn.
Using both
#The two-tool answer is not a compromise, it is what I actually do.
PostHog measures. LaunchFlag switches. The flag key is the same string in both places if you want it to be, and the events you send PostHog can carry which arm a user saw, so the analysis still works.
The reason to split them is that they want different things from you. A tool that owns your experiment analytics has a quiet interest in your flags living forever, because a flag with history attached is a flag with value attached. A tool that only owns the switch wants you to delete flags, because the good end state for any flag is that it stops existing. That is why the only number LaunchFlag keeps is evaluations per day: it is what surfaces the flags nobody has touched in 30 days that production is still asking about.
To be explicit about the trade, since this is a comparison post and you should know what you are giving up: LaunchFlag deliberately has no funnels. No session replay, no significance test, no metric attached to a flag. If you run a multivariate flag, it serves the arm and records nothing else about it. That is a real limitation and it is on purpose, not on the roadmap.
The integration in three lines
#The whole LaunchFlag integration is one import and one if. There is no flag to create first, no YAML, no dashboard step.
LaunchFlag
import { flag } from "launchflag";
if (await flag("checkout_v2", user.id)) return newCheckout(cart);
return oldCheckout(cart);For comparison, the PostHog web equivalent is an install, an init with your project token, and the check.
PostHog
import posthog from "posthog-js";
posthog.init("<ph_project_token>", { api_host: "https://us.i.posthog.com", defaults: "2026-05-30" });
if (posthog.isFeatureEnabled("checkout_v2")) { /* ... */ }Neither is hard. The difference is what the second line pulls in: PostHog gives you a client that also captures, identifies and replays, which is exactly what you want if you are there for the analytics and exactly what you are paying for if you are not.
One command sets LaunchFlag up, writing the dev key into .env.local, downloading the agent skill and configuring the MCP server.
Terminal
$ npx launchflag init
The rest, variants, environments, the raw API and what happens when we are unreachable, is in the docs.
Sources
#All checked on 4 September 2026. PostHog moves fast, so verify prices and limits at the source before you make a decision on them. Where a number was not on the page I read, this post says so rather than guessing.
- Feature flags product page: https://posthog.com/feature-flags
- Creating feature flags, flag types and release conditions: https://posthog.com/docs/feature-flags/creating-feature-flags
- Local evaluation, polling intervals and limitations: https://posthog.com/docs/feature-flags/local-evaluation
- Bootstrapping and behaviour on an errored response: https://posthog.com/docs/feature-flags/bootstrapping
- Web installation snippet: https://posthog.com/docs/feature-flags/installation/web
- What counts as a feature flag request: https://posthog.com/docs/billing/estimating-usage-costs
- Projects per environment: https://posthog.com/docs/data/environments
- Pricing and the free request allowance: https://posthog.com/pricing
FAQ
#Is LaunchFlag an analytics tool?
#No. LaunchFlag has no events, no session replay, no funnels and no significance tests, and it is not going to grow them. It keeps one number per flag, how many times that flag was evaluated per day, which is what finds stale flags and what the bill is based on. If you need to know whether a variant won, measure it in PostHog or wherever you already measure things.
Can I A/B test with LaunchFlag?
#You can split traffic, but you cannot analyse the result. Multivariate flags serve a named arm to a stable bucket of users, so the assignment half of an A/B test works. There is no metric, no funnel and no significance test attached, so the analysis half has to happen in your analytics tool. If you want assignment and analysis in one place, use PostHog experiments, which are billed on the same meter as PostHog flags.
What happens if LaunchFlag is down?
#Your app keeps serving flags. The SDK evaluates locally from a config document it caches for five seconds, so a failed refresh keeps serving the last config it fetched successfully and retries on the next window. Requests abort at 800 ms rather than blocking a render. A process that has never reached the API serves the defaults you declared in code, and each flag carries its own fail mode, closed for money and auth, open for cosmetics.
Can I migrate from PostHog feature flags to LaunchFlag?
#Flag by flag, and usually only some of them. Keep in PostHog anything wired to an experiment, a cohort or a person property that only PostHog knows about, because a standalone flag service does not have that data. Move the kill switches and the dark launches, which are the flags that need to be flipped fast and do not need a metric. The key name can stay the same, so the migration is changing one import and one function call per flag.