Here’s the comprehensive solution covering all three critical areas:
1. Product2 Record Validation
First, verify your bundle product record meets CPQ requirements. Query the product and check these specific fields:
SELECT Id, ProductCode, IsActive, SBQQ__Component__c,
SBQQ__ConfigurationRequired__c, SBQQ__QuantityEditable__c
FROM Product2
WHERE ProductCode = 'BUNDLE-PRO-001'
For bundle products, these field values must be set correctly:
- IsActive = true (standard Salesforce field)
- SBQQ__Component__c = false (bundle parents are NOT components)
- SBQQ__HasConfigurationAttributes__c = false (unless you’re passing config data)
- SBQQ__QuantityEditable__c = true (recommended for bundles)
If SBQQ__Component__c is true, CPQ treats it as a bundle child component, not a parent bundle, and the API will reject it when used as a standalone line item.
2. API Payload Mapping Corrections
Your API payload structure needs adjustment. Don’t mix ProductCode with Product ID references:
POST /services/apexrest/SBQQ/ServiceRouter
{
"saver": "SBQQ.QuoteAPI.QuoteSaver",
"model": {
"record": {
"SBQQ__Status__c": "Draft",
"SBQQ__PriceBook__c": "01sxx000002AbCD"
},
"lineItems": [{
"SBQQ__Product__c": "01txx000002YhPQ",
"SBQQ__Quantity__c": 1,
"SBQQ__Bundle__c": true
}]
}
}
Key changes:
- Remove SBQQ__ProductCode__c from payload (API doesn’t use it for lookups)
- Add SBQQ__Bundle__c = true to mark the line as a bundle parent
- Include SBQQ__PriceBook__c in the quote record (required for product validation)
- Use the Product2 Id directly in SBQQ__Product__c
The API validates products against the quote’s price book, so ensure your bundle product has an active PricebookEntry for the specified price book.
3. Bundle Activation and Product Options
Verify your bundle structure is complete. A bundle product needs active product options to be API-valid:
SELECT Id, SBQQ__Number__c, SBQQ__ConfiguredSKU__c,
SBQQ__OptionalSKU__c, SBQQ__Quantity__c
FROM SBQQ__ProductOption__c
WHERE SBQQ__ConfiguredSKU__c = '01txx000002YhPQ'
AND SBQQ__OptionalSKU__r.IsActive = true
If this query returns zero rows, your bundle has no component products configured. To fix:
- Navigate to the bundle product record in Salesforce
- Click ‘Options’ related list > New Product Option
- Set:
- Optional SKU: Select a component product
- Number: Sequential number (10, 20, 30…)
- Quantity: Default quantity for this component
- Type: ‘Component’ for required items, ‘Accessory’ for optional
- Save and repeat for all bundle components
Each bundle must have at least one product option record linking it to component products. Without these, CPQ considers the bundle incomplete and the API rejects it.
Additional Validation Steps:
- Test bundle configuration manually in CPQ UI before API integration
- Verify API user has read access to: Product2, PricebookEntry, SBQQ__ProductOption__c, SBQQ__ProductFeature__c
- Check that all component products referenced in product options are also active
- Ensure price book entry exists for bundle product: SELECT Id FROM PricebookEntry WHERE Product2Id = ‘01txx000002YhPQ’ AND IsActive = true
- If using configuration attributes, include them in the lineItems payload under SBQQ__ConfigurationAttributes__c
After fixing the product option records and adjusting the API payload, your bundle quotes should sync successfully. The key insight is that CPQ bundles require complete structural setup (product options) before the API will accept them, even if the parent product record appears valid.