Pricing Engine
Overview
Oracle CPQ 23A introduced the Pricing Portal and all-new Pricing Engine UIs to dramatically improve the administrator experience. The Pricing Portal and Pricing Engine UIs use Redwood design standards to align with other Oracle products and provide a foundation for consolidation of CPQ pricing functionality. Users will experience a completely redesigned Redwood UX for Pricing Rules, Price Models (previously known as Pricing Profiles), and Pricing Attributes. The redesigned Pricing Engine supports all existing functionality in addition to enhancements that simplify and modernize the administrator experience in pricing.
The Pricing Portal provides access to Pricing Rules, Price Models, and Pricing Attributes.
Oracle CPQ's Pricing Engine is used to address increasing market requirements to sell products and services in a subscription model. The subscription model allows customers to manage a given product or service as a recurring or usage-based price item. The exact value for a starting or list price is derived by applying various pricing schemes such as flat fee, tiered, usage, overage, etc.
The Pricing Engine supports a wide range of pricing use cases. This is accomplished by Price Models that are defined using Pricing Attributes, applying multiple Price Models to derive the list price for parts and lines, and supporting the ability to provide real-time pricing using RESTful web services.
User-Side Functionality
Customer specific pricing is visible to users when they invoke a Commerce Process. The following table shows how different prices are applied and how they affect the subtotal.
Direct Buy |
$10.00 |
$10.00 |
$5.00 |
$5.00 |
5 |
$50.00 |
$25.00 |
Parts as Recommended Item |
$10.00 |
$8.00 |
$5.00 |
$5.00 |
5 |
$40.00 |
$25.00 |
Part without Customer Pricing |
$10.00 |
$8.00 |
$0.00 |
$8.00 |
5 |
$40.00 |
$40.00 |
Notes:
- The Customer ID (
_customer_id
) field must be populated in order to see this pricing.
- See Commerce System Attributes for more information on how the Subtotal is derived.
Pricing Engine Component Relationships
The following image shows the Pricing Engine components, the interaction between each other, and their relationship with Configuration attributes, Parts attributes, and Commerce attributes.
One Pricing Rule may apply multiple Price Models; and one Price Model may be applied by multiple Pricing Rules
- Pricing Rules are conditions that determine when the Pricing Engine should adjust pricing.
- Only header level pricing attributes (i.e. Transaction / quote level attributes or Configuration attributes that apply to all configuration elements in a Configurations session) can be used in rule conditions.
- Pricing Rules support effective dates for pricing.
-
Price Models (previously known as Pricing Profiles) very simply are containers for prices. They contain a set of price points, a set of discount percentages, or discount unit values that can be applied based on the conditions in Pricing Rules.
Notes:
- The relationship between Pricing Rules and Price Models is a many-to-many relationship. In other words, one Pricing Rule may apply to multiple Price Models and one Price Model may be applied by multiple Pricing Rules.
- The sequencing of Pricing Rules and Price Models is very important because it has a direct impact on the pricing order of operations.
Summary of Pricing Engine Components
Types of Rules (Conditions):
- Basic Rule (aka Customer Specific Pricing – selected customers)
- Simple Rule (simple conditions)
- Advanced Rule (BML)
More Information
|
Types of Conditions:
- Always True
- Simple – simple conditions
Discount Types (types of price values):
- Absolute Price (price points)
- Percent (discounts)
- Amount (discounts)
Dynamic Pricing:
- None (simple values)
- Volume (volume pricing tiers)
- Tier (tier pricing tiers)
- Advanced (BML– Only available with Absolute Price Discount Type)
More Information
|
Data Sources for Attributes:
More Information
|
How does Pricing Engine work with Multiple Commerce Processes?
The CPQ Pricing Engine can calculate the same prices for one or many Commerce Processes, or different prices for different Commerce Processes, depending on your requirements. The Pricing Engine runs as part of the CPQ Pricing Function every time a triggering action is performed. The actual prices returned depend on the conditions you have defined in your setup in Pricing Engine. If no conditions are specified, then Pricing Engine will return the same price for a product across all Commerce Processes.
Pricing conditions can be applied at several levels when prices are calculated, based on the input values present in the Commerce Process main document (Transaction) attributes and sub-document (Transaction Line) attributes. Conditions can be defined as conditions for:
When evaluating these conditions, the transaction-specific values are interpreted by Pricing Engine using the Pricing Engine Pricing Attributes Mapping.
Canonical Pricing Engine Pricing Attributes are those used internally by Pricing Engine. These may be viewed in the Pricing Portal ‘Pricing Attributes’ list page shown below by clicking on the ‘Pricing Attributes’ card on the Pricing Portal page:
These attributes can be used by defining a mapping of these canonical attributes to process-specific attributes and then specifying conditional values for these Pricing Engine Attributes in Pricing Rules, Price Models, Price Model Items, Product Prices and Charges. In the example below, we’ve drilled into the main document (aka ‘Header’) attribute “Price As Of’ and can see that it is mapped to the corresponding date attributes in two different commerce processes:
Only those Pricing Rules and Price Models which evaluate as ‘TRUE’ based on their conditions will return pricing for that Commerce Process, and other CPQ pricing methods will be applied to price the transaction if they exist. If Pricing Engine contains a Price Model called ‘2Q 2024 Pricing’ with a Start Date of April 1, 2024, then transactions in both Commerce Processes will receive this pricing when the Default Request Date and Pricing Effectivity Date attributes are greater than or equal to April 1, 2024.
To apply a Pricing Rule or Price Model to only one Commerce Process, define a condition that will only be true for the desired Commerce Process. You can even make the Commerce Process Name a Pricing Attribute for use as a conditional attribute.
Simple Pricing Engine Example
A specific pricing structure can be created for an individual or multiple accounts. Administrators can create Price Models that contain prices for one or many parts, and if a particular account is tied to that Pricing Rule, they will see the price model pricing. This is done so that when a sales user is quoting a customer that has a pre-determined contract or pricing agreement, this special pricing is visible in the UI once the customer and item(s) have been identified. This is a way to define the list price of a given part, based on customer.
In the following example there are three Pricing Rules. In this example the XYZ Corporation is within the National Account pricing segment.
- The first Pricing Rule is always true and applies the Base Consumer Model. This model is the starting point and is applied to all segments and customers.
- The second Pricing Rule applies to all customers in the National Account pricing segment. This rule is attached to the National Account Model, which defines the discounts or prices for this segment.
- The final rule in this example is specified for the XYZ Corporation. The associated Price Model for this rule implements a negotiated tiered pricing agreement.
When a customer in the XYZ Corporation purchases an item or service, the Base Consumer Pricing is applied, then the price is adjusted according to the National Account Model, and the final price will be set using the Negotiated Agreement Model with Tiers. The Pricing Rules and Price Models are invoked based on the values from the pricing engine attributes (e.g. Configuration Quantity then Commerce Quantity, Pricing Segment, and Account). Oracle CPQ 22C established predefined mapping for these attributes, along with several other frequently used attributes.
Dynamic Volume and Tier Pricing
Administrators can define Volume and Tier pricing to provide differing discounts or prices based in the line quantity. Both volume and tier pricing employ dynamic pricing that is driven by the quantity of an item.
- Volume pricing applies the same price to all items on a single Transaction Line. The price or discount is based upon the quantity (total number of units).
- Tier pricing can apply different unit price values to different items of a single Transaction Line. The total price or discount of the Transaction Line is based on aggregating the pricing brackets for all units of the item for that Transaction Line.
Volume Pricing Example
The following image shows a Price Model with Volume Dynamic Pricing.
- The customer will receive a $20 discount per item when they order more than 30 headphones.
- When the customer orders licenses, they can receive the following discounts:
- $100 discount per item when they order 51 – 150 licenses
- $150 discount per item when they order 151 – 500 licenses
- $200 discount per item when they order 501 or more licenses
Tier Pricing Example
The following image shows a Price Model with Tier Dynamic Pricing. If a customer with tier pricing orders a quantity of 25 web cams, they will receive the following discounts:
- No discount (Tier 1) is applied to the first 10 web cams.
- $5 discount per item (Tier 2) is applied to the next 10 web cams.
- $10 discount per item (Tier 3) is applied to the remaining 5 web cams.
Redwood UX Enhancements
The new Redwood UI provides a consistent approach for actions and navigation. Module actions are provided in the upper right Actions menu. Individual item actions available by clicking the line ellipsis.
Every UI page has a navigation link that will take the admin user to the parent module. The new UX also provides persistent search results and navigation between filtered items. For example, the following image shows a list of filtered search results.
When the admin user opens an item from the filtered search results, the search results are persistent. Navigation arrows are provided in the upper right to allow navigation to the previous or next filtered search result item.
Changes in Naming and Behavior in Recent Releases
Oracle CPQ 23A Pricing Engine Enhancements and Changes in Behavior
- "Pricing Profiles" is renamed "Price Models" to better reflect that they contain price data.
- The "Basic" Pricing Rule is renamed "Customer-Specific" to more accurately represent the nature of this Pricing Rule type.
- The "Discount Type" selection is relabeled "Value Type" to indicate that absolute price values may also be selected as values.
- The Pricing Rule fields "Active", "From", and "To" are renamed as "Status", "Start", and "End".
- The General Site Option Apply only first matching Pricing profile is reworded as Apply only first matching Price model to consistently refer to the renamed Price Model object.
- The Commerce Option Transfer Advanced Pricing Profiles JSON to Commerce is renamed as Transfer Price Model JSON to Commerce to more accurately reflect that the JSON object contains a list of ALL Price Models applied by the Pricing Engine
- Search is enabled in Pricing Rules, Price Models, and Pricing Attributes to easily locate specific results.
- Validations are enhanced by graying out invalid selections rather than flagging an entry when the user attempts to save.
- Users can easily return to the parent object or list page using the "Up" arrow at the top left side of the page.
Oracle CPQ 23B Pricing Engine Enhancements
- Optimized Pricing Engine Performance
Oracle CPQ 23B optimized Pricing Engine performance
by eliminating redundant Pricing Engine invocations during sales user interactions to improve performance.
- BOM Item Product Pricing - Enables the CPQ Pricing Engine to set up and execute different prices for a product based upon the presence and location of the product within a product hierarchy, bundle, or BOM.
- Added new seeded Base Price Model that enhances the pricing administrator user experience by predefining the setup for the base / starting / ceiling price list.
-
Added new seeded BOM Item Variable Name Attribute that automatically supports BOM item product pricing in Pricing Engine without t requiring a pricing administrator to set up this attribute and its mapping.
-
Added new seeded Base Pricing Rule that enhances the pricing administrator user experience by predefining the setup for the Base Price Model at runtime.
Administration
Best Practices
The following will help ensure that your pricing function does not become too large.
-
Any added/changed functionality should be broken into logical modules for each pricing requirement, not all placed into one large add-on function.
Example: If both a requirement for CSP and a requirement for promotional pricing exist, they should each have their own function. This keeps the code organized and manageable.
- Any pricing functionality that is added to the Base Template/standard functionality should be addressed as follows:
- Create a new BML Library for each module; this is where the BML should be written for the new functionality.
Call the BML Library from the pricing function so that it passes through the necessary parameters, such as Base Template/standard Max Discount functionality).
The BML Library call should be assigned to a variable, causing the return value of the BML Library to be stored in that variable.
- When changing Base Template/standard functionality, changes must occur directly in the pricing function or placed in a BML Library and called from the pricing function using the following guidelines:
- Do not put validations in the pricing script; place them in the Validations section or a separate library.
- Eliminate unused code.
- Don’t declare variables unnecessarily. If a variable is used as a static value, do not declare a variable for this purpose.
- If multiple loops are used to iterate through line items, combine them (if possible). This will reduce compile size and improve performance for users.
- Combine conditional blocks of text. If several blocks of text are controlled by the same condition (for example, “if” statements), combine them so that the compiler must only assess the condition once.
Notes
-
Error messages are not clear in bulk upload/download. Error message will currently not tell you why records have failed. Errors can be viewed in the application Error Logs.
-
Siebel Integration is not currently supported.
Notes:
- Customer Specific Pricing supersedes Recommended Item Price.
- In the Pricing Engine, attributes from multiple data sources can be mapped to a single pricing attribute. In some cases, both data sources could be available and have values the pricing engine could use. For example, a part description from Item attributes as well as a text field from a Commerce process. When this occurs, only the first data source listed for that price attribute applies.
- Pricing Attributes created inside Pricing Engine can be mapped to any of the data sources such as: Commerce Attributes, Item Attributes, and Configuration Attributes. When the pricing attributes are mapped to multiple data sources, then they are only a 1:1 map in the top-down order that is on the Mapping page. If the data source of the pricing attribute that is mapped to no longer exists, then it will skip that mapping and goes to the next data source in the top down order, but it always maps 1:1 with only one data source defined in the Mapping page.
- In scenarios where pricing attributes with invalid data source are referred in the condition grid for the Advanced Models, then the application will apply the default value for those pricing attributes based on data type of the pricing attribute. For example if the pricing attribute is String, the empty value is applied as default value. Then the condition grid will be evaluated with the default value of pricing attributes.
- In scenarios where Advanced Models are defined using conditions that contains only those pricing attributes with Commerce attributes or Item attributes as the data source, then the price returned by Pricing Engine will be applied in both Configuration and Commerce consistently. For example, if a pricing attribute named "Customer Segment" is created in the Pricing Engine and it is mapped to Commerce attribute as the data source, an Advanced Model is created and the condition grid contains the "Customer Segment" pricing attribute without any other Configuration attribute. If the customer segment value on the transaction matches with the value set in the condition grid BML, then the resulting price returned by the Pricing Engine will still be applied both in Commerce and Configuration.
Tips and Considerations:
-
A hover tooltip has been added to Admin pages to display the full name of a currency code.
-
FullAccess users can set a customer-specific price of 0 for parts.
-
If the Value Type is Absolute Price, define amounts in USD and EURO. If there is a EURO specific price, populate the amount with the Price Book price.If the Value Type is Discount Amount or Discount Percent, and no CSP exists in a specific currency, set the amount to "0'.
-
Oracle CPQ recommends the Version 4 Pricing Behavior due to the superior performance of Version 4. Refer to Pricing Behavior for more information.
Related Topics
See Also