A step-by-step guide that takes you from custom fields all the way to a fully filtered product catalog.
Why Qualification Rules Matter
Even well-curated product catalogs can confuse sellers when certain SKUs are limited to specific geographies, industries, or contract terms. Qualification rules ensure reps only see products that are actually sellable in a given situation, reducing quoting errors and improving customer satisfaction. This guide walks through an end-to-end implementation that filters products by Region —but you can adapt the pattern to any field or combination of fields.
Prerequisites
Item | Notes |
---|---|
Revenue Cloud org with Product Discovery enabled | API version Summer ’25 (or later) |
Permission to create custom objects, fields, flows, and Apex | System Administrator or equivalent |
Familiarity with Decision Tables and Procedures | Helpful but not mandatory |
(Optional) Jetstream CLI | Speeds up bulk field creation |
1 · Create Custom Fields
We need a single Region picklist on two objects:
Object | Field | Type | Values |
---|---|---|---|
Quote | Region__c | Picklist | Americas, EMEA, APAC |
Product Disqualification | Region__c | Picklist | Same list |
Tip: Jetstream supports multi-object field creation. If you prefer the UI, navigate to Object Manager → [Object] → Fields & Relationships → New.
2 · Extend the Product Discovery Context Definition
- Setup → Product Discovery Context Definitions
- Clone or edit Product Discovery.
- Add a sibling node named
Quote
at the root level.
Inside the new node, add an Attribute calledRegion
(Data Type = Picklist, Direction = Input/Output).
- Tag the node and attribute (e.g.,
Quote
andQuote.Region
).
3 · Map Quote Data to the Context
- Still in the context definition, open Data Mappings → Product Discovery Mapping.
- Click Edit SObject Mapping →
+ Object
→ selectQuote
. - Drag
Quote (node)
→Quote (object)
. - Map
Region (attribute)
→Region__c (field)
. - Save and Activate the context definition.
4 · Create Product Disqualification Records
Navigate to Product Disqualifications and insert rows like:
Product | Region | Effective From | Effective To |
---|---|---|---|
Americas Subscription | Americas | 2025-05-01 | 2099-12-31 |
APAC Subscription | APAC | 2025-05-01 | 2099-12-31 |
5 · Build a Decision Table
- Setup → Lookup Tables → New
- Type: Decision Table → Next
Table Type: Standard •
Usage:Product Qualification
- Select the
Product Disqualification Decision Table
template → Finish.
Re-open the table → Add Condition Column
Field:Region__c
• Operator:!=
(Not Equal)
- Save, Activate, and (whenever you add data) Refresh the table.
6 · Create the Qualification Procedure
- App Launcher → Qualification Procedures → New
- Name:
Product Disqualification
•
Usage:Product Qualification
- Context Definition: Extended Product Discovery
- Open Version 1 → Add Element →
Evaluate Decision Table
- Point to your decision table and map variables:
Decision Column | Context Variable |
---|---|
Product ID | Product.ID |
Parent Product ID | ParentProduct.ID |
Root Product ID | RootProduct.ID |
Region | Quote.Region |
Is Qualified | IsQualified |
Reason | Reason |
Save and Activate the procedure.
7 · Add the Apex Class for Extra Context
Create a class that converts any record (Quote or Order) into JSON for the Product Discovery LWC.
public class ProductDiscoveryAdditionalContextData {
// This class is used to hold input parameters
public class FlowInput{
@invocableVariable(required=false)
public String objectApiName;
@invocableVariable(required=false)
public String recordId;
}
// This class is used to hold output parameters
public class FlowOutput{
@invocableVariable
public runtime_industries_cpq.ContextDataInput[] additionalContextData;
}
// This method can be called from a Flow
@invocableMethod(label='Generate JSON' description='Generates additional Context data JSON for Quote node')
public static List<FlowOutput> generateJSON(List<FlowInput> inputs){
String apiName;
String recId;
FlowOutput output = new FlowOutput();
// Create a list to hold results
System.debug('Log Input :' + inputs);
for(FlowInput input: inputs){
apiName = input.objectApiName;
recId = input.recordId;
}
List<runtime_industries_cpq.ContextDataInput> lstAdditionalContextData = new List<runtime_industries_cpq.ContextDataInput>();
runtime_industries_cpq.ContextDataInput contextData = new runtime_industries_cpq.ContextDataInput();
contextData.nodeName = apiName;
contextData.nodeData = new Map<String, Object>();
contextData.nodeData.put('id', recId);
lstAdditionalContextData.add(contextData);
output.additionalContextData = lstAdditionalContextData;
List<FlowOutput> outputs = new List<FlowOutput>();
outputs.add(output);
return outputs;
}
}
8 · Clone and Modify the Discover Products Flow
- Setup → Flows → Discover Products → Clone as New Flow.
- Add an Apex Action just before the Product List screen.
Class:ProductDiscoveryAdditionalContextData
.GenerateJSON
objectApiName = “Quote”
recordId = {!recordId}
- On the Product List screen, bind Context Data Input Array to the action’s
output (additionalContext
). - Save as Custom Browse Products and Activate.
9 · Wire Everything Together in Settings
Setting | Value |
---|---|
Context Definition | Extended Product Discovery |
Qualification Procedure | Product Disqualification |
Browse / Add Products Flow | Custom Browse Products |
Enable Qualification Procedure | ✔ |
10 · Test the Result
- Create a Quote with Region = Americas.
- Click Browse Catalog —only Americas products appear.
- Toggle Show Disqualified Products —APAC SKUs display as unavailable.
- Change the Quote’s Region to APAC; results invert exactly as expected.
Troubleshooting Checklist
Symptom | Likely Cause |
---|---|
All products still appear | Flow not updated or wrong flow selected in settings |
No products appear | Qualification Procedure active but Region not mapped/populated |
Unexpected results | Decision Table operator mis-configured (= vs != ) |
Apex errors | Incorrect object API name or field selection |
Best Practices & Next Steps
- Granular Data Model — consider custom metadata for multi-dimensional eligibility.
- Version Control — store Qualification Procedures in VCS for auditability.
- Automated Tests — build Apex tests that assert
IsQualified
across scenarios. - User Feedback — surface the Reason column in product tiles so reps know why a SKU is unavailable.
Conclusion
With Qualification Procedures in place, sellers navigate a cleaner catalog, pricing teams enforce policy automatically, and customers see only relevant options. Adapt this tutorial to other attributes—industry, contract length, compliance flags—and further streamline the quoting experience.
Questions or feedback? Comment on the accompanying YouTube video or reach out on LinkedIn. Interested in structured, hands-on guidance? Join the waitlist for the forthcoming Revenue Cloud course.