Top 50 Salesforce CPQ Interview Questions 2026 — Bundles, Price Rules, Renewals & Plugins Explained
Salesforce CPQ Interview Questions 2026
Products, Pricebooks, Bundles, Discount Schedules, Quote Line Editor & Approval Rules — Top 50 Q&As from Basic to Advanced
📍 What is CPQ?
CPQ stands for Configure, Price, Quote. It is a Salesforce product that helps sales teams generate accurate and professional quotes quickly by automating the configuration of products, pricing rules and quote generation.
| Letter | Meaning | What It Does |
|---|---|---|
| C | Configure | Build product bundles and select correct options |
| P | Price | Apply pricing rules, discounts and markups automatically |
| Q | Quote | Generate professional PDF quotes and proposals |
"CPQ automates the entire quoting process — from product configuration to accurate pricing to professional quote generation — reducing errors and speeding up the sales cycle."
| Factor | Standard Pricebook | CPQ Pricebook |
|---|---|---|
| Location | Standard Salesforce object | SBQQ__PriceBook__c custom object |
| Features | Basic price list | Supports block pricing, discount schedules |
| Segmentation | Limited | Customer segment, channel, region based |
| Integration | Opportunity products | CPQ Quote Line Items |
"Standard Pricebook is a simple price list. CPQ Pricebook supports advanced pricing strategies like block pricing, discount schedules and segment-based pricing."
📍 What is a Bundle?
A Bundle is a parent product that contains child products called Options. Bundles allow you to group related products together and configure them as a single unit in a quote.
📍 Bundle Components
| Component | Description |
|---|---|
| Bundle Product | The parent product (e.g. Laptop Package) |
| Product Options | Child products inside the bundle (e.g. RAM, Storage) |
| Feature | Groups of options within a bundle |
| Configuration Attribute | Shared attributes across all options in a feature |
"A Bundle is a parent product containing configurable child options. Features group related options and Configuration Attributes set shared values across a feature."
📍 Product Options
Product Options are child products inside a bundle. They define which products can be selected when configuring a bundle and control behavior like whether they are required, optional or hidden.
📍 Key Product Option Fields
| Field | Purpose |
|---|---|
| Required | Option must be selected — cannot be removed |
| Optional | Rep can choose to include or exclude |
| Selected | Pre-selected by default but can be removed |
| Bundled | Included automatically, hidden from UI |
| Min/Max Quantity | Controls how many units can be selected |
"Product Options are child products inside a bundle. The Type field controls whether an option is Required, Optional, Selected or Bundled — determining what the sales rep can or cannot change during configuration."
| Factor | Opportunity | CPQ Quote |
|---|---|---|
| Object | Standard Opportunity | SBQQ__Quote__c |
| Purpose | Track sales pipeline | Generate accurate price quotes |
| Products | Opportunity Line Items | Quote Line Items with advanced pricing |
| Pricing | Manual | Automated via price rules |
| Output | No document | Generates PDF quote document |
| Approvals | Basic | Advanced quote approval workflows |
"An Opportunity tracks the deal. A CPQ Quote is where the actual product configuration, pricing and document generation happens. Multiple quotes can exist per opportunity but only one is marked Primary."
📍 What is a Price Rule?
A Price Rule is an automated pricing action that fires when certain conditions are met on a quote. It allows you to automatically update prices, quantities or custom fields on Quote Lines based on logic.
📍 Price Rule Components
| Component | Purpose |
|---|---|
| Price Condition | When the rule fires — field values that trigger it |
| Price Action | What happens — which field gets updated with what value |
| Price Variable | Dynamic value used in price actions |
| Lookup Object | External data source for pricing values |
"A Price Rule fires automated pricing actions when conditions are met. It has Price Conditions that trigger it and Price Actions that update fields — allowing dynamic pricing without manual intervention."
📍 Discount Schedule
A Discount Schedule automatically applies tiered discounts based on quantity or term. The more a customer buys or the longer the contract, the bigger the discount applied automatically.
📍 Two Types
| Type | Based On | Example |
|---|---|---|
| Slab | Each tier has its own discount | 1-10 units = 5%, 11-50 = 10%, 51+ = 15% |
| Range | Highest tier discount applies to all | Buy 51 units = 15% on ALL 51 units |
"Discount Schedule automatically applies tiered discounts based on quantity or term. Slab type gives different rates per tier, Range type applies the highest tier rate to the entire quantity."
📍 Quote Line Editor
The Quote Line Editor is the main UI in CPQ where sales reps configure products, set quantities, apply discounts and manage quote lines. It replaces the standard Opportunity Products page with a richer, more powerful interface.
📍 Key QLE Features
- Add products and bundles to the quote
- Set quantities, discounts and start/end dates
- View price waterfall — list price to net price breakdown
- Apply manual discounts with approval triggers
- Drag and drop product ordering
- Group products into quote line groups
"The Quote Line Editor is the CPQ UI where sales reps configure products, set discounts and see the full price waterfall from list price to net price in real time."
📍 Price Waterfall
The Price Waterfall is the sequence of pricing steps CPQ applies to calculate the final net price on a quote line. Each step can reduce or modify the price.
List Price
↓ (minus) Partner Discount
↓ = Partner Price
↓ (minus) Customer Discount
↓ = Customer Price
↓ (minus) Additional Discount
↓ = Net Price
↓ (plus) Markup
↓ = Quote Line Price
"The Price Waterfall shows every discount and markup applied in sequence — from List Price down to the final Net Price. Understanding it is essential for explaining how CPQ calculates pricing."
📍 Product Feature
A Product Feature is a grouping mechanism inside a bundle that organizes related Product Options together. It also allows you to set selection rules like minimum and maximum number of options a rep can choose from that group.
| Field | Purpose |
|---|---|
| Min Options | Minimum options rep must select from this feature |
| Max Options | Maximum options rep can select from this feature |
| Category | Groups features for display in configurator UI |
"Product Features group Options inside a bundle and control selection rules — Min Options and Max Options enforce how many items a rep must or can select from each group."
📍 Configuration Rule
Configuration Rules control the logic of product selection inside bundles. They automatically add, remove, enable or disable options based on what other options have been selected.
| Rule Type | What It Does |
|---|---|
| Inclusion | Automatically adds an option when another is selected |
| Exclusion | Removes or disables an option when another is selected |
| Validation | Shows error if invalid combination is selected |
"Configuration Rules enforce product selection logic inside bundles — Inclusion rules auto-add related options, Exclusion rules prevent invalid combinations, Validation rules show errors for incompatible selections."
📍 Quote Template
A Quote Template defines the visual layout and content of the PDF quote document generated by CPQ. It controls what sections appear, what data shows, and how the document looks.
- Built using a drag-and-drop template editor
- Supports rich HTML and custom branding
- Can include dynamic fields from Quote and Quote Lines
- Multiple templates can exist for different use cases
- Template is selected on the Quote record before generating
"A Quote Template controls the layout and content of the PDF document generated from a CPQ quote — including branding, sections, dynamic fields and line item formatting."
| Price Field | Definition |
|---|---|
| List Price | Original price from the Pricebook — before any discounts |
| Special Price | Price after block pricing or price rules applied |
| Customer Price | Price after customer-level discount applied |
| Partner Price | Price after partner/channel discount applied |
| Net Price | Final price after ALL discounts applied |
| Net Total | Net Price multiplied by Quantity |
"List Price is the starting price. Each discount level reduces it further. Net Price is the final price after ALL discounts in the waterfall have been applied."
📍 Product Rule
Product Rules are validation and automation rules that control which products can or cannot be added together on a quote. They fire in the Quote Line Editor when products are added or configured.
| Rule Type | Purpose |
|---|---|
| Validation | Shows error if invalid products are selected together |
| Selection | Automatically adds or removes products on the quote |
| Filter | Hides products from the product catalog based on criteria |
| Alert | Shows a warning message but does not block |
"Product Rules control which products can be combined on a quote. Validation blocks invalid combos, Selection auto-adds related products, Filter hides products from catalog, Alert warns without blocking."
📍 Primary Quote
An Opportunity can have multiple CPQ Quotes but only one can be marked as Primary. The Primary Quote syncs its products back to the Opportunity as Opportunity Line Items.
- Only one quote per opportunity can be Primary at a time
- Marking a quote as Primary automatically un-marks the previous one
- Primary Quote drives the Opportunity Amount
- When a Quote is Contracted, it is typically the Primary Quote
"The Primary Quote is the one selected quote per Opportunity that syncs its line items back to Opportunity Products and drives the Opportunity Amount."
| Factor | Product Rule | Price Rule |
|---|---|---|
| Purpose | Controls product selection and validation | Controls pricing calculation |
| Fires When | Products added/configured in QLE | Quote is priced or saved |
| Action | Add, remove, validate products | Update price fields on quote lines |
| Output | Product added/removed or error shown | Field value updated automatically |
| Components | Conditions + Actions + Error Messages | Conditions + Actions + Variables + Lookups |
"Product Rules control WHAT products appear on a quote — validation, selection, filtering. Price Rules control HOW products are priced — automating field updates based on conditions."
📍 Price Variable
A Price Variable is a dynamic value used inside Price Actions. Instead of hardcoding a price, you reference a Price Variable that calculates a value from a field, lookup table or formula at runtime.
📍 Price Variable Sources
| Source | Where Value Comes From |
|---|---|
| Quote Line Field | A field on the current quote line |
| Quote Field | A field on the parent quote |
| Lookup Query | A value from a custom object lookup |
| Summary Variable | Aggregated value across multiple quote lines |
"Price Variables make Price Actions dynamic. Instead of hardcoded values, they pull data from quote fields, quote line fields or lookup tables at runtime — enabling flexible, data-driven pricing."
📍 Lookup Object
A Lookup Object is a custom Salesforce object used as a pricing matrix. CPQ can query it during pricing to find the correct price or discount based on multiple dimensions like customer segment, region, product type and quantity.
📍 Real World Example
Custom Object: CPQ_Discount_Matrix__c Fields: - Customer_Segment__c (Enterprise, SMB, Startup) - Region__c (North, South, East, West) - Product_Family__c (Hardware, Software) - Discount_Percent__c CPQ Price Rule queries this object based on Quote fields to find the correct discount.
"Lookup Objects act as pricing matrices. CPQ queries them during pricing using multiple filter fields to return the correct price or discount — enabling complex multi-dimensional pricing without code."
📍 Summary Variable
A Summary Variable aggregates values across multiple quote lines into a single number. It can calculate totals, counts, minimums or maximums across quote lines and use that aggregated value in Price Rules or Product Rules.
| Aggregation Type | What It Calculates |
|---|---|
| SUM | Total of a field across all matching lines |
| COUNT | Number of lines matching the filter |
| MAX | Highest value across matching lines |
| MIN | Lowest value across matching lines |
Example: Count how many software products are on the quote — if more than 5, apply a 10% bundle discount.
"Summary Variables aggregate values across quote lines — SUM, COUNT, MAX or MIN. They are used in Price Rules to make pricing decisions based on the entire quote composition."
| Factor | Standard Approval Process | CPQ Approval Rule |
|---|---|---|
| Trigger | Manual submit or criteria | Automatically triggers on quote submission |
| Conditions | Field-based criteria | Discount thresholds, margins, special pricing |
| Approvers | Static or formula | Dynamic based on conditions |
| Parallel Approvals | Limited | Fully supported |
| Lock Quote | No | Locks quote during approval automatically |
"CPQ Approval Rules are purpose-built for quote approvals based on discount thresholds and margins. They automatically trigger, lock the quote during review, and support complex parallel approval chains — unlike standard approval processes."
📍 Block Pricing
Block Pricing allows you to define flat prices for ranges of quantities instead of a per-unit price. The customer pays one fixed price for any quantity within a defined block.
| Quantity Block | Block Price |
|---|---|
| 1 — 10 users | $500 flat |
| 11 — 50 users | $1,500 flat |
| 51 — 100 users | $2,500 flat |
Example: A SaaS company charges $500 for up to 10 users. Whether you buy 1 or 10 users — you pay $500.
"Block Pricing charges a flat price for a range of quantities. Unlike per-unit pricing, buying 1 or 10 units within the same block costs the same flat amount."
| Factor | List Price | Contracted Price |
|---|---|---|
| Definition | Standard price from Pricebook | Negotiated price for a specific account |
| Scope | Applies to all customers | Account-specific |
| Override | Base starting point | Overrides List Price for that account |
| Object | PricebookEntry | SBQQ__ContractedPrice__c |
Example: Product list price is $1,000. Enterprise customer negotiated $750. The Contracted Price of $750 is used instead of $1,000 when quoting for that account.
"Contracted Prices are account-specific negotiated prices that override the standard Pricebook List Price when generating quotes for that particular account."
📍 Amendment
An Amendment is a mid-term change to an active contract. It creates a new quote and order to reflect changes like adding products, removing products or changing quantities during the contract period.
📍 What Happens During Amendment
- CPQ creates a new Amendment Opportunity and Quote
- Existing subscription products are loaded as read-only
- Rep adds new products or modifies quantities
- CPQ calculates prorated amounts for mid-term changes
- Amendment Quote is contracted to update the active contract
"An Amendment modifies an active contract mid-term. CPQ creates a new quote with existing products locked, allows changes, and automatically calculates prorated amounts for the remaining contract period."
📍 Renewal
A Renewal is the process of extending a contract when it is about to expire. CPQ can automatically create a Renewal Opportunity and Quote before the contract end date.
📍 Renewal Flow
Active Contract nearing end date
↓
CPQ auto-creates Renewal Opportunity
↓
Renewal Quote created with same products
↓
Rep can modify quantities/pricing
↓
Quote contracted → New Contract created
📍 Key Renewal Settings
| Setting | Purpose |
|---|---|
| Renewal Forecast | Include renewal in forecast |
| Renewal Pricing Method | Same, uplift or pricebook pricing |
| Auto Create Renewals | Automatically create renewal opportunity |
"Renewals extend expiring contracts. CPQ auto-creates a Renewal Opportunity and Quote with the same products — rep can modify before contracting to create a new active contract."
| Factor | One-Time Product | Subscription Product |
|---|---|---|
| Billing | Single charge | Recurring charge (monthly/annual) |
| Contract | No contract asset created | Creates Contract Asset and Subscription record |
| Renewal | Not renewed | Appears on renewal quotes automatically |
| Amendment | Not included | Included in amendment quotes |
| Proration | No proration | Prorated for mid-term changes |
"Subscription Products create recurring contract records and appear on Renewals and Amendments automatically. One-time products are billed once and do not create Contract Assets."
📍 Proration
Proration calculates the partial period charge when a subscription product is added or changed mid-term. Instead of charging the full period price, CPQ charges only for the remaining portion of the billing period.
Annual Subscription = $12,000 per year Customer adds product on July 1 (mid-year) Remaining months = 6 out of 12 Prorated Amount = $12,000 × (6/12) = $6,000
📍 Proration Methods
| Method | How it Calculates |
|---|---|
| Daily | Charges per day remaining in period |
| Monthly | Charges per full month remaining |
| None | No proration — full period charge always |
"Proration charges only for the remaining time in a billing period when a subscription is added or changed mid-term. CPQ calculates this automatically based on the product's proration method."
📍 Quote Line Group
Quote Line Groups organize quote lines into logical sections in the Quote Line Editor. Each group can have its own start date, end date, and discount — useful for multi-phase or multi-location deals.
📍 Use Cases
- Multi-year deals with different products per year
- Multi-location quotes with different pricing per site
- Separating hardware and software on one quote
- Applying group-level discounts to sections
"Quote Line Groups organize quote lines into sections — each group can have its own dates and discount. Perfect for multi-phase, multi-year or multi-location deals on a single quote."
📍 Multi-Currency in CPQ
CPQ supports Salesforce's standard multi-currency feature. When a quote is created in a non-default currency, CPQ automatically converts prices using the exchange rates defined in Salesforce.
- Quote currency is set on the Quote record
- Pricebook entries can have currency-specific prices
- CPQ uses active exchange rates for conversion
- Advanced Multi-Currency (Dated Exchange Rates) is also supported
- Net Total is displayed in the quote currency
"CPQ uses Salesforce's native multi-currency framework — quotes can be in any active currency and CPQ automatically converts pricebook prices using active or dated exchange rates."
📍 CPQ Order
A CPQ Order is created from a contracted quote and represents the customer's commitment to purchase. It drives fulfillment and billing downstream.
📍 Quote to Order Flow
Quote created and configured
↓
Quote approved (if approval rules trigger)
↓
Quote contracted → Contract created
↓
Order generated from Contract
↓
Order Products created
↓
Order activated → Billing/Fulfillment triggered
"A CPQ Order is generated from a contracted quote and represents the customer's purchase commitment. It contains Order Products mapped from Quote Lines and drives downstream fulfillment and billing."
| Factor | Standard Contract | CPQ Contract |
|---|---|---|
| Creation | Manual | Auto-created from contracted quote |
| Subscriptions | Not tracked | Creates Subscription records per line |
| Assets | Not created | Creates Contract Asset records |
| Renewals | Manual | Drives auto-renewal creation |
| Amendments | Not supported | Supports mid-term amendments |
"A CPQ Contract is auto-created from a contracted quote and maintains Subscription and Asset records — enabling automatic renewals and mid-term amendments that standard Salesforce Contracts cannot do."
📍 CPQ Pricing Calculation Order
Step 1: Original Price (from Pricebook Entry) Step 2: Block Pricing applied (if configured) Step 3: Price Rules evaluated in order Step 4: Contracted Prices applied (if exists for account) Step 5: Discount Schedules applied Step 6: Option-level discounts applied (for bundles) Step 7: Partner Discounts applied Step 8: Customer Discounts applied Step 9: Additional Discounts applied Step 10: Markup Rates applied (if any) Step 11: Net Price calculated
Price Rules fire in the order of their Evaluation Order field. Lower numbers fire first. This order is critical — changing it can produce different results.
"The CPQ pricing engine follows a strict sequence — Block Pricing, then Price Rules in evaluation order, then Contracted Prices, then Discount Schedules, then partner and customer discounts, finally producing the Net Price."
📍 Twin Fields
Twin Fields are matching fields on related CPQ objects that automatically sync values between them. When a field value changes on one object, CPQ automatically updates the corresponding field on the paired object.
📍 Common Twin Field Pairs
| Source Object | Target Object | Purpose |
|---|---|---|
| Quote Line | Contract Asset | Sync custom fields to assets on contracting |
| Quote Line | Subscription | Sync fields to subscription records |
| Product | Quote Line | Default product values to quote line |
Twin Fields must have identical API names and compatible field types on both objects.
"Twin Fields automatically sync matching field values between related CPQ objects. They are essential for passing custom data from Quote Lines to Contract Assets and Subscriptions without code."
📍 Solution — Lookup Object + Price Variable + Price Rule
Step 1: Create Custom Object — Pricing_Matrix__c Fields: - Customer_Tier__c (Gold, Silver, Bronze) - Region__c (North, South, East, West) - Min_Deal_Size__c (Number) - Max_Deal_Size__c (Number) - Discount_Percent__c (Number) Step 2: Create Lookup Object in CPQ Configure to match on: - Customer_Tier__c = Quote.Customer_Tier__c - Region__c = Quote.Region__c - Min_Deal_Size__c <= Quote.Net_Amount - Max_Deal_Size__c >= Quote.Net_Amount Step 3: Create Price Variable Source: Lookup Object Field: Discount_Percent__c Step 4: Create Price Rule Condition: Always true (fires on all lines) Action: Set Additional_Discount__c = Price Variable value
"For multi-dimensional pricing, create a Lookup Object as a pricing matrix, use a Price Variable to retrieve the matching value, and a Price Rule to apply it to quote lines — zero Apex code required."
📍 SBQQ.QuoteModel API
The SBQQ.QuoteModel API is CPQ's JavaScript and Apex API that allows developers to programmatically interact with the Quote Line Editor — reading quote data, modifying line items and triggering pricing calculations.
📍 Key API Methods
| Method | Purpose |
|---|---|
| SBQQ.ServiceRouter | Entry point for all CPQ API calls |
| CPQ.QuoteReader | Read quote data as JSON |
| CPQ.QuoteCalculator | Trigger pricing calculation programmatically |
| CPQ.QuoteSaver | Save quote changes programmatically |
// Trigger CPQ pricing calculation via API
String quoteJSON = SBQQ.ServiceRouter.read('SBQQ.QuoteAPI.QuoteReader', quoteId);
Map<String,Object> quoteData = (Map<String,Object>)JSON.deserializeUntyped(quoteJSON);
// Modify quote data
String savedQuote = SBQQ.ServiceRouter.save('SBQQ.QuoteAPI.QuoteSaver', JSON.serialize(quoteData));
"The SBQQ.QuoteModel API lets developers programmatically read, modify and recalculate CPQ quotes via the ServiceRouter. Use it when you need custom integrations or automation that the declarative CPQ tools cannot handle."
📍 CPQ Plugins
CPQ Plugins are Apex interfaces that allow developers to inject custom logic into specific points of the CPQ process — like pricing, product search, document generation and quote calculations.
| Plugin Interface | Purpose |
|---|---|
| SBQQ.PricingPlugin | Inject custom pricing logic during calculation |
| SBQQ.ProductSearchPlugin | Customize product catalog search results |
| SBQQ.DocumentPlugin | Customize PDF quote generation |
| SBQQ.QuotePlugin | Custom logic on quote save/calculate events |
| SBQQ.PackagePlugin | Custom logic during package product selection |
// Example Pricing Plugin
global class CustomPricingPlugin implements SBQQ.PricingPlugin {
global void onBeforeCalculate(SBQQ.SBQuote quote, List<SBQQ.SBQuoteLine> lines) {
// Custom logic before CPQ pricing runs
for(SBQQ.SBQuoteLine line : lines) {
// Modify line prices
}
}
}
"CPQ Plugins are Apex interfaces that inject custom code at specific points in the CPQ process. PricingPlugin is the most commonly used — it lets you modify prices before or after CPQ's standard calculation runs."
📍 Solution — CPQ Approval Rule + Margin Field
Step 1: Create Custom Formula Field on Quote Margin_Percent__c = (Net_Amount - Cost_Amount) / Net_Amount * 100 Step 2: Create CPQ Approval Rule Condition: Margin_Percent__c < 20 Action: Require approval from Finance Manager Step 3: Approval Rule settings - Lock Quote = TRUE (prevents editing during review) - Prevent Contracting = TRUE (blocks Contract button) Result: - Rep submits quote with 15% margin - CPQ triggers approval automatically - Quote is locked, Contract button disabled - Finance Manager approves or rejects - If rejected — rep must revise pricing
"Use a CPQ Approval Rule with a margin formula field as the condition and enable 'Prevent Contracting' — this locks the quote and blocks the Contract button until Finance approves the low-margin deal."
| Factor | Termed Subscription | Evergreen Subscription |
|---|---|---|
| End Date | Has defined end date | No end date — runs indefinitely |
| Renewal | Renewal quote auto-created | No renewal needed |
| Contract | Contract has end date | Contract has no end date |
| Amendment | Prorated for remaining term | No proration calculation |
| Use Case | Annual/multi-year SaaS licenses | Month-to-month subscriptions |
"Termed subscriptions have a defined end date and trigger renewal quotes automatically. Evergreen subscriptions run indefinitely with no end date and no renewal process — ideal for month-to-month billing."
📍 CPQ to Billing Handoff
CPQ Quote created and configured
↓
Quote contracted → Contract + Subscriptions created
↓
Order generated from Contract
↓
Order activated in CPQ
↓
Salesforce Billing picks up activated Order
↓
Billing Schedule created per Order Product
↓
Invoice generated on billing date
↓
Payment processed
📍 Key Integration Points
| CPQ Object | Billing Object |
|---|---|
| Quote Line | Order Product → Billing Schedule |
| Subscription | Billing Subscription |
| Contract | Billing Account |
"CPQ handles configuration, pricing and contracting. Salesforce Billing picks up the activated Order and creates Billing Schedules that drive invoice generation and payment processing."
📍 Debugging Price Rules Step by Step
Step 1: Check Price Rule Active flag Ensure SBQQ__Active__c = true on the rule Step 2: Check Evaluation Event Should match when you expect it to fire: - On Initialize, On Calculate, On Save, Always Step 3: Verify Price Conditions Open rule → check conditions are correct Test condition logic manually with real data Step 4: Check Evaluation Order Lower number = fires first Ensure dependent rules fire in correct sequence Step 5: Enable CPQ Debug Logs URL parameter: ?sbqq.debug=true Open browser console to see pricing log Step 6: Use CPQ Calculator API Force calculation and inspect JSON payload Check if conditions evaluate to true Step 7: Check Price Variable source Ensure lookup object has matching records Verify field API names match exactly
"Debug CPQ Price Rules by checking Active flag, Evaluation Event, Condition logic, Evaluation Order, and using the ?sbqq.debug=true URL parameter to see the full pricing calculation log in the browser console."
| Factor | Product Option | Configuration Attribute |
|---|---|---|
| What it is | A child product inside a bundle | A shared attribute/field across a Feature |
| Purpose | Select products to include | Set a value that applies to all options in a Feature |
| Example | RAM: 8GB, 16GB, 32GB options | Color: applies same color to all selected hardware options |
| Appears In | Product selection list | Attribute input above options in configurator |
"Product Options are products you select inside a bundle. Configuration Attributes are shared values that apply to all options in a Feature — like selecting a color or region that affects all options in that group."
📍 Solution — Product Rule with Selection Type
Rule 1: Auto-Add Product B when Product A added Type: Selection Conditions: - Product A is selected on quote (Quote Line field check) Actions: - Add Product B to quote - Set Quantity = 1 Rule 2: Auto-Remove Product C when Product A added Type: Selection Conditions: - Product A is selected on quote - Product C is on the quote Actions: - Remove Product C from quote Rule Scope: - Set scope to "Quote" level (not Line level) - Evaluation Event: On Initialization and On Save
"Use two Selection-type Product Rules — one with an Add action to auto-include Product B, and one with a Remove action to auto-exclude Product C — both triggered by the presence of Product A on the quote."
📍 CPQ Data Model
Opportunity (Standard Object)
└── SBQQ__Quote__c (1 to Many — multiple quotes per opp)
└── SBQQ__QuoteLine__c (1 to Many — quote line items)
└── SBQQ__QuoteLineGroup__c (optional grouping)
Contract (Standard Object)
└── SBQQ__Subscription__c (per subscription product)
└── SBQQ__ContractedPrice__c (negotiated prices)
└── Asset (per asset product)
Order (Standard Object)
└── OrderItem (Order Products)
└── SBQQ__OrderItemConsumptionSchedule__c
📍 Key Relationships
| Relationship | Field |
|---|---|
| Quote → Opportunity | SBQQ__Opportunity2__c |
| Quote Line → Quote | SBQQ__Quote__c |
| Quote Line → Product | SBQQ__Product__c |
| Subscription → Contract | SBQQ__Contract__c |
"An Opportunity can have many Quotes. A Quote has many Quote Lines. On contracting, Quote Lines become Subscriptions or Assets on the Contract. Order and Order Items are created for fulfillment."
📍 Common Causes and Fixes
| Cause | Fix |
|---|---|
| Too many active Price Rules | Review and deactivate unused rules. Combine rules where possible |
| Price Rules with complex SOQL | Add indexes to lookup object filter fields |
| Large number of quote lines | Use Quote Line Groups to paginate display |
| Too many product options in bundle | Break large bundles into smaller nested bundles |
| Excessive CPQ triggers | Review custom triggers on Quote Line object |
| Column limits in QLE | Reduce visible columns in column editor settings |
"CPQ performance issues are usually caused by too many active Price Rules with complex lookups, excessive quote lines, or large bundles. Reduce rule count, add custom indexes to lookup fields, and break large bundles into nested smaller ones."
📍 Nested Bundle
A Nested Bundle is a bundle within a bundle — a child product option that itself is a configurable bundle. This creates a hierarchy of configurable products for complex product offerings.
Parent Bundle: Enterprise Suite
└── Feature: Core Products
└── CRM Bundle (Nested Bundle)
└── Option: Sales Cloud
└── Option: Service Cloud
└── Analytics Bundle (Nested Bundle)
└── Option: Tableau
└── Option: Einstein Analytics
📍 When to Use
- Complex enterprise products with multiple configurable sub-components
- Products with deeply nested option hierarchies
- When flat bundles become too large to manage
"Nested Bundles are bundles within bundles — useful for complex enterprise products with multiple independently configurable sub-components. They improve organization and performance compared to one massive flat bundle."
📍 CPQ Migration Approach
Step 1: Use CPQ's built-in export/import Setup → Installed Packages → CPQ Settings → Use Data Export/Import for CPQ metadata Step 2: Use Salesforce Change Sets For standard metadata (profiles, fields, page layouts) CPQ custom objects are included automatically Step 3: Use Data Loader or SFDX for data records Export: Products, Pricebooks, Price Rules, Product Rules Maintain record relationships using External IDs Import in correct dependency order Deployment Order: 1. Products and Pricebooks 2. Product Features and Options 3. Price Rules and Actions 4. Product Rules 5. Discount Schedules 6. Quote Templates 7. Approval Rules
"CPQ migration requires careful ordering — Products first, then Options, then Rules, then Templates. Use External IDs for relationship mapping and always deploy in dependency order to avoid reference errors."
📍 CPQ Package Settings
The CPQ Package Settings object (SBQQ__PackageProductsSettings__c) controls global CPQ behavior across the entire org.
| Setting | Purpose |
|---|---|
| Quote Line Editable Fields | Controls which fields are editable in QLE |
| Proration Precision | Decimal precision for prorated amounts |
| Auto Create Orders | Automatically create orders on contracting |
| Contracted Price Priority | Whether contracted prices override price rules |
| Net Unit Price Editable | Allow reps to manually edit net price |
| Enable Large Quote Experience | Performance mode for quotes with 100+ lines |
"CPQ Package Settings control global org-wide behavior — from field editability and proration precision to auto-order creation. Understanding these settings is critical for CPQ architecture decisions."
📍 Customization Options
| Method | What You Can Customize |
|---|---|
| Feature Categories | Group features into tabs or sections |
| Configuration Attributes | Add input fields above option lists |
| Custom Actions | Add buttons to the configurator header |
| Option Columns | Control which fields show per option row |
| Lightning Plugin | Inject custom LWC components into the configurator |
| Product Search Filter | Customize via ProductSearchPlugin Apex interface |
For deep UI customization, use the SBQQ.ProductSearchPlugin or inject custom components using the CPQ Lightning Plugin framework.
"CPQ Configurator UI can be customized via Feature Categories, Configuration Attributes, Option Column visibility and Custom Actions declaratively. For deeper customization, use the CPQ Lightning Plugin framework to inject LWC components."
📍 Amendment + Proration Flow
Active Contract: Jan 1 - Dec 31, Annual $12,000 Amendment initiated: July 1 (6 months remaining) Scenario A: Add new product at $6,000/year Prorated charge = $6,000 × (6/12) = $3,000 for remainder Scenario B: Increase existing product quantity from 10 to 15 Original per unit = $100/month Additional 5 units × $100 × 6 months = $3,000 prorated Scenario C: Remove a product mid-term Credit calculated for remaining period = Product price × remaining months/total months
📍 Key Amendment Rules
- Existing subscription lines are locked — cannot be deleted
- Quantity can be increased or decreased
- New products can be added
- All changes are prorated to contract end date
"During amendment, CPQ prorates all changes to the contract end date. Additions are charged for remaining days, removals generate credits, and quantity increases charge the delta only — all calculated automatically."
📍 Architecture Design
Product Setup:
Hardware Products:
- Subscription Type: One-Time
- No subscription records created
- No proration
- Excluded from renewals
SaaS Products:
- Subscription Type: Renewable
- Creates Subscription records on contracting
- Prorated on amendment
- Included in renewal quotes
Quote Line Groups:
Group 1: Hardware (one-time)
- Start date = today
- No end date needed
Group 2: SaaS Licenses (subscription)
- Start date = go-live date
- End date = contract term end
Pricing:
Hardware: Block pricing or list price
SaaS: Discount Schedules based on seat count
Renewal Behavior:
Hardware lines: excluded from renewal quote
SaaS lines: auto-included in renewal quote
"Use Quote Line Groups to separate one-time hardware from recurring SaaS on the same quote. Set hardware as One-Time subscription type so it never appears on renewals — SaaS products with Renewable type auto-populate future renewal quotes."
| Mistake | Impact | How to Avoid |
|---|---|---|
| Too many Price Rules | Slow QLE performance | Combine rules, use Lookup Objects instead of multiple rules |
| No Evaluation Order planning | Rules fire in wrong sequence, incorrect prices | Document and test evaluation order in design phase |
| Triggers on CPQ objects | Conflicts with CPQ calculation engine | Use CPQ Plugins instead of Apex triggers |
| Not using Twin Fields | Data not syncing to Assets/Subscriptions | Map all custom fields using Twin Fields pattern |
| One giant bundle | Slow configuration, hard to maintain | Use nested bundles and feature categories |
| Hardcoded prices in rules | Difficult to maintain, requires rule edits for price changes | Use Lookup Objects for all price/discount data |
| No test for 0 quantity | Pricing errors on optional products | Test all edge cases including 0 and negative quantities |
"Most CPQ issues come from too many Price Rules, unplanned evaluation order, Apex triggers conflicting with CPQ engine, and hardcoded values. Always use Lookup Objects for pricing data, CPQ Plugins instead of triggers, and test evaluation order thoroughly."