Usage (Optimization - List Price)
To run the List Price Optimization Accelerator, you need to create a new Model Object from the Optimization > Models menu, using the Optimization - List Price Model Class to instantiate the optimization model and give it the required parameters. The model will then be added to the list and will be editable.
New Model
Go to Optimization > Models and add a new model.
Define the name of the model and choose List Price Optimization as Model Class.
The new model opens. It is based on the data you defined when deploying the Accelerator. The interface is:
Definition, Scope, Configuration, and Results are the steps of the model and will be explained below.
Definition Step
This is the first step of the model. There are two tabs: Transactions and Costs.
Transactions tab
When you open it for the first time, the user inputs in the left section, called Transactions, are prefilled with the default values, defined during the deployment process.
You shall apply a filter to your transactions, to define the scope you want to work with or a specific period of time, like to use latest 12 months.
The mapping of the data should correspond to the price waterfall and will be reflected in the model.
Revenue at List Price is the current list price in the transactions multiplied by the quantity. It is the starting point on the model as it will be used as a reference for the list price.
Discounts corresponds to discounts that apply to the list price. This discount amount (extended to the quantity) is converted to a discount rate (by product and customer level) and this discount rate is used within the model to assess the impact. If this value is not directly part of the data, it will be required to sum up together all the discounts as a new field.
Rebates corresponds to rebates that apply to the invoice price. This rebate amount (extended to the quantity) is converted to a rebate rate (by product group and customer level) and this rebate rate is used within the model to assess the impact. If this value is not directly part of the data, it will be required to sum up together all the rebates as a new field.
It is possible to set specific lower bound and upper bound to the price by product, in this case please fill the following fields. If defined, then it is used in the model, otherwise just ignored. Typically those values will result from specific computations defined based on each context (minimum margin, competition prices…), so these values should be computed up front and stored in the data source.
Once you apply the settings, the right panel provides:
Selected Transactions – Data that will be materialized in the model, and can be used for the optimization.
Filtered Out Transactions – Data that are filtered out by the set transactions filter.
By default, transactions exclude null values for Product, Product Groups, and Customer Level.
It is key to define the filters to only keep the meaningful transactions preventing the Optimization Engine from failing if some agents have null coordinates.
When the Definition step is done, you can go to the Scope step. For this, use the Continue button at the top right.
For more details on mapping the fields in Definition Step, please refer to Data Requirements (Optimization - List Price)
Costs tab
This tab is to set some optional future costs. If you check Enable future costs, then you can define the cost table and its mapping, to take into account the cost evaluation in you optimization model.
For all the products having a corresponding future cost defined in the Costs table, the margin will be updated to reflect the new cost. The optimized waterfall will take into account the cost changes. The optimization model will be able to take into account follow-up increase or follow-up decrease.
Scope Step
The Continue button at the Definition step will automatically run the calculation that starts the Scope step. This calculation mainly performs the aggregation of the transactions by product and by customer level which is used to perform the optimization itself. At the end of the calculation, the tab is available and there is a table called Aggregated in the model tables (accessible through the menu in the top right corner).
In the Scope step, you define which products and customer levels the optimization will apply to. This step works on already aggregated data, i.e. all the historical transactions have been aggregated by product and customer level. The filters are:
Included Customer Levels and Included Product Groups
Product Minimum Revenue, and Product Minimum Margin (%) are filters related to the global values.
You can add as many custom filters as you want with Aggregated Data Filter.
Remember that these filters apply to the already aggregated data (on the customer level x product aggregation), i.e. only on the fields that exist in the Aggregated table. You can filter on any transactions field in the Definition step.
In the right panel, there is an overview of the data which will be taken into account in the optimization. It is refreshed to reflect your filters when you click the Apply Settings button.
Data shown in portlets are limited to the scope, while filters are applied on the Aggregated table level. It might result in counter-intuitive behavior of the Product list portlet.
Configuration Step
The Continue button at the Scope step will automatically run the calculation that starts the Configuration step. After a calculation, which can take a few minutes, you can access the configuration tabs.
In the Configuration step, you define your optimization configuration. There are three tabs: the first one to define the global optimization strategy rules, one to define optional alignments between product prices, and one for advanced configuration.
Optimization Problem
The optimization problem is the following one:
As a user, I want to optimize the list prices, defined by product, within a given relative range from the historical values. I would also maximize my global revenue or margin (or a mix of both). Finally, I would like the total “revenue at list price”, and the “revenue at list price” of some product groups to increase by given values. This assumes that the discount rates, the rebates rates, and the unit on-invoice and off-invoice adjustments do not change.
Moreover, there could be alignments. In this case, for some given pairs of products, the list price gap between the products of the pairs depends on user rules.
Strategy Tab
In this configurator, the user sets the values for the optimization problem.
List Price Change
Maximum Decrease (%) – A decrease limit that is applied to each unit list price. Setting maximum decrease to 2 % means that the list price can decrease by up to 2 %.
In case you want each unit list price to increase by at least n %, then the input value should be negative.Maximum Increase (%) – An increase limit that is applied to each unit list price.
Optimization Settings
There are two different options
Simple setup, quantity are considered as fixed and will not change when the list price changes, no price elasticity, then you can set up the Target of Margin Rate Increase (pp): The value is given in percent points (pp), meaning that if the historical global margin rate is 54 % and the user wants it to increase to 56 %, the value to enter is 2 pp. The margin rate is calculated as the total margin divided by the total net revenue.
If you want to take into account the price elasticity, then select the Use Price Elasticity option in the checkbox :
Then, the List Price model needs a Multifactor Elasticity model (Accelerate Multifactor Elasticity Optimization ) to have run on the same products and customers as the ones in the source data defined in Definition (Usage (Optimization - List Price) | Definition Step). The elasticity function is retrieved from this model.
Optimization Priority is a slider from 0 to 10. The objective of the model is to maximize a mix between revenue and margin (profit). If the input is 0, it will maximize the revenue; if the input is 10, it will maximize the profit; intermediate values allow to mix and weigh these two goals.
List Price Allocation
Overall List Price Change (%) – It is a percentage value and it means that in average List Price should increase by 20% in the example above. This is computed at total “revenue at list price” level, so it is a weighted average to consider quantity.
This user input is optional. As this value is highly correlated with the Margin Rate Increase, if the value seems inconsistent with the Margin Increase target, then a warning message is displayed and the expected value displayed. The optimization will run even if there is a warning message, but the Optimization Engine may be unable to reach the Overall List Price Change value.Target of List Price Change – Here the user can define a specific list price change by product group. Any product group can be selected and a target set. If all the product groups have targets defined, and the targets are not consistent with the Overall List Price change target, then the Optimization Engine may not be able to reach all the constraints. The priorities of each product group’s total list price allow the user to give more importance to some product group targets compared to others.
Follow Up Cost Trend. This section is visible only if the future costs are enabled. In this case:
If Follow Cost Increase is checked, then the list price for this product should follow the same increase. for any product whose cost increases by X%, the list price is set in the optimization engine to increase. There is a constraint called CostIncreaseTrend which is satisfied if List Price Δ% => X% + 0 and acceptable if List Price Δ% > 0,8.X% + 0,005.
If Follow Cost Decrease is checked, for any product whose cost decreases by X% (negative value), the list price is set in the optimization engine to decrease. There is a constraint called CostDecreaseTrend which is satisfied if List Price Δ% <= 1.X% - 0,002 and acceptable if List Price Δ% < 0,75.X% + 0,005.
These values can be changed by an advanced user, they are stored in the parameter table “Follow Cost Parameters” of the model (refer tohttps://pricefx.atlassian.net/wiki/spaces/UNITY/pages/5202022398/Models+and+Model+Class#Parameter-Tables)
Business Alignments Tab
It is possible to define up to five alignments to apply to a pair of products. Each alignment rule is independent from the other ones. The user should not define different alignments on the same product pair.
The data you need to define an alignment rule is a Datamart or a Data Source with at least four fields: two product fields and their corresponding attribute fields. If such table does not exist, it is possible to use a Product Similarity model to define what are the similar products.
In this example, the attribute of the products are their brands. The user defines a unit list price gap (in %) between the Dark Force and the Super Power brands. This gap is used to set the difference between the products P-0020 and P-0185, but also between P-0021 and P-0001, etc.
You define an alignment by adding a row in the Global List Price Alignments input table, giving the alignment a name, and selecting the row:
When an alignment is defined and selected, a corresponding section is displayed. If the alignment is unselected, the corresponding section is hidden and not used, but its values are saved and can be restored by selecting the alignment again.
The inputs to set an alignment rule are:
Similar Products Table (as shown above);
Mapping of the Reference Product field, the Reference Product Alignment Attribute field, the Following Product field, the Following Product Alignment Attribute field;
Alignment gaps values.
For instance, to follow the example above:
This table is created automatically based on values found in the original table. The user can enter a minimum gap, a maximal gap, or both of them. If there are multiple pairs of attributes, it is not necessary to provide values for each of them. The gaps will apply to the unit list prices of the pairs of products defined by the alignment Data Source. So for two products ProductA with the attribute listed in “From” and ProductB with the attribute listed in “To”, the following formula is used to enforce the alignments:
Minimum Gap % ≤ ListPriceProductB / ListPriceProductA - 1 ≤ Maximum Gap %
For example, here two products ProductA of brand Dark Force and ProductB “Super Power” listed in the alignment table for comparison should follow the following alignment:
30% ≤ ListPriceProductB / ListPriceProductA - 1 ≤ 45%
When setting the minimum and maximum gaps, the minimum value should also be set in the “Minimum Gaps (%)” column, especially for negative values. Here is an example where the reference are products with Stainless Steel and Plastic products should be less expansive:
So for two products ProductC made of Stainless Steel and ProductD made of Plastic this alignment will be set in the following way:
-85% ≤ ListPriceProductD / ListPriceProductC - 1 ≤ 60%
Advanced Parameters Tab
This tab is mostly for advanced users.
By default, the optimization will run a maximum of 4000 steps, with no time limit and it will stop if it is stabilized. You can change the number of steps, in particular, if, after a run, the results logs show that the model was not stabilized yet. You can also set a maximum running time in minutes, or disable the stop when stabilized.
The Profiling checkbox can help you understand how the agents reach their optimum but it increases the need for memory and the optimization run time.
Finetuning allows you to define how much the spread of the list prices can change during the optimization run. By default, the Overall List Price Change Standard Deviation and the List Price Change Standard Deviation by Product Group are limited to 2, with medium priority. This means that the prices will change together as much as possible, rather than having one or a few products make most of the changes to reach the optimization targets.
Results Step
The Continue button at the Configuration step will automatically run the optimization calculation, initiating the Results step. This main calculation consists of a sequence steps: preparation for the optimization run, simulation of the initial state, optimization calculation itself, and postprocessing. It is the longest calculation of the model.
You can limit the optimization calculation, using “Max. Number of Minutes” in Advanced Parameters in the previous step. After the calculation sequence, you can access the Results tabs.
Impact Tab
This tab displays comparisons between projections with the historical pricing and projections with the optimized pricing. There are seven portlets in the dashboard, described below.
Overview
The overview provides a summary of the difference between the projections from current pricing and the projections from optimized pricing: total revenue and profit, but also the count of increased, stable, and decreased prices.
List Price Change
This is a histogram showing by buckets the number of products, which had some list price changes. In this case below, 160 products have nearly no list price change and 130 products have an increase of 3.8 %.
Comparison Waterfall
The waterfall displays both the historical and the optimized waterfall (in parallel). All the values are extended ones, within the scope of the optimization. They are presented in a bar chart, hence negative values like discounts are below the X axis.
Revenue and Margin by Product Group and by Customer Level
These four portlets display the extended values of revenue and profit, aggregated by product group or customer levels, to allow the end user to see where the optimization had more or less impact on the results.
Filters
The filters help the user define the scope of the displayed results. The portlets are set for the scope defined by the filters on the left panel. If the filters are incompatible, the following error message is displayed:
Details Tab
The Details tab displays the results tables in an easy way for the user to interact with. Different aggregations are provided: by product, by product and customer level, by product group and customer level, and global aggregation. The user inputs allow filtering of all the data provided in the tables.
Each table provides values for all the fields that are interesting at this level of granularity. The values provided are the initial and the optimized ones, plus the delta between them. If needed, you can export these tables to Excel.
As the main output of the model, recommendations of new list prices can be found in the Product table under “Optimized list Price”:
Glassbox Tab
This tab’s target audience is Configuration Engineers, Business Analysts, and team members working on improving a new optimization model. The tab provides insights to understand how the Optimization Engine reached its final state. One needs to understand the main concepts of the Optimization Engine to benefit from this dashboard. Two interesting pages to help users are Glossary (Optimization Engine) and Explainability (Glassbox).
A full documentation of the Glassbox charts is available in Glassbox Dashboards.
Drivers Tab
This tab’s target audience is mostly for advanced users working on improving a new optimization model or checking how the constraints behave.
The user selects a product to investigate to check what drives the optimized list price, represented in the center by a yellow square. The main drivers correspond to the largest bubbles, here in this example, the Cost Increase Trend tends to increase the list price when the list Price Change Target tends to decrease the price. The other drivers apply a lower pressure. For more information, please check complete documentation is in Value Finder - Criterion Influence. The chart is generated automatically from the setting of the Optimization Engine, that’s why the names are slightly with technical wording.
Evaluation Tab
This tab simulates the main evaluation logic that can be called from any other module. There are two inputs:
Product (required)
Customer Level (optional)
If only the product is provided, the outputs are: Product, Product label, Product Group, List Price, and Cost. If the Customer Level value is provided too, the following outputs are also given: Customer Level, Discount Rate, On and Off-Invoice Adjustments, Rebates Rate, Margin Rate, and Margin.
More details in Usage (Optimization - List Price) | Use the list price optimization results from anywhere.
Additional Tables
Many tables are available to check further values. This can be accessed from the top right three dots menu:
One table is particularly noteworthy: Optimized_Solution_ByProduct_OptimizedUnitListPrice which can be used to fetch by product the Optimized List price which is stored in the field “value”:
Use the list price optimization results from anywhere
Like any model object, you can evaluate a model, to get an optimized list price, from any other model of Pricefx.
Query results
The main evaluation is called query_results
. The query that can be done from any other module of the partition is:
api.model("myModelName").evaluate(
"query_results",
[
product : "myProductId",
customer_level: "myCustomerLevel"
]
)
The value of the customer level is not required. If only the product is provided, the outputs are: Product, Product label, Product Group, List Price, and Cost. If the Customer Level value is provided too, the following outputs are also given: Customer Level, Discount Rate, On and Off-Invoice Adjustments, Rebates Rate, Margin Rate, and Margin.
Product Batch Evaluation
This evaluation purpose is to be used by the Price Setting Package (https://pricefx.atlassian.net/wiki/spaces/ACCDEV/pages/1716748886). It does not take any parameter and returns the table of the optimized list prices, formatted accordingly to the Price Setting Package needs.
Any advanced user can call it like this:
api.model("myModelName").evaluate("eval_product_batch", [:])