Engineers paste tenant_id into segmentation rules.
User segments become a parking lot for org IDs. Audits can't tell tenant scope from cohort experiment from kill switch.
Argus is the feature-flag platform for teams whose codebase fragments along an axis the dominant tools don't model well — B2B customer tenants, market-test brand variants, or a portfolio of distinct products under one workspace. Per-slice rollout, per-slice approval, and an audit log nothing escapes.
User segments become a parking lot for org IDs. Audits can't tell tenant scope from cohort experiment from kill switch.
"Disable for tenant B" requires deploying a config that touches A, C, D too. Reversibility is theatre.
When a regulated customer asks what changed in their environment last quarter, the answer is grep plus apologies.
Customer-facing teams have no live, tenant-scoped view of who has what. Eng becomes a support escalation queue.
Tenant is required at evaluation time. Tenant changes write tenant-scoped audit rows. Bypass is impossible — not because the SDK asks nicely, but because the row can't be written without one.
Customer → Product → Tenant as first-class objects — not a flag-by-flag spreadsheet rebuilt in Notion.
Actor, timestamp, env, tenant, flag, before, after. Required — not configurable.
Per-tenant percentage rollouts with deterministic per-user bucketing. Same user, same outcome — every evaluation, every SDK. Isolated per tenant.
Once product scoping is mandatory (apiKey identifies the Product) and tenant scoping is mandatory inside multi-tenant Products, every downstream property — audit, isolation, blast radius, pricing — falls out for free.
@argus/client (browser, real-time) + @argus/node (server).// scoped, deterministic, reversible const flag = await argus.evaluate({ key: "new_billing_v2", tenant: ctx.tenantId, // required env: "prod", }); if (flag.on) renderNewBilling(); // → audit row written, scoped to tenant. // → reversible from the dashboard in one click. // → impossible to evaluate without a tenant.
Argus comes out of years running multi-tenant SaaS where every "roll out for tenant B" was a custom rule, a Slack thread, and a held breath. We're shipping the layer we wished we had — and we're picking three design partners to ship it with.