Overview
Advanced Configurator in Salesforce Revenue Cloud enables you to manage complex product, option, and attribute behavior during configuration.
Using the Constraint Modeling Language (CML) or Visual Builder, you can define rules that:
- Guide users to valid product and attribute combinations.
- Automatically add, remove, or suggest products/options.
- Hide or disable attributes, options, or values based on conditions.
- Display information, warnings, or errors during configuration.
- Enforce business policies to prevent invalid configurations before quoting.
This ensures a guided, error-free, and efficient configuration experience for sales teams, improving accuracy and reducing rework.
What is CML?
Constraint Modeling Language (CML) is a domain-specific language that defines models for complex systems.
For product configuration, constraint models:
- Describe real-world entities and their relationships.
- Enforce business logic declaratively without extensive coding.
- Are compiled by the constraint engine into executable configuration models.
Types of Rules in CML
1. Constraint Rule
Blocks incompatible combinations.
| constraint( solarPanelPackage.System_Size_Def == “20”, “System size 20 is not compatible.” ); |
2. Require Rule
Automatically selects a product/attribute when a condition is met.
| require( Battery_Type == “Lithium-Ion”, lithiumbattery[LithiumBattery], “Lithium battery automatically added.” ); |
3. Preference Rule
Suggests a value (user can override).
| preference( solarPanelPackage.Panel_Type_Def == “Polycrystalline” -> invertorConfigurationBundle.Amp_Rating_Def == “100A”, “Suggested Amp Rating: 100A” ); |
4. Exclude Rule
Hides a product, attribute, or value.
| exclude( solarPanelPackage.System_Size_Def == “5”, invertorConfigurationBundle.Mount_Type_Def, “Mount Type hidden for size 5” ); |
5. Message Rule
Displays informational, warning, or error messages.
| message( Battery_Type == “None”, “Warning: No battery selected.” ); |
6. Hide & Disable Rule (UI JSON Rule)
Controls visibility and editability in the UI.
| rule( Battery_Type == “Lead-Acid”, “hide”, “attribute”, “invertorConfigurationBundle.Compliance_Def”, “value”, [“TX PUC”, “National Std”] ) |
Prerequisites
Before creating a constraint model, complete the prerequisites to enable the Advanced Configurator.
Refer to Setup Advance Configurator documentation.
Use Case: Total System Power → Auto-add Load Balancer
Bundle: SolarPanelBundle
→ Attribute: Panel_Power (Number type, values: e.g., 5, 10, 15, 20)
→ Bundle Quantity: SolarPanelBundle.Quantity
→ Child Product: LoadBalancer
Goal:
If Total Power ≥ 50 kW, automatically add the LoadBalancer product to the bundle.
Total Power is Bundle Quantity * Attribute Value(Panel Power)
Steps to Create a Constraint Model
Step 1 – Open Constraint Models
- Go to App Launcher → Search Constraint Models → Click New Constraint Model.
Step 2 – Select Context Definition
- Choose the same context definition as used in pricing (SalesTransaction, Quote, or SalesTransactionItem).
Step 3 – Open Model Version
- When the model opens, choose Visual Builder or CML Editor.
Step 4 – Add Products in Visual Builder
- Click Add Item to add the bundle/product.
- Product Options and Attributes are auto-added as relations.
- Now you will see a screen like this in the Visual Builder → Click on Save → Change the Editor to create rule in CML.
- Now in the CML Editor, the product is automatically added, and if it has options or attributes, they are automatically added as well.
| type LineItem; type SolarPanelPackage : LineItem { relation loadbalancer : LoadBalancer; decimal(2) Panel_Power_def; } type LoadBalancer : LineItem; |
- Now we need to add rules based on the attribute. Our condition is: if Total Power is >= 50 then automatically add Load Balancer product to Bundle.
| type LineItem; type SolarPanelPackage : LineItem { relation loadbalancer : LoadBalancer; int Quantity = this.quantity; decimal(2) Panel_Power_def; int totalpower = Quantity * Panel_Power_def; require(totalpower >= 50, loadbalancer[LoadBalancer], “Systems with ≥ 50 kW require a Load Balancer”); } type LoadBalancer : LineItem; |
Add require rule, and the condition is based on an attribute calculation.
- Save and Activate the model.
The Quote Line appears as follows:
Troubleshooting – SF-Pricing-00006 Error
Error:
SF-Pricing-00006: The value specified for the evaluation resource for ListOperation#1 isn’t valid. We couldn’t simulate the step because one or more specified resources don’t have corresponding values for evaluation.
Fix:
- Open the Active Pricing Procedure → Open the Active Version.
- Update the container section at the end of the procedure by adding NULL check condition.
- Save, create a new version, and Activate.
Advantages of Advanced Configurator
- No extra records needed for exclusions (unlike CPQ).
- Complex conditions possible (not limited to AND).
- Fewer admin clicks with declarative rule setup.
- Improved UX with guided, relevant selections only.
- Faster sales cycles by reducing invalid configurations.
→ Feature Comparison: Standard vs Advanced Configurator with real world Example:-
| Feature / Capability | Standard Configurator | Advanced Configurator (CML) | Real-World Example |
| Interface | UI-based — point-and-click Visual Editor. | Code-based — requires writing in CML (Configuration Modeling Language). | Standard: Select fields & actions visually. Advanced: Write logic script in CML editor. |
| Logic Type | Only AND-based conditions. | Complex logic with AND, OR, nested conditions, and formulas. | Standard: If Battery Type = Lithium-Ion AND Panel Type = Polycrystalline → Require Surge Protector. Advanced: If (Battery Type = Lithium-Ion OR Nickel-Cadmium) AND Region = “CA” → Auto-add Surge Protector. |
| Cross-Bundle Rules | Not possible — rules apply only within the same bundle. | Possible — attributes from one bundle can control options in another. | If Solar Panel Size ≥ 15 kW in “Solar Package” → Only allow “Industrial Inverter” in “Inverter Bundle”. |
| Multi-Dependency Rules | Limited — one attribute can depend on another, but chaining is not supported. | Unlimited — can chain multiple dependencies in one rule. | If Battery Type = Lithium-Ion → Allow High Voltage; If High Voltage → Auto-add Cooling System. |
| Debugging | Hard to debug — no direct logging mechanism. | Can create debug logs. | Display selected attribute values in real time for troubleshooting. |
| Summary Variables | Not supported. | Fully supported — can calculate values & use in conditions. | If (Number of Ports × Power Rating) > 40 kW → Auto-add Load Balancer + Surge Protector. |
| Actions & Conditions Limit | Max 3 conditions & 3 actions per rule. | No limit — unlimited actions & conditions. | One condition can add 5 products + hide 3 attributes in one go. |
| Rule Management | Need separate rules for each configuration scenario. | Can handle all product logic in a single CML script. | Standard: 5 rules for 5 variations. Advanced: 1 script with 5 conditions. |