quotastack Docs
Docs / Concepts / Subscription Overrides

Subscription Overrides

Give one customer a different entitlement value from the rest of their plan, without building a plan for one person.

Mental model — An override is a sticky note on one customer's contract. The plan still says 10 seats; the note says 50 for this account only. Everything else on the contract is unchanged, and when the note comes off, the plan's number applies again.

Quick take

  • Overrides change entitlements, not prices
  • Works on boolean, gauge, and static metrics
  • Metered metrics are rejected with 400 — pricing is not an entitlement
  • expires_at: null means permanent; on expiry the plan value applies again
  • Creating a second override for the same metric replaces the expired one
SELLABLE Plan has many PRICED TIER Plan variant attaches attaches GRANTS Credit grant template ALLOWS Entitlement overridden by ONE CUSTOMER Subscription override A subscription points at a VARIANT, not at the plan

Subscription Overrides

A customer negotiated 50 seats when their plan gives 10. You do not want a new plan for one account. An override changes one entitlement value on one subscription, and leaves the plan alone.

What can be overridden

Overrides work on entitlements, not on prices.

Metric typeCan be overridden
booleanYes — turn a feature on or off for this customer.
gaugeYes — raise or lower a count, like seats.
staticYes — change a fixed configured value.
meteredNo. The API rejects it with 400.

Metered metrics are priced by metering rules and paid for with credits. If you want one customer to pay a different rate, that is a pricing question, not an entitlement override. Grant them credits, or put them on a different variant.

Creating one

curl -X POST https://api.quotastack.io/v1/subscriptions/{subscription_id}/overrides \
  -H "X-API-Key: qs_live_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "billable_metric_key": "seats",
    "value": { "limit": 50 },
    "expires_at": null,
    "reason": "Negotiated at renewal, approved by sales"
  }'
FieldRequiredMeaning
billable_metric_keyYesWhich entitlement to override.
valueYesThe new value. Its shape must match the metric’s type.
expires_atNoWhen the override stops. null means it never stops.
reasonNoWhy. Write something — the next person to read this will thank you.

The value shape follows the metric type, exactly as it does on the plan variant. A gauge takes a limit, a boolean takes an enabled flag. See Plan-Variant Entitlements for the shapes.

How it interacts with the plan

The override wins for that one metric on that one subscription. Everything else on the variant is untouched — other entitlements, credit grants, billing cycle, all unchanged.

When the override expires, the variant’s own value applies again. Nothing needs to be cleaned up for that to happen.

Replacing an override

Create a second override for the same subscription and the same metric, and QuotaStack replaces the expired one rather than stacking a duplicate. You do not need to delete the old one first.

Reading and removing

List everything set on a subscription:

curl https://api.quotastack.io/v1/subscriptions/{subscription_id}/overrides \
  -H "X-API-Key: qs_live_..."

Read or delete a single one by its metric key:

curl -X DELETE https://api.quotastack.io/v1/subscriptions/{subscription_id}/overrides/seats \
  -H "X-API-Key: qs_live_..."

Deleting an override returns the customer to the plan’s value straight away.

Environments

An override does not carry an environment of its own. It does not need one: it belongs to a subscription, and subscriptions are separated by environment. An override on a sandbox subscription affects that sandbox subscription and nothing else.

This is worth knowing because the catalog behaves the opposite way — see Environments & the Shared Catalog.

Keep them rare

An override is a promise you made to one customer, recorded in one row. That is fine for a handful of accounts. When you find yourself writing the same override for the tenth customer, that is a plan variant asking to exist.

Every override is written to the audit log, so you can always find out who has one and why.

Common mistakes

Don't try to override a metered metric

The API returns 400. Metered usage is priced by metering rules and paid in credits — grant credits or change the variant instead.

Don't delete an old override before writing the new one

Creating one for the same subscription and metric replaces the expired one for you.

Don't use overrides as a substitute for a plan

The tenth customer with the same override is a variant asking to exist. Overrides are for exceptions.