Pricing Options
Overview
CPQ’s pricing-related settings have been consolidated within Pricing Options in the Pricing Portal. The Pricing Options card, within the Pricing Portal provides access the pricing settings.
The following pricing-related settings are now available in Pricing Options.
Apply Only the First Matching Price Model
This option determines if one or multiple Price Models are applied to a part during pricing evaluation.
- Yes: (default) Only the first Price Model that matches the Pricing Rule criteria to the part. If the same part is in multiple Pricing Rules, and within multiple Price Models within a rule, the Pricing Rule price value is derived from the first rule (as shown in the list of rules on the Administration page) and the first Price Model within the rule (as shown in the Linked Price Models section for the rule).
- No: All Price Models that match the Pricing Rule criteria to the part.
For the following example, assume all of the Pricing Rules and models logically apply to the part, and that the rules and models are shown in ordered sequence.
- If Apply only the first matching Price model is set to YES the price for Part A will be $100.
- Only the price defined in Price Model 1 will be applied.
-
If Apply only the first matching Price model is set to NO the price for Part A will be $80.
- The pricing adjustments for Model 1, 2 and 3 will all be applied in a sequential chain (i.e. The output price for one model is the input to the next model, in sequence)
- Model 1 - Price = $100 > Model 2 - Price = $90 ($100 - %10) > Model 3 - Price = $80 ($90 - $10)
Transfer Price Model JSON to Commerce
This pricing option determines whether to transfer Pricing Engine calculation information JSON from Price Models to Commerce line attribute calculation information _price_calculation_info
.
- On - Send Price Model JSON information to Commerce.
-
Off – Don't send Price Model JSON information to Commerce. *default value
Turn this option off for better performance if you don't use this functionality in Commerce.
This option modifies the order of actions and calculation of prices. Depending on your adoption of Pricing Engine, this setting may have been set automatically and may limit which options you may choose.
Important: Switching from one Pricing option to another may impact existing pricing and past transactions within the system. Oracle recommends thoroughly testing the impact of the Pricing option change before implementing the change in a production environment. Once the Pricing option is changed in a production environment, returning transaction data to its previous state may require significant effort.
- Version 1 represents the legacy pricing behavior. If you adopt CPQ Pricing Engine for pricing calculation, you should use pricing behavior Version 2 or higher.
- Version 2 runs the CPQ Pricing Engine as part of pricing calculations and provides for the following adjustments to the Invocation and Pricing flows: Main Document attributes populate before the Sub Document modify execution occurs; and Global Pricing calculations occur immediately before the execution of Formulas.
- Version 3 retains all Version 2 adjustments in addition to the following change: The Document Advanced Default BML will no longer execute when the 'Revert to Default' selection is selected for attribute(s) on the modify tab of an Action.
-
Version 4 retains all Version 3 adjustments and improves commerce pricing performance. Pricing Calculation is optimized to run once in Commerce actions between Before Formula and Formula. As a result, the pricing calculation result is accessible in Formula and After Formula BML, but is not available in Before Formula BML.
Pricing Behavior Version 4 is available beginning in Oracle CPQ 23B. Version 4 enables the following pricing behaviors:
- Main document attributes populate before the sub-document modify execution occurs.
- Global Pricing calculations occur immediately before the execution of Formulas.
- The document Advanced Default BML will no longer execute when the "Revert to Default" selection is selected for attribute(s) on the modify tab of an Action.
The _pricing_engine_info
item, previously returned by Pricing Engine to Commerce quote lines, is deprecated in Pricing Behavior Version 4. This item duplicated the data returned by Pricing Engine in _price_calculation_info
Beginning in Oracle CPQ 23D, Charge Definitions can be used to categorize charges. When enabled, the Pricing administrator selects a Charge Definition first when creating a charge.
- On - Enable Charge Definitions
- Off – Disable Charge Definitions
You must turn this option on to integrate with Oracle Fusion Order Management.
Enable Currency Conversion in Pricing Engine
This option enables the Pricing Engine to reference CPQ Exchange Rates to automatically convert prices from the base currency to other enabled currencies on the site. When enabled, customers only need to set the site base price currency for a product price or charge and the other enabled currencies can be automatically generated.
-
On - Enable the Pricing Engine to activate automatic currency conversion from the site base currency for unspecified enabled currencies.
-
Off - Disable automatic currency conversion. When no price is defined in Pricing Engine for the transaction currency, the pricing applied falls back to the previous Price Model price, Price Book price, or Part price that is available in the transaction currency. This is the legacy behavior for CPQ Pricing.
Notes:
-
Oracle CPQ strongly recommends that customers enable the Enable Currency Conversion in Pricing Engine option.
-
Conversion rates must be defined for each currency in which you wish to convert prices, refer to CPQ Exchange Rates.
Apply multiple charges in a price list as a whole
When this option is enabled, multiple charges from absolute Price List type price models are applied as a whole. In other words, CPQ will only apply equivalent charges from the last absolute Price List type price model. When this option is disabled, the charges are applied additively.
For example, two absolute price value Price Lists are applicable for a product. Price list 1 has charges A & B, price list 2 has charges B & C.
-
When this option is enabled, the final charges are charges B & C.
-
When the option is disable, all charges (A, B, and C) are applied.
The default value for this option is Off. If a site does not have any pricing data, the default value for this option is set to On.
Apply adjustments on existing charges only
When this option is enabled, a discount or markup to a charge is only applied if the target charge has been established in a previous absolute Price List type price model.
For example, part 1 has a $5 Activation charge discount, but no Activation charge has been defined.
-
When this option is enabled, the $5 discount is not applied.
-
When this option is disabled, a -$5 charge is applied.
The default value for this option is Off to support existing implementations. If a site does not have any pricing data, the default value for this option is set to On
Observe commerce process Steps for the pricing action in quoting
When this option is enabled, pricing calculation is only executed in Commerce if the Commerce Recalculate action is active in the current Commerce Process Workflow Step. It also ensures that Commerce sub-document actions only invoke pricing immediately before Formulas for Pricing Behaviors v2 or higher.
The default value for this option is Off to support existing implementations. If a site does not have any pricing data or Advanced Price Models, the default value for this option is set to On
Enable Pricing Portal Administration Logging
When enabled, changes to pricing made in the Pricing Portal, Product Workbench, or with any of the Pricing REST APIs are recorded in the Administration Logs.
Note: Logging can negatively impact performance. Validate performance before enabling Pricing Portal Administration Logging in a production environment.
Enable incremental pricing in quoting
When incremental pricing is enabled, only line items whose pricing attributes are changed are repriced. If any transaction level attribute is changed, all line items are repriced. When this option is disabled, all line items are repriced when any line items is changed or if any transaction level attribute is changed.
Notes: You are recommended to turn this option on if all line items are priced independently.
Apply context-dependent data source in Pricing Attribute Mapping
The Apply context-dependent data source in Pricing Attribute Mapping option is only applicable when a Pricing Attribute has attribute mappings to two or more different types of Data Sources (e.g. a Configuration model and a Commerce process).
If a pricing attribute happens to have a default value populated in the pricing attribute detail page, that value will be utilized only after all the data sources are exhausted.
-
When this option is On, the Pricing Attribute uses the Data Source corresponding to the current invocation context.
-
When this option Off, the Pricing Attribute honors the Attribute Mapping order number.
For example, assume a Pricing Attribute has two Data Sources: a Configuration model and a Commerce process. When this option is On, the Pricing Attribute uses the Configuration Data Source in the Configuration model, and the Commerce Data Source in the Commerce process. When this option is Off, the Pricing Attribute uses the Data Source with the lowest order number in the Pricing Attribute's Attribute Mapping.
-
The default for this option is Off for customers currently using Pricing Engine. If a site does not have any pricing data or any Advanced Pricing Models yet defined the default for this option is On.
-
To find the order number for an attribute, check the Pricing Attribute detail page.
Scripting
Scripting options provide the ability to associate a BML script for Pricing Engine to execute before and/or after the standard Pricing Engine calculations. Administrators now use BML scripting to add new charges, modify the price, and change certain attribute values.
BML scripts can be used to set the initial values for prices, charges, or pricing attributes for subsequent processing in Pricing Engine. For example, Customer Segment can we calculated based on logic or a data table and then used as input to Pricing Engine. BML scripts can also be used to perform post-processing of Pricing Engine outputs. For example, customers could enforce the lowest floor price by using the lower of the Pricing Engine or floor price. Another benefit is that the BML processes the whole pricing document (the pricing header and all line items) as a whole. This allows the BML to batch queries. It is also useful to handle situations when one line item's price depends on another line item.
Pricing Script: Before Pricing Engine Execution
When this option is enabled, the customer provided BML script is executed before the start of pricing engine execution.
Example Before Pricing Engine Execution script
/Ensure that all pricing and charge attributes that are either read or updated are selected in the inputs. //Failure to do so can result in errors during saving or execution. //Get the Sales Channel from the header. salesChannel = jsonget(pricingDocument,"salesChannel_c","string","none"); //Get the Customer Industry from the header. customerIndustry = jsonget(pricingDocument,"customerIndustry_c","string","none"); //Now query the data table using BMQL and then set the customer's price sensitivity. customerPriceSensitivity = ""; results = bmql("select PriceSensitivity from PriceSensitivity where SalesChannel = $salesChannel and CustomerIndustry = $customerIndustry "); for result in results { customerPriceSensitivity = get(result, "PriceSensitivity"); } //Update the customer's price sensitivity so that the correct price models are activated. jsonput(pricingDocument,"customerPriceSensitivity_c",customerPriceSensitivity); //Finally return the pricing document. return pricingDocument;
Pricing Script: After Pricing Engine Execution
When this option is enabled, the customer provided BML script is executed after the end of pricing engine execution.
Example After Pricing Engine Execution script
/Ensure that all pricing and charge attributes that are either read or updated are selected in the inputs. //Failure to do so can result in errors during saving or execution. //Get the lines and start adjusting the charges. lines = jsonget(pricingDocument,"lines","jsonarray"); //Find the size so that an integer array representing the indices can be created. linesize = jsonarraysize(lines); //Build the indices array. lineIdxArr = range (linesize); //Iterate through the lines for lineIdx in lineIdxArr { //Extract the line as JSON line = jsonarrayget(lines,lineIdx,"JSON"); //Get hold of the charges for this line. charges = jsonget(line,"charges","jsonarray"); //Use JsonPath to efficiently locate the node. //Here, we are interested in extracting the unit price of the One-Time Shipping Freight charge. shippingFeeJsonPath = "$.charges[?(@.chargeType == 'freight' && @.priceType == 'One Time')].unitPrice"; //Locate the freight charge. //Assign a default value of 0.0 if such a charge is not found. shippingFee = jsonpathgetsingle(line,shippingFeeJsonPath,"float",0.0); //Add a handling fee for line that has a non zero shipping charge. if (shippingFee > 0.0){ //Create the One Time Handling Charge. handlingFee = json(); jsonput(handlingFee,"priceType","One Time"); jsonput(handlingFee,"chargeType","handling"); //Adds a 15% handling fee for the shipping charge. jsonput(handlingFee,"unitPrice",shippingFee * 0.15); //It's a good practice to add/update the calculation info for more diagnostic information. calcInfo = json(); jsonput(calcInfo,"message","One time fee for handling the Shipping Freight"); calcInfoArr = jsonarray(); jsonarrayappend(calcInfoArr,calcInfo); //Insert the handling charge to the incoming charges jsonarrayappend(charges,handlingFee); }
//Remove the processing fee for highly price-sensitive customers. //Get the Customer's Price Sensitivity. priceSensitivity = jsonget(pricingDocument,"customerPriceSensitivity_c","string","<empty>"); //Check if its high. if (priceSensitivity == "high") { //Iterate through the charges and find the index of the processing Fee and then remove it. chargeArrIdx = range(jsonarraysize(charges)); for chgIdx in chargeArrIdx { //Get the Charge as json. charge = jsonarrayget(charges,chgIdx,"json"); //Get the Charge Type. chargeType = jsonget(charge,"chargeType","string","<empty>"); //Get the Price Type. priceType = jsonget(charge,"priceType","string","<empty>"); //Check if this is a processing charge. if (chargeType == "processingFee" and priceType == "One Time") { //Remove the charge using the index (chgIdx). jsonarrayremove(charges,chgIdx); break; } } } } //Return the pricing document after adjusting the charges. return pricingDocument;
Administration
Complete the following steps to set pricing options.
-
Navigate to the Admin page.
-
Click Pricing Portal in the Products section.
-
Click on the Pricing Options card.
-
Click Edit.
-
Set the Apply Only the First Matching Price Model option.
This option determines if one or multiple Price Models are applied to a product during pricing evaluation.
-
On - Only the first Price Model that matches the Pricing Rule and Price Model criteria for a product. *default value
If the same product is in multiple Pricing Rules, and within multiple Price Models within a rule, the Pricing Rule price value is derived from the first rule (as shown in the list of rules on the Administration page) and the first Price Model within the rule (as shown in the Linked Price Models section for the rule) that applies to the product and context.
-
Off - All Price Models that match the Pricing Rule and Price Model criteria for a product are applied.
-
-
Select the Pricing Behavior version.
This option modifies the order of actions and calculation of prices.
Important: Switching from one Pricing option to another may impact existing pricing and past transactions within the system. Oracle recommends thoroughly testing the impact of the Pricing option change before implementing the change in a production environment. Once the Pricing option is changed in a production environment, returning transaction data to its previous state may require significant effort.
Depending on your adoption of Pricing Engine, this setting may have been set automatically and may limit which options you can choose.
- Version 1 represents the legacy pricing behavior. If you adopt CPQ Pricing Engine for pricing calculation, you should use pricing behavior Version 2 or higher.
- Version 2 runs the CPQ Pricing Engine as part of pricing calculations and provides for the following adjustments to the Invocation and Pricing flows: Main Document attributes populate before the Sub Document modify execution occurs; and Global Pricing calculations occur immediately before the execution of Formulas.
- Version 3 retains all Version 2 adjustments in addition to the following change: The Document Advanced Default BML will no longer execute when the 'Revert to Default' selection is selected for attribute(s) on the modify tab of an Action.
-
Version 4 retains all Version 3 adjustments and improves commerce pricing performance. Pricing Calculation is optimized to run once in Commerce actions between Before Formula and Formula. As a result, the pricing calculation result is accessible in Formula and After Formula BML, but is not available in Before Formula BML.
-
Select one of the following Charge Definition options:
- Set Enable Charge Definitions to On.
- Click Save or Update.
-
If you have not yet defined any pricing in CPQ using the new productized Charge feature,
click Proceed to complete the enabling of Charge Definitions.--OR—
If you have defined Charges pricing in CPQ, complete the following:
- Select Generate Charge Definitions Only to automatically create the Charge Definitions from the combinations of Price Type and Charge Type that you have already used.
- Review and verify the Charge Definitions that have been automatically created before taking the next step.
-
Once you are satisfied with the Charge Definitions you will be using, click Proceed and the Charge Definitions will be automatically populated on each existing pricing charge.
- Set Enable Charge Definitions to Off.
-
Click Save or Update.
-
Click Proceed to clear all pricing data of their Charge Definition values.
-
Set the Transfer Price Model JSON to Commerce option.
This option determines whether to transfer Pricing Engine calculation information JSON from Price Models to Commerce line attribute calculation information
_price_calculation_info
.-
On - Send Price Model JSON information to Commerce.
-
Off – Don't send Price Model JSON information to Commerce. *default value
Turn this option off for better performance if you don't use this function in Commerce.
-
-
Set the Enable Currency Conversion in Pricing Engine option.
This option enables the Pricing Engine to reference CPQ Exchange Rates to automatically convert prices from the base currency to other enabled currencies on the site.
-
On - Enable automatic currency conversion from the site base currency for unspecified enabled currencies.
-
Oracle CPQ strongly recommends that customers enable the Enable Currency Conversion in Pricing Engine option.
-
Conversion rates must be defined for each currency in which you wish to convert prices, refer to CPQ Exchange Rates.
-
-
Off - Disable automatic currency conversion. When no price is defined in Pricing Engine for the transaction currency, the pricing applied falls back to the previous Price Model price, Price Book price, or Part price that is available in the transaction currency. This is the legacy behavior for CPQ Pricing.
-
-
Set the Apply multiple charges in a price list as a whole option.
This option determines how charges from multiple absolute Price List type price models are applied.
as a whole. In other words, CPQ will only apply equivalent charges from the last absolute Price List type price model.
-
On - Apply multiple charges from absolute Price List type price models as a whole. Only charges from the last absolute Price List type price model are applied.
-
Off - Apply multiple charges additively. *default value
If a site does not have any pricing data, the default value for this option is set to On.
-
-
Set the Apply adjustments on existing charges only option.
-
On - Only apply discounts or markups to a charge if the target charge has been established in a previous absolute Price List type price model.
-
Off - Apply discounts or markups to a charge even if a target charge has NOT been established in a previous absolute Price List type price model. *default value
If a site does not have any pricing data, the default value for this option is set to On.
-
-
Set the Observe commerce process Steps for the pricing action in quoting option.
-
On - Only invoke pricing calculation Commerce if the Commerce Recalculate action is active in the current Commerce Process Workflow Step. It also ensures that Commerce sub-document actions only invoke pricing immediately before Formulas for Pricing Behaviors v2 or higher.
-
Off - Invoke pricing calculation for all Commerce main document actions. Pricing calculation is invoked even if the pricing action is disallowed in the current Commerce Process Workflow Step. *default value
If a site does not have any pricing data or Advanced Price Models, the default value for this option is set to On.
-
-
Set the Enable Pricing Portal Administration Logging option.
This option determines if pricing changes from the Pricing Portal, Product Workbench, or with any of the Pricing REST APIs are recorded in the Administration Logs.
-
On - Enable logging of pricing change history in Administration Logs.
Note: Logging can negatively impact performance. Validate performance before enabling Pricing Portal Admin
-
Off - Disable logging of pricing change history in Administration Logs.
-
-
Set the Enable incremental pricing in quoting option.
-
On - Only line items whose pricing attributes are changed are repriced. If any transaction level attribute is changed, all line items are repriced.
Notes: You are recommended to turn this option on if all line items are priced independently.
-
Off - all line items are repriced when any line items is changed or if any transaction level attribute is changed.
-
-
Set the Apply context-dependent data source in Pricing Attribute Mapping option.
Note: This setting is only applicable when a Pricing Attribute has attribute mappings to two or more different types of Data Sources (e.g. a Configuration model and a Commerce process).
-
On - the Pricing Attribute uses the Data Source corresponding to the current invocation context.
-
Off - the Pricing Attribute honors the Attribute Mapping order number.
For example, assume a Pricing Attribute has two Data Sources: a Configuration model and a Commerce process. When this option is On, the Pricing Attribute uses the Configuration Data Source in the Configuration model, and the Commerce Data Source in the Commerce process. When this option is Off, the Pricing Attribute uses the Data Source with the lowest order number in the Pricing Attribute's Attribute Mapping.
-
The default for this option is Off for customers currently using Pricing Engine. If a site does not have any pricing data or any Advanced Pricing Models yet defined the default for this option is On.
-
To find the order number for an attribute, check the Pricing Attribute detail page.
-
-
Set the Pricing Script: Before Pricing Engine Execution option and script (if applicable).
- Set this option to On.
- Click the Edit link.
-
Enter your BML script.
Example Before Pricing Engine Execution script
/Ensure that all pricing and charge attributes that are either read or updated are selected in the inputs. //Failure to do so can result in errors during saving or execution. //Get the Sales Channel from the header. salesChannel = jsonget(pricingDocument,"salesChannel_c","string","none"); //Get the Customer Industry from the header. customerIndustry = jsonget(pricingDocument,"customerIndustry_c","string","none"); //Now query the data table using BMQL and then set the customer's price sensitivity. customerPriceSensitivity = ""; results = bmql("select PriceSensitivity from PriceSensitivity where SalesChannel = $salesChannel and CustomerIndustry = $customerIndustry "); for result in results { customerPriceSensitivity = get(result, "PriceSensitivity"); } //Update the customer's price sensitivity so that the correct price models are activated. jsonput(pricingDocument,"customerPriceSensitivity_c",customerPriceSensitivity); //Finally return the pricing document. return pricingDocument;
- Click Save and Close.
-
Set the Pricing Script: After Pricing Engine Execution option and script (if applicable).
- Set this option to On.
- Click the Edit link.
-
Enter your BML script. Enter your BML script.
Example After Pricing Engine Execution script
/Ensure that all pricing and charge attributes that are either read or updated are selected in the inputs. //Failure to do so can result in errors during saving or execution. //Get the lines and start adjusting the charges. lines = jsonget(pricingDocument,"lines","jsonarray"); //Find the size so that an integer array representing the indices can be created. linesize = jsonarraysize(lines); //Build the indices array. lineIdxArr = range (linesize); //Iterate through the lines for lineIdx in lineIdxArr { //Extract the line as JSON line = jsonarrayget(lines,lineIdx,"JSON"); //Get hold of the charges for this line. charges = jsonget(line,"charges","jsonarray"); //Use JsonPath to efficiently locate the node. //Here, we are interested in extracting the unit price of the One-Time Shipping Freight charge. shippingFeeJsonPath = "$.charges[?(@.chargeType == 'freight' && @.priceType == 'One Time')].unitPrice"; //Locate the freight charge. //Assign a default value of 0.0 if such a charge is not found. shippingFee = jsonpathgetsingle(line,shippingFeeJsonPath,"float",0.0); //Add a handling fee for line that has a non zero shipping charge. if (shippingFee > 0.0){ //Create the One Time Handling Charge. handlingFee = json(); jsonput(handlingFee,"priceType","One Time"); jsonput(handlingFee,"chargeType","handling"); //Adds a 15% handling fee for the shipping charge. jsonput(handlingFee,"unitPrice",shippingFee * 0.15); //It's a good practice to add/update the calculation info for more diagnostic information. calcInfo = json(); jsonput(calcInfo,"message","One time fee for handling the Shipping Freight"); calcInfoArr = jsonarray(); jsonarrayappend(calcInfoArr,calcInfo); //Insert the handling charge to the incoming charges jsonarrayappend(charges,handlingFee); }
//Remove the processing fee for highly price-sensitive customers. //Get the Customer's Price Sensitivity. priceSensitivity = jsonget(pricingDocument,"customerPriceSensitivity_c","string","<empty>"); //Check if its high. if (priceSensitivity == "high") { //Iterate through the charges and find the index of the processing Fee and then remove it. chargeArrIdx = range(jsonarraysize(charges)); for chgIdx in chargeArrIdx { //Get the Charge as json. charge = jsonarrayget(charges,chgIdx,"json"); //Get the Charge Type. chargeType = jsonget(charge,"chargeType","string","<empty>"); //Get the Price Type. priceType = jsonget(charge,"priceType","string","<empty>"); //Check if this is a processing charge. if (chargeType == "processingFee" and priceType == "One Time") { //Remove the charge using the index (chgIdx). jsonarrayremove(charges,chgIdx); break; } } } } //Return the pricing document after adjusting the charges. return pricingDocument; -
Click Save and Close.
-
Click Save or Update to save your changes, or Cancel to keep previous settings.
Notes
Important: Switching from one Pricing option to another may impact existing pricing and past transactions within the system. Oracle recommends thoroughly testing the impact of the Pricing option change before implementing the change in a production environment. Once the Pricing option is changed in a production environment, returning transaction data to its previous state may require significant effort.
Notes:
- Pricing Engine requires Pricing Behavior Version 2, Version 3, or Version 4. Use Version 4 for best performance.
- Depending on your adoption of Pricing Engine, the Pricing Behavior version may have been set automatically and may limit which options you can choose.
- Existing sites retain the current setting on upgrade.