Differential pricing helps implement a pricing strategy for addons and charges based on the plans they’re purchased with. A differential price a specific price for an addon- or charge-item price when purchased along with a particular plan.

Differential pricing for addons

Consider an addon called 24x7 Customer Support provided with a cloud storage service. You can configure differential prices for each of the addon-item prices based on the plan they are purchased with, as follows:

   Addon item price  Price when applied to Standard Plan  Price when applied to Enterprise Plan
1 24x7 Customer Support, USD, Monthly, Flat fee, $100  $90 $150 
2 24x7 Customer Support, USD, Yearly, Flat fee, $1000  $900 $1500 

Differential pricing for charges

Consider a charge, called Setup fee, for installing and configuring a cloud-based project management platform. There are two modes in which you can set up differential pricing for a charge:

Mode A: One charge differential price per plan-item

This mode is used to specify one differential price for the charge-item price per plan-item it is applied to.

 Charge-item price  

Price when applied to Standard plan


Price when applied to Enterprise plan 

Setup fee, USD, Flat fee $500   $400  $700

Mode B: Multiple charge differential prices per plan item

This mode is used to specify multiple differential prices for the charge per plan-item, based on the plan period.

 Charge-item price  

    Price when applied to Standard plan, 6 months


Price when applied to Standard plan, yearly 

Setup fee, USD, Flat fee $500   $400  $300

In the above example, even if the “6 month” or “yearly” plan-item prices do not exist, the differential prices for the charge can still be created. They take effect whenever the plan-item prices are eventually created and used in subscriptions.

Sample differential price [ JSON ]

{ "created_at": 1594110587, "currency_code": "USD", "id": "1b53489f-d5b7-45e3-a010-b11ca19cbc27", "item_price_id": "day-pass-USD", "object": "differential_price", "parent_item_id": "basic", "price": 100, "resource_version": 1594110587730, "status": "active", "updated_at": 1594110587 }

API Index URL GET

https://{site}.chargebee.com/api/v2/differential_prices
id
A unique and immutable id for the differential price. It is auto-generated when the differential price is created.
string, max chars=100
item_price_id
The id of the item price (addon or charge) whose price should change according to the plan-item it is applied to.
string, max chars=50
parent_item_id
The id of the plan-item, in relation to which, the differential pricing for the addon or charge is defined. For example, this would be the id of the Standard or Enterprise plans-items mentioned in the examples above.
string, max chars=50
price
The differential price. If the pricing model of the item_price_id is tiered, volume, or stairstep, pass tiers instead of this.
optional, in cents, min=0
price_in_decimal
The price of the item when the pricing_model is flat_fee. When the pricing model is per_unit, it is the price per unit quantity of the item. Not applicable for the other pricing models. The value is in decimal and in major units of the currency. Also, this is only applicable when multi-decimal pricing is enabled.
optional, string, max chars=33
status
The item family state.
optional, enumerated string
Possible values are
activeNew items can be created with the item family.deletedNo items allowed for the item family.
resource_version
Version number of this resource. Each update of this resource results in incremental change of this number. This attribute will be present only if the resource has been updated after 2016-09-28.
optional, long
updated_at

optional, timestamp(UTC) in seconds
created_at

timestamp(UTC) in seconds
modified_at

timestamp(UTC) in seconds
currency_code
The currency code (ISO 4217 format) of the plan.
string, max chars=3
List of quantity-based pricing tiers for the differential price. Applicable only for tiered, volume, and stairstep pricing_model s. The tiers are exactly the same as those set for the item price. Only the price attribute for the various tiers can be overridden for the differential price.
optional, list of tier
Tier attributes
starting_unit
The lower limit of a range of units for the tier.
integer, min=1
ending_unit
The upper limit of a range of units for the tier.
optional, integer
price
The per-unit price for the tier when the pricing_model is tiered or volume; the total cost for the item price when the pricing_model is stairstep. The value is in the minor unit of the currency.
in cents, default=0, min=0
parent_periods
Show attributes[+]
When item_price_id is a charge-item, you can specify the plan period for which the price applies. Although an array, currently you can specify only one period. In other words, only index 0 is allowed. Create another differential price to specify another period. Is permitted only when item_price_id is a charge-item.
optional, list of parent_period
Parent period attributes
period_unit
The unit of time for period.
enumerated string
Possible values are
dayA period of 24 hours.weekA period of 7 days.monthA period of 1 calendar month.yearA period of 1 calendar year.
period
The billing period of the plan in period_units. For example, a 6 month plan has period as 6 and period_unit as month.
optional, jsonarray
Sample Request
# create differential price for addon item price
curl  https://{site}.chargebee.com/api/v2/item_prices/day-pass-USD/differential_prices \
     -X POST  \
     -u {site_api_key}:\
     -d parent_item_id="basic" \
     -d price=100
copy

Sample Response [ JSON ]

URL Format POST

https://{site}.chargebee.com/api/v2/item_prices/{item_price_id}/differential_prices
parent_item_id
The id of the plan-item, in relation to which, the differential pricing for the addon or charge is defined. For example, this would be the id of the Standard or Enterprise plans-items mentioned in the examples above.
required, string, max chars=50
price
The differential price. If the pricing model of the item_price_id is tiered, volume, or stairstep, pass tiers instead of this.
optional, in cents, min=0
price_in_decimal
The price of the item when the pricing_model is flat_fee. When the pricing model is per_unit, it is the price per unit quantity of the item. Not applicable for the other pricing models. The value is in decimal and in major units of the currency. Also, this is only applicable when multi-decimal pricing is enabled.
optional, string, max chars=33
+
parent_periods
Parameters for parent_periods. Multiple parent_periods can be passed by specifying unique indices.
pass parameters as parent_periods[<param name>][<idx:0..n>]
parent_periods[period_unit][0..n]
The unit of time for period.
required, enumerated string
Possible values are
dayA period of 24 hours.weekA period of 7 days.monthA period of 1 calendar month.yearA period of 1 calendar year.
parent_periods[period][0..n]
The billing period of the plan in period_units. For example, a 6 month plan has period as 6 and period_unit as month.
optional, jsonarray
+
tiers
Parameters for tiers. Multiple tiers can be passed by specifying unique indices.
pass parameters as tiers[<param name>][<idx:0..n>]
tiers[starting_unit][0..n]
The lower limit of a range of units for the tier.
optional, integer, min=1
tiers[ending_unit][0..n]
The upper limit of a range of units for the tier.
optional, integer
tiers[price][0..n]
The per-unit price for the tier when the pricing_model is tiered or volume; the total cost for the item price when the pricing_model is stairstep. The value is in the minor unit of the currency.
optional, in cents, default=0, min=0
tiers[starting_unit_in_decimal][0..n]
The decimal representation of the the lowest value of quantity in this tier. This is zero for the lowest tier. For all other tiers, it is the same as ending_unit_in_decimal of the next lower tier. Returned only when the pricing_model is tiered, volume or stairstep and multi-decimal pricing is enabled.
optional, string, max chars=33
tiers[ending_unit_in_decimal][0..n]
The decimal representation of the highest value of quantity in this tier. This attribute is not applicable for the highest tier. For all other tiers, it must be equal to the starting_unit_in_decimal of the next higher tier. Returned only when the pricing_model is tiered, volume or stairstep and multi-decimal pricing is enabled.
optional, string, max chars=33
tiers[price_in_decimal][0..n]
The decimal representation of the per-unit price for the tier when the pricing_model is tiered or volume. When the pricing_model is stairstep, it is the decimal representation of the total price for the addon. The value is in major units of the currency. Returned when the plan is quantity-based and multi-decimal pricing is enabled.
optional, string, max chars=33
Resource object representing differential_price.
always returned
Sample Request
curl  https://{site}.chargebee.com/api/v2/differential_prices/9d6e5ac7-5c3a-4b63-a148-c182d51ed122 \
     -u {site_api_key}:\
     -d item_price_id="sample-addon-weekly-usd"
copy

Sample Response [ JSON ]

URL Format GET

https://{site}.chargebee.com/api/v2/differential_prices/{differential_price_id}
item_price_id
The id of the item price (addon or charge) whose price should change according to the plan-item it is applied to.
required, string, max chars=50
Resource object representing differential_price.
always returned
Sample Request
curl  https://{site}.chargebee.com/api/v2/differential_prices/304e773d-2538-4dd8-89d8-d9b478724e21 \
     -X POST  \
     -u {site_api_key}:\
     -d item_price_id="additional-user-addon-USD" \
     -d price=350
copy

Sample Response [ JSON ]

URL Format POST

https://{site}.chargebee.com/api/v2/differential_prices/{differential_price_id}
item_price_id
The id of the item price (addon or charge) whose price should change according to the plan-item it is applied to.
required, string, max chars=50
price
The differential price. If the pricing model of the item_price_id is tiered, volume, or stairstep, pass tiers instead of this.
optional, in cents, min=0
price_in_decimal
The price of the item when the pricing_model is flat_fee. When the pricing model is per_unit, it is the price per unit quantity of the item. Not applicable for the other pricing models. The value is in decimal and in major units of the currency. Also, this is only applicable when multi-decimal pricing is enabled.
optional, string, max chars=33
+
parent_periods
Parameters for parent_periods. Multiple parent_periods can be passed by specifying unique indices.
pass parameters as parent_periods[<param name>][<idx:0..n>]
parent_periods[period_unit][0..n]
The unit of time for period.
required, enumerated string
Possible values are
dayA period of 24 hours.weekA period of 7 days.monthA period of 1 calendar month.yearA period of 1 calendar year.
parent_periods[period][0..n]
The billing period of the plan in period_units. For example, a 6 month plan has period as 6 and period_unit as month.
optional, jsonarray
+
tiers
Parameters for tiers. Multiple tiers can be passed by specifying unique indices.
pass parameters as tiers[<param name>][<idx:0..n>]
tiers[starting_unit][0..n]
The lower limit of a range of units for the tier.
optional, integer, min=1
tiers[ending_unit][0..n]
The upper limit of a range of units for the tier.
optional, integer
tiers[price][0..n]
The per-unit price for the tier when the pricing_model is tiered or volume; the total cost for the item price when the pricing_model is stairstep. The value is in the minor unit of the currency.
optional, in cents, min=0
tiers[starting_unit_in_decimal][0..n]
The decimal representation of the the lowest value of quantity in this tier. This is zero for the lowest tier. For all other tiers, it is the same as ending_unit_in_decimal of the next lower tier. Returned only when the pricing_model is tiered, volume or stairstep and multi-decimal pricing is enabled.
optional, string, max chars=33
tiers[ending_unit_in_decimal][0..n]
The decimal representation of the highest value of quantity in this tier. This attribute is not applicable for the highest tier. For all other tiers, it must be equal to the starting_unit_in_decimal of the next higher tier. Returned only when the pricing_model is tiered, volume or stairstep and multi-decimal pricing is enabled.
optional, string, max chars=33
tiers[price_in_decimal][0..n]
The decimal representation of the per-unit price for the tier when the pricing_model is tiered or volume. When the pricing_model is stairstep, it is the decimal representation of the total price for the addon. The value is in major units of the currency. Returned when the plan is quantity-based and multi-decimal pricing is enabled.
optional, string, max chars=33
Resource object representing differential_price.
always returned
Sample Request
curl  https://{site}.chargebee.com/api/v2/differential_prices/0680411c-33c0-4252-a9a8-e34a3b976711/delete \
     -X POST  \
     -u {site_api_key}:\
     -d item_price_id="sample-addon-USD"
copy
curl  https://{site}.chargebee.com/api/v2/differential_prices/0680411c-33c0-4252-a9a8-e34a3b976711/delete \
     -X POST  \
     -u {site_api_key}:\
     -d item_price_id="sample-addon-USD"

Sample Response [ JSON ]

Show more...
{"differential_price": { "created_at": 1594110588, "currency_code": "USD", "id": "0680411c-33c0-4252-a9a8-e34a3b976711", "item_price_id": "sample-addon-USD", "object": "differential_price", "parent_item_id": "basic", "price": 100, "resource_version": 1594110588167, "status": "deleted", "updated_at": 1594110588 }}

URL Format POST

https://{site}.chargebee.com/api/v2/differential_prices/{differential_price_id}/delete
item_price_id
The id of the item price (addon or charge) whose price should change according to the plan-item it is applied to.
required, string, max chars=50
Resource object representing differential_price.
always returned

Returns a list of differential prices satisfying all the conditions specified in the filter parameters below. The list is sorted by the date of creation in descending order (latest first).

Sample Request
curl  https://{site}.chargebee.com/api/v2/differential_prices \
     -G  \
     -u {site_api_key}:\
     --data-urlencode limit=2
copy
curl  https://{site}.chargebee.com/api/v2/differential_prices \
     -G  \
     -u {site_api_key}:\
     --data-urlencode limit=2

Sample Response [ JSON ]

Show more...
{ "list": [ {"differential_price": { "created_at": 1594110588, "currency_code": "USD", "id": "e1340212-f684-4555-a0e2-a698c0081b1a", "item_price_id": "day-pass-USD-tier-weekly", "object": "differential_price", "parent_item_id": "basic", "resource_version": 1594110588073, "status": "active", "tiers": [ { "ending_unit": 10, "price": 120, "starting_unit": 1 }, {..} ], "updated_at": 1594110588 }}, {..} ], "next_offset": "1" }

URL Format GET

https://{site}.chargebee.com/api/v2/differential_prices
limit
The number of resources to be returned.
optional, integer, default=10, min=1, max=100
offset
Determines your position in the list for pagination. To ensure that the next page is retrieved correctly, always set offset to the value of next_offset obtained in the previous iteration of the API call.
optional, string, max chars=1000
Filter Params
For operator usages, see the Pagination and Filtering section.
item_price_id[<operator>]
The id of the item price (addon or charge) whose price should change according to the plan-item it is applied to.
Supported operators : is, is_not, starts_with, in, not_in

Example item_price_id[is] = "day-pass-USD"
optional, string filter
item_id[<operator>]
Item Id of Addon / Charge item price for which differential pricing is applied to.
Supported operators : is, is_not, starts_with, in, not_in

Example item_id[is_not] = "day-pass"
optional, string filter
id[<operator>]
A unique and immutable id for the differential price. It is auto-generated when the differential price is created.
Supported operators : is, is_not, starts_with, in, not_in

Example id[is] = "defcc4f1-f21f-47f4-8019-beddb9beab5f"
optional, string filter
parent_item_id[<operator>]
The id of the plan-item, in relation to which, the differential pricing for the addon or charge is defined. For example, this would be the id of the Standard or Enterprise plans-items mentioned in the examples above.
Supported operators : is, is_not, starts_with, in, not_in

Example parent_item_id[is] = "basic"
optional, string filter
Resource object representing differential_price.
always returned
next_offset
This attribute is returned only if more resources are present. To fetch the next set of resources use this value for the input parameter “offset”.
optional, string, max chars=1000