Quoting Tool

Header Level View

On the header level, the package provides standard input entries, summarized KPIs of quoted items, historical purchases of the customer for quoted items and some general KPIs. 

User Inputs

  • Customer – Allows the user to choose a customer for the quote; the package allows to set a filter which can limit availability of the customers for selection.

  • Currency – Allows the user to choose a customer currency that is defined in the ccy Data Source or from Price Parameters table (version 1.2.2).

  • Discount % – Optional user input which can enable one of the predefined discount models to make negotiating easier.

    1. Additional Discount – Allows to define an additional discount (absolute value) on top of discounts provided on the header level.

    2. Default Discount % – Allows to define a default discount % for line items; it can be overridden on the line item level.

    3. Flat Discount % – Allows to define a discount % which is applied to all line items, overriding discounts on the line item level.

Additional Input Fields

 This feature is deprecated from v2.0 and will be disabled by default from v2.2.0.

Input fields for the quote header level can be configured without changing the code. These fields can be also applied as parameters for filters used in the customer/product selection screens.

You can configure this manually in the CPQInputConfiguration PP or using CPQ Configuration Wizards with Name, Label, Input Type, Source Table, Source Type, Source Field, Value Options (if there is no source field), Default Value, Read Only, Required, Level (Header/Line), Customer Filter, Product Filter, Value Options Filtered By Customer, Value Options Filtered By Product. If the input values are set to be applied to the customer/product filter, the logic will get the value of these inputs and pass them to the filter logic using filterFormulaParam.

 You need to create your own filter logic for the customer/product filter and build your filter based on the custom input value provided from filterFormulaParam. From version 1.2, we provide the default implementation of customer/product filters for Source Type = P/C and Input Type = OPTION/OPTIONS.

Calculated Results

In the Calculation Results, there are two sections: Pricing Detail and Customer History.

Pricing Detail

  • Currency – Displays customer currency (the default is based on defaultCurrency in the CPQConfiguration PP)

  • Sales Overview – If some products were purchased by the customer in last x months, the table can show the following KPIs and allows you to compare the currently quoted price and margin:

    • X-months Revenue

    • X-months Volume

    • X-months Margin %

    • X-months Weighted Price Per Unit = sum (Invoice Price) / sum (Quantity) (if Invoice Price is multiplied by Quantity)

    • Quoted Price Per Unit (from the current quote)

    • Quoted Margin % (from the current quote)

  • Revenue

  • Cost

  • Net Price

  • Margin %

  • Margin

  • Quantity

  • Total Deal Score % = Sum (Invoice Price * Quantity) / Sum (Target Price * Quantity)

  • Total Deal Score

Customer History

If the historical sales data are available and you configure historicalPeriod in the CPQConfiguration PP (the default is 12 months), it shows summary data for the time period defined during the installation process. The following KPIs are available:

  • Historical Period

  • Customer Revenue

  • Customer Quantity

  • Customer Margin

  • Customer Margin %

Line Item Level

User Inputs

For quoted products the user can define the following inputs:

  • Quantity

  • Price

  • Discount %

If there are values in both fields (Price and Discount %), the priority level depends on your configuration priceVsDiscountPctInputPriority in the CPQConfiguration PP.

Calculated Results

Pricing Details

This section provides detailed information about pricing of the item: it starts with a List Price and shows the different adjustments to pricing leading to the Net Price and Margin values.

List Price is obtained from two sources in this order: Price Lists and Product Extensions.


Previous Price provides information about the last transaction done by the customer and product for the quoted item.

Product price is queried from a price list (Price Setting module) which: 

  • Has the Approved status (approvalState == APPROVED).

  • Is assigned to the quoted customer or not assigned to any customer.

  • Has a target date <= quote target date. 

If there are multiple price lists found, the one with the latest target date takes priority. A price list assigned to the quoted customer will be used for the lookup first and if the product price is not found, the system will continue to a price list not assigned to any customer. When multiple PLs are assigned to a customer, the Quote will check the priority order. In case of the same priority and customer assigned PL, the first valid result price is used.

From version 2.0, CPQ supports getting product prices from the matrix type. The product price can differ based on secondary keys. By default, CPQ uses volume breakdown configured by Price Setting Accelerator (Volume Breakdown) to look up the price. For details see Matrix Price List Lookup.

If the price list is not found, the product price will do a lookup from a Product Extension (PX) (4 levels):

  • Price By Country

  • Price By Customer

  • Price By Region

  • Price By Segment

PX records should meet these conditions:

  • The target date is not set or should be <= quote target date.

  • The price is set. 

If there are multiple records found, the one with the latest target date takes priority.

Level keys on supported must be available on customer master attributes.

From version 2.0, the List Price Source element is added in Pricing Details. It helps you to know which PL-ID or product extensions PX is used to get a value from and display in Quote. You can turn it on or off in CPQ_Default_Input_Output_Configuration PP.

Discount

Discount Type

Level

Priority

Description

Discount Type

Level

Priority

Description

Additional Discount

Header level



Applies to the overall quote invoice price

Flat Discount %

Header level

1



Discount %

Line Item level

2



Default Discount %

Header level

3



Exception Discount and Standard Discount

If we have Exception Discount and Standard Discount:

  • Exception Discount takes priority over Standard Discount.

  • Will apply together with Flat Discount %, Discount %, Default Discount %.

 

Exception Discount

It is a predefined PP table named “CPQExceptionDiscount” created to configure an exception discount for quoted products with combination of customer ID and SKU. 

 

Standard Discount

It is a predefined PP table named “CPQStandardDiscount” and there are six keys to configure the standard discount for a product. It is possible to define that a record in the table is valid for any key by using a generic key alias (the default is *) as the key value. The value can be set as an amount discount or % discount.

 The lookup will ignore any discount less than 0.

Discount Amount = List Price – Invoice Price 

or

Discount Amount = Discount % * List Price

If Discount Amount > List Price, it will not be applied and then a warning message for this "Discount Amount must be less than List Price" should be shown.

  • Invoice Price – It is the Price input if set; otherwise it is the difference between List Price and Discount Amount.

  • Rebate Rebate data for a customer and product from RebateManager.  There are two calculation schemes: current or forecast (the maximum rebate is temporarily not be applied). By default: Forecast. The configuration is here.

    • To calculate a rebate, you need data from Rebate Records (RR) and you need to meet these requirements:

      • Agreement Status == Approved

      • Start Date (RR) <= Effective Date (Quote)

      • End Date (RR) >= Expiry Date (Quote)

      • Applies to Customer Grouping, Customer and Product Grouping, Product

    • Formula:
      current = List Price * CurrentRebate / CurrentBaselineValue
      forecast = List Price * Forecast Rebate / ForecastBaselineValue

    • If we have many rebate types applied to the specific combination of Customer and Product, we will sum up all these rebate values.

  • Cash Discount % – Value from the customer extension "CustomerCashDiscount". (In case of customerId duplication, the first valid looked-up record is used.
     Ignore if Cash Discount % is null, zero, negative.

  • Net Price = Invoice Price – Rebate – Cash Discount % * Invoice Price

  • Cost – Value from the product extension "ProductCost". Cost records should have:

    • Target Date attribute not set.
      or

    • Target Date <= quoted Target Date

    • Cost should be greater than 0.

    If there are multiple records found, the one with the latest target date takes priority.
     Show the red alert and message "Invalid Cost" if the cost is not provided (null, zero, negative). 

  • Margin = Net Price – Cost (do not show a value if no cost is provided)

  • Margin % = Margin / Net Price (do not show a value if no cost is provided)

  • Revenue = Invoice Price * Quantity

Competitor

If available, this section can provide the user with the information about competitors and theirs pricing. It shows Median Competitor Price, Top 5 Competitors and their prices and the lowest Competitor Price.

You can get the value from Competition Data, Price Competitors PX or both. Target date (Info date) will be used only if we have the same competitor for a given product, then we get a value based on the latest target date. 

 Ignore if the competitor price is zero, null, negative.

Price Guidance

If there are data for price guidance from a PX named "PriceGuidance" (can be also populated by PriceOptimizer), this section provides guidance to the user about Target, Floor and Stretch Prices. 

Before v2.2.0, the guidance is an absolute value and shown directly as the price guidance.

From v2.2.0, the guidance is a percentage value, and the price guidance is calculated as "cost * (1+ guidance)".

Deal Score % = Invoice Price / Target Price

 Ignore if the one of the values is zero, null, negative.

History

If transactional data is available, this section provides an insight about the size of historical purchases of the product.

  • Historical Period (based on historicalPeriod in the CPQConfiguration PP, the default is 12 months)

  • Product Revenue

  • Product Quantity

  • Product Margin

  • Product Margin %

  • Product Weighted Avg. Price = Sum of Invoice Price / Sum of Quantity (if Invoice Price is multiplied by Quantity)

  • Avg. Revenue Per Invoice

  • Avg. Quantity Per Invoice

  • Avg. Margin % Per Invoice = Sum of Margin / Sum of Net Price

Data Requirements

  • Mandatory

    • Price list / Base price (can be linked to the price list in the Price Setting module or it can use the data from a Product Extension)

    • Costs

  • Optional

    • Competition Data

    • Customer Cash Discount

    • Transactional Data

    • Price Guidance Data (Target, Floor, Stretch margins)

Setup

You can set up this package manually or through PlatformManager.