Skip to content

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

ModelWhen to use
flatFixed price per period, irrespective of quantity.
per_unitLinear unit price (with optional included units).
tieredDifferent unit price per band — graduated. Each unit is priced at the band it falls into.
volumeDifferent unit price per band — all-in. The entire quantity is priced at the band the total falls into.
packageSold in batches of N units at a fixed package price.
usageComputed 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