When the user creates a quote with Intent = Price Agreement, finalizes the quote, and accepts it, CPQ automatically creates a contract price list with the products from the quote, according to the prices negotiated in the quote. The contract price list is a subset of the standard price list. CPQ assigns a contract number to the new price list generated. The user can then use the contract number and pass it to the future quotes for using the contract pricing feature. The prices in the new quote will be retrieved from contract price list and those prices are the negotiated prices of the original quote.

You can store contracted prices in CPQ using Contract Pricing. When the same product is defined in multiple contract price lists, the former contract takes precedence. Contract Pricing is supported for standalone and bundles. Contract Pricing for Options is supported provided options are defined in the same contract price list as the bundle. Options cannot be in a different price list. Options inherit the contract price list from the bundle. If an option is included in two different bundles in a quote or agreement with Intent = Price Agreement, CPQ adds the option twice to the Contract Price List (resulting in two contract price list items). CPQ then applies pricing on the quote based on the selection of the bundle and options, and calculates the price of the option from the price list item that has relation to the current bundle under which it is being configured.

The contract pricing for bundles works fine for a single-level bundle and same option, however it does not work for same sub-bundles.

Lets understand this with a scenario: Foregen is a company that manages their contracts outside of Apttus. They have around 40-50 contracts. The contracts can be with an individual customer, health network, or a GPO (purchasing organization). A given customer can be part of the health network and/or a GPO. Therefore, they can have multiple contracts that can apply to them. When a customer creates a quote, depending on the product they are quoting for, there is a pre-defined sequence of contract lookup. For example, for product A, the sequence is Individual contract, GPO Contract, Health Network Contract, but for product B, the sequence can be GPO, Health Network, Individual Contract.

Contracts are managed outside of Apttus and they are represented as Price Lists in CPQ i.e for each contract, a price list is created in CPQ and is associated to that Contract (with an identifier on the Price List). When the contract price is changed, the customer has to manually update the contract number in the Price List. On the Account object, you must create 3 custom fields to keep the list of contract that are applicable to the customer and is maintained by the users (manually). For example: There is a field "health network contract", which identifies the contract number that this customer has, as "HEA1234". Similarly, other fields identify the other types of contracts that this customer can buy off of such as GPO "GPO232", Customer "Cust5992". At the time of quoting, a special custom logic (implemented through Salesforce workflow rules), figures out the list of contracts and their sequence and stores it in a field on the line item. For example, it can identify 3 contracts, (HEA1234, GPO232, Cust5992) and will store them as comma separated values.

When looking up prices, the system first looks up for the price from the price list that is associated with the first contract (i.e HEA1234). If the price is not found in that price list, the system will look at the second contract, and if not found in the third. If the price is not found in any of these price lists, the price is retrieved from the standard price list (not associated to the contract).

To enable contract pricing in CPQ, customers need to create a price list to store the contract prices and associate the price list a Contract number. In the quoting module, they need to define (explicitly) which contracts to use for a certain quote or quote line item.