Pricing models
A plan is composed of one or more components. Each component picks one pricing model. Mix and match them within a plan to express the price you actually want to charge.
The six models
| Model | When to use |
|---|---|
flat | Fixed price per period, irrespective of quantity. |
per_unit | Linear unit price (with optional included units). |
tiered | Different unit price per band — graduated. Each unit is priced at the band it falls into. |
volume | Different unit price per band — all-in. The entire quantity is priced at the band the total falls into. |
package | Sold in batches of N units at a fixed package price. |
usage | Computed from posted usage events at period close. |
flat, per_unit, tiered, volume, and package are fixed-quantity
models — quantity is set on the subscription. usage is variable —
quantity is the sum of usage events in the period.
Flat
{ "model": "flat", "amount": "29.00" }The simplest case: $29 per period, no questions asked. Use for base fees.
Per-unit
{ "model": "per_unit", "unit_amount": "10.00", "included_units": 5, "meter": "active_seats"}unit_amount is charged for every unit beyond included_units. The
meter field names the metric tracked on the subscription
(subscription.quantities[meter] = N).
Tiered (graduated)
{ "model": "tiered", "tiers": [ { "up_to": 10, "unit_amount": "10.00" }, { "up_to": 100, "unit_amount": "8.00" }, { "up_to": null, "unit_amount": "5.00" } ]}For 50 units: 10 × 10.00 + 40 × 8.00 = 420.00. Each unit is priced at
the tier it falls into. up_to: null means the top tier is unbounded.
Volume (all-in)
{ "model": "volume", "tiers": [ { "up_to": 10, "unit_amount": "10.00" }, { "up_to": 100, "unit_amount": "8.00" }, { "up_to": null, "unit_amount": "5.00" } ]}For 50 units: 50 × 8.00 = 400.00. The entire quantity is priced at the
tier the total falls into. Useful for “buy more, pay less per unit overall.”
Package
{ "model": "package", "package_size": 100, "package_price": "12.00"}100 API calls for $12. 250 calls = 3 packages = $36. Quantity rounds up
to the next package boundary by default; set rounding: down if you’d
rather charge for completed packages only.
Usage
{ "model": "usage", "meter": "api_calls", "aggregation": "sum", "tiers": [ { "up_to": 10000, "unit_amount": "0.0010" }, { "up_to": 100000, "unit_amount": "0.0008" }, { "up_to": null, "unit_amount": "0.0005" } ]}You post events with POST /v1/usage carrying (subscription_id, meter, quantity, timestamp, idempotency_key). At period close, Paylera
aggregates by aggregation (sum, max, last_during_period,
unique_count) and prices the result per the tiers.
Late events arriving after period close apply to the next period by
default; set late_events: rebill to retroactively re-issue the closed
invoice (with a credit note + new invoice). See
Report metered usage.
Combining models
A typical SaaS plan:
{ "components": [ { "code": "base", "pricing": { "model": "flat", "amount": "29.00" } }, { "code": "seats", "pricing": { "model": "per_unit", "unit_amount": "10.00", "included_units": 3, "meter": "active_seats" } }, { "code": "calls", "pricing": { "model": "usage", "meter": "api_calls", "aggregation": "sum", "tiers": [{ "up_to": null, "unit_amount": "0.0010" }] } } ]}Result: $29 base + $10 per active seat over 3 + $0.001 per API call.
Rounding
Each component is priced independently and rounded to the currency’s minor
units (cents for USD, etc.) using HalfEven (banker’s rounding) by
default. Tax-jurisdiction overrides may force HalfUp per locale; that’s
handled by the tax engine, not by you.
Where to next
- Subscriptions — how plans become recurring revenue.
- Metered usage — the full lifecycle of a usage event.