In this guide
- Understand provisioned-throughput billing
- Learn how Metronome models reservations and calculates overages
- Configure SQL billable metrics, products, rates, Named Schedules, and usage events
- Show the resulting invoice and invoice breakdowns
What is provisioned throughput?
A provisioned-throughput contract has two commercial components:- Reservation fee: A recurring fee for a fixed amount of capacity, whether or not the customer consumes all of it.
- On-demand overage: A usage-based charge for capacity consumed above the reservation.
How Metronome models provisioned throughput
The key components to modeling this business model in Metronome are as follows:
SQL billable metrics serve as the bridge between actual usage and reserved amounts encoded as contract terms. They read the reservation amount that was active at each usage interval to determine whether the customer is using under or over their reserved capacity.
For this model, you can configure two SQL billable metrics that effectively calculate:
Follow the steps below to configure this model.
1. Create the SQL billable metrics
Define the SQL billable metrics first so they are available to attach when you create the products in the next step. For each SKU and usage interval, the metrics should:- Aggregate raw usage at the scope where the reservation applies.
- Look up the scheduled reservation active at the same timestamp.
- Calculate covered usage and on-demand usage separately.
reserved-instance Named Schedule keyed by sku. You create that schedule on the customer’s contract in Step 3; the metric definitions do not depend on the schedule existing yet.
Choose the right schedule lookup
SQL billable metrics offer two functions for looking up Named Schedule values.Create the on-demand SQL billable metric
The following metric aggregates all H100 events into 60-second SKU totals, reads the active H100 reservation, and calculates the on-demand quantity.COALESCE(..., 0). In that case, all usage is billed as on demand.
The query multiplies each 60-second result by 60, so the output is in GPU-seconds. Configure the associated product’s quantity conversion to divide by 3,600 before applying a GPU-hour rate.
Create the reserved-usage SQL billable metric
To show the portion of usage covered by the reservation, use the same event aggregation and schedule lookup, but useMIN() instead of subtracting the reservation:
2. Create the products, rate card, and contract
Create products for the two calculated usage quantities and the fixed reservation fee, then bundle them on a rate card and attach that rate card to the customer’s contract.
Add all three products to the rate card, then create the customer’s contract using that rate card. You can override the on-demand rate and reservation fee on an individual contract to reflect the customer’s negotiated commercial terms.
Example: Acme’s contract charges a $100,000 monthly reservation fee for 120 H100 GPUs and $2.00 per GPU-hour for on-demand usage. The reserved-usage product remains at $0 per GPU-hour because the reservation fee already covers that capacity.
3. Add the Named Schedule
With the contract in place, add the Named Schedule that stores the customer’s reserved capacity. The SQL billable metrics created in Step 1 read from this schedule at billing time.What is a Named Schedule?
A Named Schedule attaches a time-varying value to a contract. Use it when a contract term, such as a customer’s reserved capacity, can change over time. Each schedule is identified within a contract by its schedule name and properties:- The schedule name describes the kind of value, such as
reserved-instance. - Properties scope that value, such as
{ "sku": "gpu-H100" }.
reserved-instance schedules for gpu-H100 and gpu-A100.
Each schedule has one or more time-bounded segments. A segment provides the value that is active from starting_at until the next segment starts or ending_before is reached.
A Named Schedule does not affect billing by itself. The SQL billable metrics read the value active at the usage timestamp and use it in the billing calculation.
Create a reservation using a Named Schedule
Create a reservation schedule for 120 H100 GPUs on the customer’s contract:Change a reservation without changing history
When the customer changes their commitment, add a new segment with the same schedule name and properties. For example, increase Acme’s H100 reservation to 200 GPUs beginning June 15:4. Send capacity usage events
Send immutable heartbeat events at a consistent interval for each SKU and the dimensions needed to aggregate usage. This example reports active H100 GPUs for a cluster every 60 seconds:5. Show billing outcomes
Suppose Acme uses 200 H100 GPUs during a 60-second interval while its active reservation is 120 GPUs:
For that interval, Metronome records:
- 7,200 covered GPU-seconds:
120 GPUs × 60 seconds - 4,800 on-demand GPU-seconds:
80 GPUs × 60 seconds
The reserved-usage line item shows the customer how much capacity was covered by their reservation. The reservation fee and on-demand line item determine the amount due.
Use invoice breakdowns to give customers hourly or daily visibility into covered and on-demand usage. This helps customers reconcile capacity consumption, reservation coverage, and overages.
Best practices
- Keep usage events immutable. Store actual consumption in usage events and calculate the reservation classification from the contract rather than rewriting historical events.
- Use the same evaluation interval as the usage events. If events are sent every 60 seconds, apply the reservation to each 60-second interval before rolling up to the billing-period total.
- Align schedule properties with the reservation scope. If capacity is reserved by SKU, use
skuas the schedule property. Includeregionor other dimensions only when the commercial reservation is scoped to those dimensions.