Percent is stateless: no pool, no budget, no lifecycle, just a live percentage applied to whatever amount it receives. Fixed and quantity are both budgeted and both refresh on a cadence, but they spend down different things, fixed’s budget is dollars, quantity’s is units. That difference is also why a quantity discount can shift which pricing bracket a volume- or tiered-priced line item lands in, while fixed and percent cannot: only quantity touches the bill before the pricing model has run.
How discounts treat PIT and POT
All three discount types are indifferent to whether the amount or quantity they’re reducing came from a point in time meter or a period of time allocation. A percent or fixed discount receives a dollar amount and reduces it; a quantity discount receives a unit count and reduces it. None of the three know or care which product type produced that number, or whether it was already prorated for a mid-period start, an amendment, or a cancellation, they just act on whatever they’re handed.Discount stacking and order
When multiple discounts apply to the same line item, they chain together through an explicit order: each discount’s output becomes the next discount’s input. The default order across all three types is quantity discount first (reduces units, before the pricing model runs), then fixed discount (reduces the resulting dollar amount by a flat sum), then percent discount (reduces what’s left by a percentage). This ordering is more favorable to the business than the reverse, and order changes the result:order field, for example a daily quantity discount and a monthly one, each depleting its own pool independently:
Percent discount
A percent discount subtracts a percentage of whatever amount it receives (the gross amount, or the gross amount minus a fixed discount if one runs first in the stack), applied independently to each billing calculation.The core mechanic
- Start from the gross amount (usage after quantity discounts, the pricing model, and minimum commitments), then subtract any fixed discount that runs ahead of it in the stack, per the default order.
- Apply the percentage to what’s left: discount = value% × amount.
- Subtract: invoice amount = amount − discount, floored at $0.
Known edge cases
A 100% discount means the customer pays $0 indefinitely, so confirm this is intentional before configuring it.Fixed discount
A fixed discount subtracts a flat dollar amount from the bill, refreshed on a cadence. The discount can never take the bill below zero: it’s capped at whatever the line total actually is that period.The core mechanic
- A fresh budget of
valuedollars becomes available at each cadence boundary, for example $100 refreshed monthly. - Each billing calculation within that cadence window draws down the budget until it’s exhausted or the window ends.
- The discount can’t push the bill below $0: if the bill is smaller than the remaining budget, only enough of the budget to zero out the bill is used, not the full amount.
What’s not yet available
- Scopes other than per-period. A fixed discount’s budget can only refresh on a recurring cadence today. A one-time, lifetime budget that depletes once and never refreshes exists in the schema but isn’t enabled yet, and a per-event scope (a fresh allocation for every individual usage event) is rejected outright until further billing-engine support lands.
- Caps within a cadence window. Limiting how much of the budget a single event or a single period can consume, independent of the overall budget, isn’t available yet.
Quantity discount
A quantity discount is a “free units” or “first N discounted” mechanism: customers get a pool of discounted units that refreshes on a cadence, depletes against usage, and resets at each cadence boundary.Scope
The core mechanic
- Pool created: a fresh pool of discounted units is created at each cadence boundary.
- Deplete chronologically: periods within the cadence window consume from the pool in order.
- Bill the remainder: usage beyond the pool is billable.
Cadence relative to billing period
Proration of the pool for partial cadence windows
When a cadence window is only partially covered (for example, a contract starting mid-month), the pool itself can be reduced proportionally. This is controlled bypartial_period_handling, which is prorate by default:
partial_period_handling to full instead applies the entire pool even to a partial window. This is distinct from period of time’s own proration: for period of time, pricing proration adjusts the dollar amount for a partial period, while discount proration adjusts the quantity pool. These operate on different axes and aren’t expected to interact directly.
A prorated pool rarely lands on a whole number, as above, so a rounding setting (floor, ceil, or half_up) resolves it to a usable unit count. The default is floor, the conservative direction for the business, rounding the pool down rather than granting a fractional unit’s worth extra.
Bracket-shift effects on volume and tiered pricing
Because the quantity discount reduces the billable quantity before the pricing model runs, it can shift which bracket a customer lands in:-
Volume pricing: reducing quantity can move a customer into a lower bracket, which sometimes carries a higher rate. Counterintuitively, the discount can increase the invoice in that scenario.
- Tiered pricing: reducing quantity simply means fewer tiers get filled. There’s no equivalent paradox here: the total is always less than or equal to what it would be without the discount.
What’s deferred to a later phase
Carryover of unused units, expiry models beyond use-it-or-lose-it, grant-timing controls (such as delaying availability after payment), per-event scope, and prepaid entitlement balance tracking are all out of scope for a quantity discount currently. The discount does have its own date range, separate from thevalue/cadence/proration settings above, but it can only be a sub-range of the line item’s own duration, not an independent window that extends beyond it.