Welcome to Zuora Product Documentation

Explore our rich library of product information

How Billing rates Dynamic Pricing usage charges

Billing rates Dynamic Pricing usage charges with the By usage record rating group by independently processing each usage record to resolve pricing attributes, determine the effective date, look up prices, enforce min/max constraints, and calculate per-record rated amounts.

When you upload a usage file for a Dynamic Pricing usage charge with rating group By usage record, Billing processes each usage record independently using the following steps:

  1. Extract Usage-based attribute values: Billing reads the values of all Usage custom fields that are mapped to pricing attributes, such as USAGETYPE__C or USAGESTATE__C. These values represent the parts of the pricing context that are only known at event time.

  2. Retrieve non-Usage attribute values: If the Dynamic Pricing charge also uses attributes mapped to non-Usage objects, such as Account or Subscription fields, Billing retrieves the latest values for those attributes from the subscription rate plan charge's pricingAttributes metadata.

  3. Determine the effective date: Billing uses the usage record's start date as the effective date for price lookup. This date is compared with the effective date ranges defined in the Dynamic Pricing decision table.

  4. Look up price in the product catalog: Billing calls the product catalog with:

    • All pricing attribute values collected from the Usage record and mapped Zuora objects, and
    • The effective date derived from the usage start date.

    The catalog attempts to find a matching row in the Dynamic Pricing decision table. If a negotiated price table has been configured for this usage charge, the catalog evaluates the negotiated entries first and falls back to the standard price table for any combinations that are not overridden.

  5. Apply min/max price constraints: If the decision table defines min and max price limits, Billing enforces those constraints as follows:

    • Per-unit model: min and max amounts are defined at the charge level and applied to the extended amount for each usage record.
    • Tiered and Volume models: min and max amounts are defined for each tier and applied to the amount computed within that tier.
  6. Calculate the rated amount: Billing multiplies the resolved unit or tier price by the usage quantity from the record, applies any configured min/max constraints, and persists the rated amount for invoicing and reporting. The total billed amount for the charge in a billing period is the sum of the per-record rated amounts.

Use case: Per-unit model with Usage-only attributes and charge-level min/max

In this example, the Dynamic Pricing decision table uses two attributes:

  • UsageType, mapped to Usage custom field USAGETYPE__C
  • UsageState, mapped to Usage custom field USAGESTATE__C

The table defines a per-unit price and a charge-level min and max amount for each combination of UsageType and UsageState.

Dynamic pricing decision table

The usage record:

ACCOUNT_ID

UOM

QTY

STARTDATE

ENDDATE

SUBSCRIPTION_ID

CHARGE_ID

USAGETYPE__C

USAGESTATE__C

A00000005

Each

90

03/01/2026

A-S00000020

C-00000031

Inbound

FL

A00000005

Each

650

03/02/2026

A-S00000020

C-00000031

Outbound

NY

A00000005

Each

120

03/02/2026

A-S00000020

C-00000031

Outbound

CA

Rating result:

  • 90 * $13 = 1170 < Min (1300), rated amount is $1,300 (The unit price $13 is based on the standard rate card entry row 3).

  • 650 * $21 = 13650 > Max (10500), rated amount is $10,500 (The unit price $21 is based on the standard rate card entry row 5).

  • 120 * $20 = 2400 > Min (2200), < Max (10000), rated amount is $2,400 (The unit price $20 is based on the standard rate card entry row 4).

The total rated amount of this usage charge is $14,200.

Use case: Volume charge model with both Usage and non-Usage pricing attributes, and negotiated price table

In the negotiated price table for usage charge

  • UsageState is mapped to the Usage object custom field: USAGESTATE__C.
  • Account_type is mapped to the Account object custom field: type__c.
  • The rate card entry of “UsageState = FL, account_type = AT1” has been negotiated with a new price from 2026/02/01, see rows 19-21.
Negotiated price table

The usage record:

ACCOUNT_ID

UOM

QTY

STARTDATE

ENDDATE

SUBSCRIPTION_ID

CHARGE_ID

DESCRIPTION

USAGESTATE__C

A00000005

Each

180

02/09/2026

A-S00000022

C-00000035

FL

A00000005

Each

350

02/10/2026

A-S00000022

C-00000035

FL

A00000005

Each

95

02/08/2026

A-S00000022

C-00000035

CA

When the Usage charge is subscribed, Account A00000005’s type__c value is “AT1”.

Rating result:

  • 180 * $95 (tier 2) = $17,100 (The unit price $95 is based on the negotiated rate card entry row 20).

  • 350 * $85 (tier 3) = $29,750 (The unit price $85 is based on the standard rate card entry row 21).

  • 95 * $90 (tier 1) = $8,550 (The unit price $90 is based on the standard rate card entry row 1).

The total rated amount of this usage charge is $55,400.00.

Note: Each usage record is rated individually for the volume charge model. Even though the record 1 (quantity = 180) and record 2 (quantity = 350) share the same price tiers, they are rated against the individual quantity instead of the cumulative quantity.