19

Aug

When designing bundles in Salesforce Revenue Cloud Advanced (RCA), there are many ways to drive consistency across child products but one of the most elegant is attribute inheritance: letting child products inherit values directly from their parent bundle.

In this post, we’ll walk through a lightweight example of how to propagate attributes from a parent bundle down to its components using the Constraint Modeling Language (CML).

Let’s say we sell a bundled product called SmartHomeKit, which includes:

  • a SmartThermostat
  • a SmartLightController
  • a SecurityHub

We want the user to configure two attributes only once at the bundle level:

  • ConnectivityType (values: "Wi-Fi", "Zigbee", "Thread")
  • Region (values: "US", "EU", "APAC")

Every child product must inherit these values because we don’t want them configured separately.

Step 1: Set Up Your Bundle Structure

Before attributes can flow from parent to child, you need to model the bundle in the Constraint Builder. To access the Constraint Models and Constraint Builder, first finish these steps to activate the Advanced Configurator.

In Salesforce:

From App Launcher, navigate to Constraint Models

Create a new Constraint Model with usage type Constraint

Open the Constraint Builder for its version

Switch to CML Editor

Create a type for your bundle (e.g., SmartHomeKit)

Use “Define Type Variables” to pull in bundle-level attributes from the product catalog (like ConnectivityType, Region)

Then use “Define Relationships” to add the child products (e.g., SmartThermostat, SecurityHub)

At this point, the system understands the bundle-parent and its children and you’re ready to make attributes flow.

Important!
Attribute Inheritance: The Core Concept
Once your model is structured, CML lets you reference any parent-level attribute from a child
using the special function:
parent()
This tells the child to dynamically use the value of the attribute
from its parent at runtime and it is done by referencing the parent’s attribute
like this in the child type definition:
string ConnectivityType = parent(ConnectivityType);
string Region = parent(Region);
To fully enforce attribute inheritance, you can optionally disable the inherited attributes on the child products.
This ensures the values are always driven by the parent and not manually overridden.
Use this pattern in each child type:
rule(true, "disable", "attribute", "ConnectivityType");
rule(true, "disable", "attribute", "Region");
This keeps the experience clean and prevents users from accidentally editing child values that are
meant to be centrally controlled.

Final CML Example:

type SmartHomeKit {
    @(defaultValue = "Wi-Fi")
    string ConnectivityType = ["Wi-Fi", "Zigbee", "Thread"];
    @(defaultValue = "US")
    string Region = ["US", "EU", "APAC"];
    relation thermostat : SmartThermostat;
    relation lighting : SmartLightController;
    relation security : SecurityHub;
}
type SmartThermostat {
    string ConnectivityType = parent(ConnectivityType);
    string Region = parent(Region);
    // Optional: disable editing
    rule(true, "disable", "attribute", "ConnectivityType");
    rule(true, "disable", "attribute", "Region");
}
type SmartLightController {
    string ConnectivityType = parent(ConnectivityType);
    string Region = parent(Region);
    rule(true, "disable", "attribute", "ConnectivityType");
    rule(true, "disable", "attribute", "Region");
}
type SecurityHub {
    string ConnectivityType = parent(ConnectivityType);
    string Region = parent(Region);
    rule(true, "disable", "attribute", "ConnectivityType");
    rule(true, "disable", "attribute", "Region");
}

Once the Constraint Model is saved and activated, you’ll see this working directly in configuration: select Zigbee and EU on the SmartHomeKit, and all child lines will carry those values automatically, no manual entry needed.

This works great for consistency in regional settings, compliance flags, deployment options, or anything shared across components.

Attribute inheritance is a small change that delivers big results. It keeps your quoting experience cleaner, reduces errors, and centralizes control at the level where it belongs: the bundle.

Reach out to Milo Massimo for expert help with your Revenue Cloud Implementation