#The challenge
A single Salesforce CPQ instance carried multiple catalogs and price books, and the pricing model had drifted past what the configuration could express. Discounting was accountable only at the quote header, so nobody could see which part of a deal was actually being given away. Price tiers had proliferated well past what the model could carry. System-generated discounts for multi-year and pay-upfront terms were baked into the waterfall and stacked on top of whatever the rep applied, so a rep with a five-point allowance effectively had more. Approval rules had grown into a long, mostly product-specific list that fired on almost everything. And several of the rules the team needed to build were blocked on business thresholds that had never been written down.
#The approach
Rebuild the bundle model, then decide what a rep is allowed to touch
Parent bundles were rebuilt per catalog with option groups underneath, and quantity was locked on the bundle parents — one bundle per billing entity means the quantity is always one and letting reps edit it only creates bad quotes. The one line item whose quantity genuinely varies stayed editable, optionally with a floor.
Push discount accountability down from the header to the bundle
The core change: pricing accountability moved below the quote header. Reps discount at the bundle level, with the major bundles separately discountable from each other but line items inside a bundle not discountable individually. A header-level override was left on the table as a possible addition that applies equally across SKUs, explicitly pending user validation rather than assumed.
Pull the volume-priced product out of the bundle as a sibling
One line item priced on a volume schedule rather than a fixed list price kept colliding with bundle-level discounting — changing its quantity moves the regular unit price but not the list unit price, which then interacts unpredictably with a bundle discount applied above it. It was restructured as a sibling product alongside the bundles so its volume schedule could operate independently, at the cost of it no longer being a required component of the bundles that used to contain it. That trade-off was made explicitly.
Design the price waterfall in order, and decide what is allowed to be invisible
Pre-negotiated partner pricing applies as the first step of the waterfall, sourced from a field on the partner account via the opportunity, and was verified by testing rather than assumed. Year-over-year uplift is applied on cloned line groups at a standard rate, and — deliberately — a rep cannot simply zero the uplift: any deviation surfaces as a visible discount instead. That one design choice converts a silent margin leak into something the approval matrix can see.
Delete system-generated discounts rather than governing them
Automatic multi-year and pay-upfront discounts were removed in favour of year-over-year price lists, with pre-negotiated partner pricing kept as the only baked-in discount. Where a system discount does remain, it counts against the rep's own threshold rather than sitting on top of it — which is the difference between a stated five-point allowance and an actual one.
A three-level discount ladder evaluated at two altitudes
Discount authority was structured as rep → manager → leadership, with thresholds evaluated both at overall quote level and at product-family level, and a single unified threshold set across catalogs at launch for simplicity. Floors were handled through the approval matrix rather than as hard system blocks — a full discount stays theoretically possible with the right approvals, which keeps the system honest about where authority actually lives.
Make product family the control surface, not product code
Discount policy was applied via the product family field rather than product codes, and families were cleaned up and bulk-corrected on active products only. The payoff is that every new SKU inherits family-level discount policy automatically instead of requiring a rule change.
Version approval rules by deal type, and scaffold while policy is undecided
Separate approval-rule versions were built for new business versus renewals, since the system can identify a renewal by its line items replacing the prior quote's. Where the business had not yet set thresholds, placeholder rules were scaffolded with clearly marked temporary values so the build could proceed and be tested rather than stall — with the real numbers treated as a client decision on the log.
Rationalise the live approval rules one by one
The production rule set was inventoried against a target matrix and each rule marked keep or remove. Removals were deactivated in a partial sandbox first rather than deleted outright. Rules retained include finance routing on non-standard billing, deal-desk routing on non-standard contract terms and dates, discount-threshold routing, and data-integrity guards (zero-quantity lines, inactive products, negative net price, customer-visible custom notes).
Catch duplicate recurring subscriptions before they get quoted
A record-triggered flow on renewal, amendment and quote records checks the account's active contracts by product code for a recurring add-on it already subscribes to, and sets a flag that triggers an approval when one is found — closing a real double-billing path on renewals and amendments.
Set an explicit amendment policy instead of forcing new packaging on old paper
Mid-contract amendments continue to use legacy products; the new bundle structure is introduced only at renewal. For existing items pricing follows what was previously bought, while newly added items take the new tier pricing — and a new tier field was created rather than overwriting the old one, so history stays intact. Forcing customers onto new packaging for a simple add-on was considered and rejected because of the cancellation and rework it would generate.
#Outcomes
Discount accountability moved down a level
Discounting shifted from the quote header to bundle and product-family level, evaluated against a three-tier approval ladder, with system-generated discounts eliminated in favour of year-over-year price lists.
Approval rules pruned deliberately
Each live rule was explicitly marked keep or remove against a target approval matrix, with removals deactivated in a partial sandbox before production rather than deleted outright.
Duplicate recurring add-ons are caught before approval
A renewal or amendment quote for a recurring add-on the account already holds now sets a flag and routes into an approval rather than passing silently.
The margin leak became visible
Deviating from the standard year-over-year uplift now surfaces as a discount the approval matrix can evaluate, instead of an editable field nobody reviewed.
Undecided policy was named, not guessed
Where the business had not set discount thresholds, rules were scaffolded with clearly marked temporary values and the real numbers logged as an open client decision, so the build could be tested without quietly encoding a policy nobody had agreed.