Salesforce CPQ bundles: campus courtyard with golden autumn trees

Salesforce CPQ bundles: parent, child, option and root

The fields that express a bundle hierarchy on Salesforce CPQ subscriptions and assets, the rules each must satisfy, and how a missing bundle header is constructed.

A bundle is a parent product with child products beneath it. In Salesforce CPQ the hierarchy is not a separate object; it is expressed by fields on each subscription or asset that identify the line's direct parent, its ultimate parent and the product option that joins its product to its parent's product. Flat legacy data seldom carries these, so they are derived, and the derivation is where most bundle defects originate. For teams moving from Salesforce CPQ to Revenue Cloud, see CPQ to Revenue Cloud migration.

Fields that express Salesforce CPQ bundles

FieldBundle headerBundle child
Required By IdBlankThe identifier of the direct parent line; a different line with that identifier must exist.
Required By ProductBlankThe parent line's product (the configured SKU of the product option).
Root IdBlankThe identifier of the ultimate parent line at the top of the hierarchy.
Product OptionBlankThe product option whose optional SKU equals this line's product and whose configured SKU equals the parent's product.
Option LevelBlank1 for a child of the top-level bundle, 2 for a grandchild, and so on.
Option TypeBlankComponent, accessory or related product, matching the product option. Component implies that this line's quantity must equal the parent's quantity multiplied by the option quantity.
Package (bundle) flagTrueFalse, unless the child is itself a bundle with options of its own
Bundled flagFalseAs on the product option; when true, the line has no price of its own.
NumberPrecedes its childrenFollows its parent; drives display order.
Diagram of a Salesforce CPQ bundle hierarchy with parent, option and root lines
Salesforce CPQ bundles: how each line points to its parent and its root.

Bundle parent and child lines, and the generated header

Whether a line is a child is determined by the product catalog: a subscription's product is a child if it appears as the optional SKU of at least one product option, and a parent if it appears as the configured SKU of at least one. Where a legacy line is a child but no parent line exists in the source, a bundle header is generated: a new row whose product is the configured SKU of the child's product option, with the child re-parented beneath it. The decision as to where price resides, on the header or on the components, is made before this step, because it determines which of the generated or existing lines carries a zero price.

Validation and functional confirmation

Every bundle is validated against its product options, for completeness and quantities, before any functional test.

Functional confirmation is not optional. On an amendment quote the bundle product must precede its children, the children must be indented beneath it, and each must be correctly parented; the quote line editor may display lines in the correct order while they are not in fact associated with the bundle line, because the order comes from each line's number and the association from its Required By field. Adjusting the header quantity must adjust the children; adjusting a child must adjust price. Percent-of-total subscriptions are linked to the assets they cover through subscribed asset records.

Assess the data before the agents depend upon it

The first call is with the practitioners who would do the work, not a sales intermediary. The measures come first and the estimate follows.

Talk to our experts