December 10, 2025

How to Implement Term Discounts in Salesforce Revenue Cloud

Jean-Michel Tremblay

Salesforce Consultant

Term-based discounts were a popular feature in Salesforce CPQ managed package, allowing businesses to offer better pricing for longer subscription commitments. While this functionality isn’t available out-of-the-box in Revenue Cloud core, you can recreate it entirely using point-and-click configuration with decision tables, price adjustment matrices, and formula-based pricing.

In this guide, I’ll walk you through the complete implementation step-by-step.

Term Based Discount - Flow
Term Based Discount – Flow

Use Case

You want to offer discounts based on subscription length:

Term LengthDiscount
0-12 months0%
12-24 months10%
25-36 months15%
37+ months20%

The longer the customer commits, the better the discount they receive.


Prerequisites

Before starting, ensure you have:

  • Salesforce Revenue Cloud enabled in your org
  • An active pricing procedure
  • An active sales transaction context definition
  • System Administrator access or equivalent permissions

Step 1: Create the Term Discounts Custom Object

First, we need a custom object to store our term discount tiers.

Object Configuration

Create a new custom object called Term_Discounts__c with the following settings:

  • Label: Term Discount
  • Plural Label: Term Discounts
  • Name Field: Auto Number (e.g., TD-{0000})
  • Enable: Allow Reports, Track Field History

Custom Fields

Add the following fields to the object:

Field LabelAPI NameTypeDescription
Lower BoundLower_Bound__cNumber(18,0)Minimum months for this tier
Upper BoundUpper_Bound__cNumber(18,0)Maximum months for this tier (optional for last tier)
DiscountDiscount__cPercent(16,2)Discount percentage to apply
Tier TypeTier_Type__cPicklistValues: Percentage, Amount

Sample Data

Create records for your discount tiers:

Lower BoundUpper BoundDiscountTier Type
122410%Percentage
253615%Percentage
37(blank)20%Percentage

Note: Leave Upper Bound blank for the last tier to catch all terms 37 months and above.


Step 2: Create the Quote Line Item Field

We need a field on Quote Line Item to store the calculated number of months.

Create a new field on the Quote Line Item object:

Field LabelAPI NameType
Number of MonthsNumber_of_Months__cNumber(18,0)

This field will be populated by a formula element in the pricing procedure.


Step 3: Create the Decision Table

Decision tables allow the pricing procedure to look up values from your custom object.

Create the Decision Table

  1. Go to SetupDecision Tables
  2. Click New
  3. Configure:
    • Name: Term Discounts
    • Decision Table Type: Standard
  4. Click Save and Next

Configure Source Object

  • Source Object: Term_Discounts__c

Configure Source Fields (Conditions)

Add two condition fields:

Source FieldComparisonOptional
Lower_Bound__cGreater or EqualNo
Upper_Bound__cLess or EqualYes

Important: Make Upper Bound optional because the last tier won’t have an upper limit.

Configure Output Fields

Select the fields to return:

  • Discount__c
  • Tier_Type__c

Activate the Decision Table

After saving, click Activate to make the decision table available. This also refreshes the table data.


Step 4: Add Decision Table to Pricing Recipe

  1. Go to SetupPricing Recipes
  2. Edit your active pricing recipe
  3. Find your new Term Discounts decision table
  4. Click the + button to add it
  5. Set Pricing Component Type to Custom Discount
  6. Save

Step 5: Update Context Definition

The context definition maps your custom field so it’s accessible in the pricing procedure.

Add the Attribute

  1. Go to SetupContext Definitions
  2. Edit your Active Sales Transaction Context
  3. Go to Edit Attributes
  4. Under Sales Transaction Item, add a new attribute:
    • Name: Number of Months
    • Type: Input and Output
    • Data Type: Number
  5. Add a Tag for the attribute (e.g., NumberOfMonths)
  6. Save

Map the Field

  1. In the context definition, go to Quote Entities Mapping
  2. Find Number of Months attribute on the left
  3. Map it to Quote Line ItemNumber_of_Months__c on the right
  4. Save and Publish

Step 6: Update the Pricing Procedure

Now we’ll add the formula and price adjustment matrix to the pricing procedure.

Deactivate the Pricing Procedure

Before making changes, deactivate your active pricing procedure.

Add the Formula Element

Number of Month Calculation formula element

Add a Formula element to calculate the number of months:

Output Variable: Number of Months

Formula:

ROUND(MONTHS_BETWEEN({!Effective_To}, {!Effective_From}), 0)

This formula calculates the difference in months between the subscription start and end dates.

Add the Price Adjustment Matrix

Term Based Discount - Price Adjustment Matrix
Term Based Discount – Price Adjustment Matrix
  1. Add a List Container (or use an existing one)
  2. Inside the container, add a Price Adjustment Matrix element
  3. Configure:

Lookup Table: Term Discounts

Input Rule Variables:

VariableMaps To
Lower BoundNumber of Months
Upper BoundNumber of Months

Input Variables:

VariableMaps To
QuantityLine Item Quantity
Input Unit PriceNet Unit Price

Output Variables:

VariableMaps To
OutputNet Unit Price
SubtotalItem Net Total Price

Configure the Constants

The price adjustment matrix creates constants for the adjustment type and value. Update these:

  1. Find the constants named after your decision table (e.g., Term_Discounts_Adjustment_Type)
  2. Set Adjustment Type constant to: Tier_Type__c
  3. Set Adjustment Value constant to: Discount__c

Rename the Element

Rename the price adjustment matrix to Term Discount – this name appears in the price waterfall.

Reactivate

Save and reactivate the pricing procedure.


Testing Your Implementation

Term Discount - Price Waterfall
Term Discount – Price Waterfall
  1. Create a new Quote
  2. Add a subscription product to the quote
  3. Set the subscription term:
    • For a 12-month term, expect 0% discount
    • For a 24-month term, expect 10% discount
    • For a 36-month term, expect 15% discount
    • For a 48-month term, expect 20% discount
  4. Check the Price Waterfall on the line item to see the term discount applied

Example

For a product with:

  • List Price: $1,000/month
  • Term: 24 months

You should see:

  • List Price: $1,000
  • Term Discount: -10% (-$100)
  • Net Unit Price: $900
  • Subtotal: $21,600 (24 × $900)

Extending the Solution

This implementation can be customized for more complex scenarios:

Product-Specific Discounts

Add a Product lookup field to your Term_Discounts__c object and update the decision table conditions to filter by product.

Account-Based Discounts

Add an Account lookup to offer different term discounts based on customer tier or segment.

Amount-Based Discounts

Use the Amount tier type instead of Percentage to apply fixed dollar discounts.

Multiple Discount Tiers

Create additional custom objects and decision tables for different discount types that can stack.


Summary

In this guide, we recreated CPQ’s term discount functionality in Revenue Cloud using:

  1. Custom Object – To store discount tier configuration
  2. Decision Table – To look up the appropriate discount
  3. Context Definition – To map our custom field
  4. Formula Element – To calculate subscription duration
  5. Price Adjustment Matrix – To apply the discount

This approach is entirely point-and-click and can be extended to handle complex pricing scenarios.


Watch the full video tutorial: Term Discounts in Revenue Cloud

Questions? Leave a comment below or reach out on LinkedIn.


The Cloud Update | Agentforce Revenue Management

Leave a Comment

Free Assessment