Product Catalog
Hands-On Lab
Build Comuniqa's full B2C product catalog from scratch โ attributes, classifications, simple products, bundles, selling models, and qualification rules. Each task shows the expected outcome; click Hint if you need step-by-step guidance.
Business Requirements & Product Model
Before touching the platform, understand what Comuniqa needs to achieve commercially and why the catalog is structured the way it is. Every task in this lab maps directly to one or more of the requirements below.
The Comuniqa Catalog Challenge
Comuniqa is an Argentine B2C telco launching its new digital sales platform on Salesforce Revenue Cloud Advanced. Their product catalog has four layers of complexity that must all work together before a single quote can be created:
A configurable bundle (Comuniqa Go! Vida Digital) with 5 groups, 9 child products, required/optional rules, and a nested sub-bundle (Vida Digital Pass).
18 attributes across 5 product types โ agent-configurable, fulfillment-populated, and read-only โ each requiring correct data type and visibility settings.
Three commitment options on a single product: No Contract (Evergreen), 12-Month (Term-Defined), and 24-Month (Term-Defined) โ each driving different billing and renewal behaviour.
6 qualification rules gate product availability: age, debt balance, credit score, max active lines, Vida Digital bundle composition, and YouTube account validation.
Key Products to Build
| Product | Type | Description | Sell Standalone |
|---|---|---|---|
| Comuniqa Go! (Comuniqa Vida Digital) | Bundle Root | Master bundle โ mobile plan + optional Vida Digital Pass subscription | โ Yes |
| Comuniqa Go! | Simple (configurable) | Base mobile plan โ unlimited voice, SMS, data. Postpaid, individual. | โ Yes |
| Comuniqa Go! Youth | Simple (configurable) | Youth variant (age โค18) โ same inclusions, restricted by qualification rule | โ Yes |
| SIM Card | Simple (configurable) | Physical SIM or eSIM. Required component. Free of charge. | โ Sub-component only |
| Phone Number | Simple (configurable) | Auto-assigned or customer-selected. Required component. | โ Sub-component only |
| Phone Number Portability | Simple (configurable) | Optional port-in service from another carrier | โ Sub-component only |
| Comuniqa Family Go! Data Bundle | Simple (configurable) | Data sharing for 2โ5 family members. Free of charge. | โ Sub-component only |
| Comuniqa Go! Two | Simple (configurable) | Watch connectivity service โ Apple Watch or Samsung Galaxy Watch | โ Sub-component only |
| Comuniqa Go! Shared Two | Simple (configurable) | Alternative watch service variant for shared lines | โ Sub-component only |
| MoviMundo Plus+ | Simple (static) | Premium streaming partner โ FHD, 2 devices. ARS 13,900/month. | โ Yes |
| MoviMundo Basic+ | Simple (static) | Standard streaming partner. ARS 7,900/month. | โ Yes |
| Comuniqa Vida Digital Pass C&C | Bundle (configurable) | Retail & cafรฉ discount pass with 1โ2 optional streaming add-ons. ARS 9,900/month. | โ Sub-component only |
| Mi Coto Discount | Simple (static) | Mandatory benefit inside Vida Digital Pass โ up to 30% off Mi Coto stores | โ Sub-component only |
| Club Dรญa Discount | Simple (static) | Mandatory benefit inside Vida Digital Pass โ up to 30% off Club Dรญa stores | โ Sub-component only |
Bundle Architecture โ What You Are Building
โณ Group: SIM (Min 1, Max 1) โ SIM Card [Required, Default]
โณ Group: Phone Number & Portability (Min 1, Max 1) โ Phone Number [Required, Default] | Portability [Optional]
โณ Group: Value-Added Services (Min 0, Max 3) โ Family Bundle | Go! Two | Shared Two [all Optional]
โณ Group: Partner VAS (Min 0, Max 1) โ MoviMundo Plus+ | MoviMundo Basic+ [Optional โ mutually exclusive]
Group: Subscriptions (Min 0, Max 1) โ Vida Digital Pass [Optional]
โณ Group: Base Benefits (Min 2, Max 2) โ Mi Coto [Required] | Club Dรญa [Required]
โณ Group: Additional Benefits (Min 1, Max 2) โ Streaming add-ons [Optional]
Qualification Rules to Implement
| # | Rule Name | Logic | Products Affected |
|---|---|---|---|
| 1 | Customer Age Validation | age > 18 โ Fail | Comuniqa Go! Youth only |
| 2 | Outstanding Amount | outstandingAmount > 0 โ Fail | All mobile plan products |
| 3 | Max Active Mobile Lines | activeLines โฅ maxLines โ Fail | All mobile plan products |
| 4 | Credit Score Check | creditScore < 600 โ Fail | Term-based subscriptions |
| 5 | Vida Digital Add-On Validation | Count(mandatory) โ 2 OR Count(optional) โ 1 โ Fail | Vida Digital Pass |
| 6 | YouTube Mundo Google Account | GoogleEmail null or invalid โ Fail | YouTube Mundo add-on |
Pre-Lab Setup
Before starting, confirm your org is ready and you understand the scope. Check off each item below.
This lab prioritises Contextual Mapping Language (CML) over the Business Rules Engine (BRE) wherever rule logic is required โ specifically for qualification procedures in Task 6. CML provides cleaner separation of concerns, better testability, and is the recommended approach for all advanced ARM implementations. BRE alternatives are noted where applicable but not the primary path.
Task 1 โ Build the Attribute Foundation
- Catalog named "B2C Mรณvil Argentina" exists with Status = Active
- 4 categories created: Mobile Plans (sort โ1), Add-On Services (sort 0), Partner Content (sort 1), Subscriptions (sort 2)
- All categories linked to the B2C Mรณvil Argentina catalog
New.B2C Mรณvil Argentina, Code = CQ-B2C-MOB, Type = Sales, Effective Start Date = today. Leave End Date blank. Save.New Category.MOB-PLANS), Sort Order as listed in the expected outcome. Leave Parent Category blank for all four (these are top-level). Save each.This hides the catalog from Product Discovery entirely. Always use Sales for commercial B2C catalogs.
- Contract Term โ values: No Contract (default), 12 Months, 24 Months
- SIM Card Format โ values: Physical SIM (default), eSIM
- Sharing Mode โ values: Immediate (default), Monthly (1st of month)
- Watch Device Type โ values: Apple Watch, Samsung Galaxy Watch
- Phone Number Type โ values: Standard (default), Premium
- Phone Number Category โ values: Bronze (default), Silver, Gold
- Billing Frequency โ values: Monthly (default), Annual
New.Contract Term, Data Type = Text. Save. Then in the Picklist Values related list, add three values. Set Sequence: No Contract = 10, 12 Months = 20, 24 Months = 30. Check Default on "No Contract".Text for all. For each value, always set a Sequence (10, 20, 30โฆ) and mark exactly one value as Default.If no picklist value is marked as Default, the attribute will appear blank at order time and agents will be confused. Always set a sensible default.
Attribute Definitions to Create
| Attribute | Type | Required | Price Impacting | Notes |
|---|---|---|---|---|
| Voice Calls Included | Text | No | No | Static descriptor |
| SMS/MMS Included | Text | No | No | Static descriptor |
| Data Included | Text | No | No | Static descriptor |
| Data Speed Beyond Allowance | Text | No | No | Static descriptor |
| Contract Term | Picklist | Yes | Yes | Drives pricing discount |
| SIM Card Format | Picklist | Yes | No | Agent selects at order time |
| ICCID | Text | No | No | ReadOnly, fulfillment-populated |
| Phone Number | Text | No | No | ReadOnly, fulfillment-populated |
| Phone Number Type | Picklist | Yes | No | |
| Watch Device Type | Picklist | Yes | No | |
| Watch IMEI | Text | No | No | ReadOnly, fulfillment-populated |
| Paired Mobile Number | Text | No | No | ReadOnly |
| Group Name | Text | No | No | Family bundle group label |
| Sharing Mode | Picklist | Yes | No | |
| Member Count | Number | Yes | No | Min 2, Max 5 |
| GoogleEmail | Text | Yes | No | Required for YouTube Mundo activation |
| ActivationStatus | Text | No | No | ReadOnly, partner API callback |
| Billing Frequency | Picklist | Yes | No | Subscription pass billing |
Product Classifications to Create
| Classification Name | Attributes to Assign |
|---|---|
| Mobile Plan Attributes | Voice Calls Included, SMS/MMS Included, Data Included, Data Speed Beyond Allowance, Contract Term, SIM Card Format, ICCID, Phone Number |
| Watch Service Attributes | Watch Device Type, Watch IMEI, Paired Mobile Number |
| Family Bundle Attributes | Group Name, Sharing Mode, Member Count |
| Streaming Pass Attributes | GoogleEmail, ActivationStatus, Billing Frequency |
| Phone Number Attributes | Phone Number, Phone Number Type |
- 18 attribute definitions created with correct data types and settings
- ICCID, Phone Number, Watch IMEI, Paired Mobile Number, ActivationStatus all set to IsReadOnly = true
- Contract Term has Is Price Impacting = true
- 5 product classifications created in Active status
- Each classification has the correct attributes assigned
New. For each attribute, set Name, Data Type, and for Picklist types select the corresponding picklist from the lookup.New. Set Name and Code. Leave Status = Draft initially.Add Attributes. Select the attributes listed in the table above for that classification.Once Active, a classification cannot be moved back to Draft. Always review the attribute list carefully before activating.
- Catalog "B2C Mรณvil Argentina" is Active and has 4 categories
- All 7 picklists exist with correct values and defaults
- All 18 attribute definitions created with correct types, Required flags, and ReadOnly flags
- Contract Term has Is Price Impacting = true
- All 5 product classifications are in Active status
- No attribute is assigned directly to a product yet โ classifications only at this stage
Task 2 โ Create Simple Products
| Product Name | Classification | Category | Config? | Sell Only With Others | Spec Type |
|---|---|---|---|---|---|
| Comuniqa Go! | Mobile Plan Attributes | Mobile Plans | โ Allowed | No | Commercial |
| SIM Card | Mobile Plan Attributes | Add-On Services | โ Allowed | โ Yes | Commercial |
| Phone Number | Phone Number Attributes | Add-On Services | โ Allowed | โ Yes | Commercial |
| Phone Number Portability | Phone Number Attributes | Add-On Services | โ Allowed | โ Yes | Commercial |
| Comuniqa Family Go! Data Bundle | Family Bundle Attributes | Add-On Services | โ Allowed | โ Yes | Commercial |
| Comuniqa Go! Two | Watch Service Attributes | Add-On Services | โ Allowed | โ Yes | Commercial |
| Comuniqa Go! Shared Two | Watch Service Attributes | Add-On Services | โ Allowed | โ Yes | Commercial |
| MoviMundo Plus+ | Streaming Pass Attributes | Partner Content | โ Not Allowed | No | Commercial |
| MoviMundo Basic+ | Streaming Pass Attributes | Partner Content | โ Not Allowed | No | Commercial |
| Mi Coto Discount | Streaming Pass Attributes | Subscriptions | โ Not Allowed | โ Yes | Commercial |
| Club Dรญa Discount | Streaming Pass Attributes | Subscriptions | โ Not Allowed | โ Yes | Commercial |
- 11 simple products created in Active status
- Each product linked to correct classification via the "Based On" field
- Each product assigned to the correct catalog category
- All products: Is Assetizable = true, Specification Type = Commercial
- SIM Card, Phone Number, Portability, Family Bundle, Go! Two, Shared Two, Mi Coto, Club Dรญa: Sell Only With Other Products = true
- Comuniqa Go! attribute values set: Voice Calls = "Unlimited", SMS/MMS = "Unlimited", Data = "Unlimited", Data Speed = "5Mbps"
New. Set Name, Product Code (e.g. CQ-GO-001), Product Type = None (for simple products).Commercial for all products. Set Is Assetizable = true.Add to Category โ select the correct one from the table above.Unlimited, SMS/MMS = Unlimited, Data = Unlimited, Data Speed = 5Mbps.Product Type should be None for simple products. Only the two bundle root products (Comuniqa Go! wrapper and Vida Digital Pass) use "Bundle". This is set separately in Task 3.
- 11 simple products exist and are Active
- Every product has Is Assetizable = true and Specification Type = Commercial
- Comuniqa Go! has all 4 static attribute values populated
- All sub-components have Sell Only With Other Products = true
- Navigate to Browse Catalogs โ Comuniqa Go! should appear under Mobile Plans (may need index rebuild)
Task 3 โ Assemble the Comuniqa Go! Bundle
Bundle Structure to Build
| Group Name | Min | Max | Child Product | Default | Required | Seq |
|---|---|---|---|---|---|---|
| Base Mobile Plan | 1 | 1 | Comuniqa Go! | โ | โ | 10 |
| SIM | 1 | 1 | SIM Card | โ | โ | 10 |
| Phone Number & Portability | 1 | 1 | Phone Number | โ | โ | 10 |
| Phone Number & Portability | โ | โ | Phone Number Portability | โ | โ | 20 |
| Value-Added Services | 0 | 3 | Comuniqa Family Go! Data Bundle | โ | โ | 10 |
| Value-Added Services | โ | โ | Comuniqa Go! Two | โ | โ | 20 |
| Value-Added Services | โ | โ | Comuniqa Go! Shared Two | โ | โ | 30 |
| Partner Value-Added Services | 0 | 1 | MoviMundo Plus+ | โ | โ | 20 |
| Partner Value-Added Services | โ | โ | MoviMundo Basic+ | โ | โ | 30 |
| Subscriptions | 0 | 1 | Comuniqa Vida Digital Pass C&C | โ | โ | 20 |
- Bundle root product "Comuniqa Go! (Comuniqa Vida Digital)" exists, Product Type = Bundle, Configure During Sale = Allowed
- 4 product groups created with correct cardinality settings
- All 9 child components assigned to correct groups with correct Required/Default/Sequence settings
- Run "Validate Product Definition" โ zero errors returned
- Is Assetizable = true on the bundle root
Comuniqa Go! (Comuniqa Vida Digital), Product Type = Bundle, Configure During Sale = Allowed. Set Is Assetizable = true. Save.Base Mobile Plan. Set Min Number of Components = 1, Max = 1, Sequence = 10. Save the group.Comuniqa Go!. Set Include by Default = true, Required = true, Sequence = 10. Save.Validate Product Definition. Review results. Fix any reported issues before proceeding.In a configurable bundle, ALL child products must be inside a Product Group. Attempting to add a component directly to the root will be blocked by the platform or produce validation errors.
If a component is Required but Include by Default = false, the validation will fail. Required components are always auto-included โ they must also have the default flag set.
- Bundle root product exists with Product Type = Bundle, Configure During Sale = Allowed
- 5 groups created with correct group cardinality (Min/Max)
- All child products assigned with correct Required, Default, and Sequence values
- "Validate Product Definition" returns zero errors
- In Browse Catalogs โ selecting Comuniqa Go! (Vida Digital) auto-adds SIM and Phone Number but not optional add-ons
Task 4 โ Configure Product Selling Models
| Product | Selling Model Name | Type | Pricing Term | Unit | Auto-Renew | Proration |
|---|---|---|---|---|---|---|
| Comuniqa Go! | No Contract (Monthly) | Evergreen | 1 | Month | N/A | Daily |
| Comuniqa Go! | 12-Month Contract | Term-Defined | 12 | Month | โ True | Daily |
| Comuniqa Go! | 24-Month Contract | Term-Defined | 24 | Month | โ True | Daily |
| SIM Card | SIM Evergreen | Evergreen | 1 | Month | N/A | Daily |
| Phone Number | Phone Number Evergreen | Evergreen | 1 | Month | N/A | Daily |
| MoviMundo Plus+ | MoviMundo Monthly | Evergreen | 1 | Month | N/A | Daily |
| MoviMundo Basic+ | MoviMundo Basic Monthly | Evergreen | 1 | Month | N/A | Daily |
- Comuniqa Go! has 3 Selling Model Options visible in its Product Selling Models related list
- Both Term-Defined models have Automatically Renew Asset by Default = true
- All Evergreen models have Pricing Term = 1, Unit = Month
- All selling models have Proration Policy = Daily
No Contract (Monthly), Selling Model Type = Evergreen, Pricing Term = 1, Pricing Term Unit = Month, Proration Policy = Daily. Save.12-Month Contract, Type = Term-Defined, Pricing Term = 12, Unit = Month, check Automatically Renew Asset by Default = true, Proration = Daily. Save.24-Month Contract, Type = Term-Defined, Pricing Term = 24, Unit = Month, Auto-Renew = true, Proration = Daily. Save.Add Selling Model. Add all three models. This creates the Selling Model Options on the product.- Comuniqa Go! shows 3 selling model options in its related list
- Both Term-Defined models have Auto-Renew = true
- All Evergreen models use Pricing Term = 1, Month
- SIM, Phone Number, MoviMundo Plus+, MoviMundo Basic+ each have 1 Evergreen selling model assigned
- No Price Book Entries created yet โ selling models only at this stage
Task 5 โ Build the Comuniqa Vida Digital Pass
Vida Digital Pass Bundle Structure
| Group | Min | Max | Child Product | Default | Required |
|---|---|---|---|---|---|
| Base Benefits | 2 | 2 | Mi Coto Discount | โ | โ |
| Base Benefits | โ | โ | Club Dรญa Discount | โ | โ |
| Additional Benefits | 1 | 2 | (Streaming add-ons โ placeholder products) | โ | โ |
- "Comuniqa Vida Digital Pass Convenience Store & Cafรฉ" bundle product created
- Product Code =
PR00012109 - Base Benefits group: Min = 2, Max = 2 with both Mi Coto and Club Dรญa as Required + Default
- Additional Benefits group: Min = 1, Max = 2 with optional streaming add-ons (not default)
- Validate Product Definition returns zero errors
- This product added as optional component in the "Subscriptions" group of Comuniqa Go! (Vida Digital) bundle
Comuniqa Vida Digital Pass Convenience Store & Cafรฉ, Code = PR00012109, Product Type = Bundle, Configure During Sale = Allowed, Is Assetizable = true.Base Benefits, Min = 2, Max = 2. Add Mi Coto Discount and Club Dรญa Discount โ both Required = true, Include by Default = true.Additional Benefits, Min = 1, Max = 2. Add your streaming add-on placeholder products as Optional (Required = false, Default = false).Add Product โ search for the Vida Digital Pass and add it as Optional, Default = false, Sequence = 20.- Vida Digital Pass bundle created with Product Code PR00012109
- Base Benefits group: exactly 2 required components, both default
- Additional Benefits group: Min=1, Max=2 with optional add-ons
- Vida Digital Pass added as optional component in parent bundle's Subscriptions group
- Both bundles pass Validate Product Definition with zero errors
Task 6 โ Build Qualification Rules (CML-First)
Qualification rules in ARM can be implemented via the Business Rules Engine (BRE) or Contextual Mapping Language (CML). We use CML because it provides a cleaner context mapping pattern, is more readable for complex multi-condition rules, separates input context from rule logic more cleanly, and is the recommended approach for all advanced ARM implementations. BRE qualification procedures are still functional but are considered the legacy path.
- Custom context definition extending ProductDiscoveryContext
- Input fields mapped: customerAge (Number), outstandingAmount (Currency), activeLines (Number), creditScore (Number)
- Each field mapped to the correct source object/field on the Account or Contact
- Context saved and activated
ProductDiscoveryContext. Click New Version or extend it via a custom definition depending on your org configuration.customerAge, Data Type = Number. Map the source to Account.PersonBirthdate โ configure a formula to calculate age = today - birthdate in years.outstandingAmount, Data Type = Currency. Map to Account.Outstanding_Balance__c (or equivalent custom field in your training org).activeLines, Data Type = Number. Map to a rollup or formula field representing active subscriptions count on the Account.creditScore, Data Type = Number. Map to Account.Credit_Score__c (simulated field in your training org).Rule 1 โ Customer Age Validation
customerAge from context. If customerAge > 18 โ Fail (product hidden). Else โ Pass. Applied to: Comuniqa Go! Youth product only.
Rule 2 โ Outstanding Amount Check
outstandingAmount from context. If outstandingAmount > 0 โ Fail (block all new subscriptions). Else โ Pass. Applied to: all Comuniqa mobile plan products.
Rule 3 โ Credit Score Check
creditScore from context. Look up minCreditScore = 600 from Decision Table. If creditScore < minCreditScore โ Fail. Else โ Pass. Applied to: Term-Defined (contract) selling model options.
- 3 CML Expression Sets created and activated โ one per rule
- Each Expression Set has an associated Decision Table with correct criteria rows
- Decision Tables are refreshed (data populated) before activation
- Qualification Procedure created in Product Discovery Settings referencing all 3 rules
- Test: In Browse Catalogs with a customer aged 20 โ Comuniqa Go! Youth does NOT appear
- Test: In Browse Catalogs with outstandingAmount = 500 โ all plan products are blocked
CQ-Qual-AgeValidation. Set Context Definition = your extended ProductDiscoveryContext. Type = Qualification.customerAge (Number), output column = isQualified (Boolean). Add row: if customerAge <= 18 โ isQualified = true. All other rows โ isQualified = false.isQualified to the Qualification output node. Activate the Expression Set.Decision Tables must be explicitly refreshed after any row additions or updates. An unrefreshed table returns no results at runtime, causing ALL customers to pass (or fail) the rule regardless of their data.
Draft Expression Sets are invisible to the Product Discovery runtime. Always check that each Expression Set shows Status = Active before testing in Browse Catalogs.
- Context definition extended with 4 input fields and activated
- 3 CML Expression Sets created, all in Active status
- All Decision Tables have been refreshed after data entry
- Qualification Procedure Plan assigned in Product Discovery Settings
- Browse Catalogs test: customer age 20 โ Comuniqa Go! Youth hidden โ
- Browse Catalogs test: outstandingAmount 500 โ mobile plan products blocked โ
- Browse Catalogs test: credit score 700 โ plans visible โ
Final Lab Validation Checklist
Before calling this lab complete, work through every item below. This simulates the pre-go-live validation a solution architect would perform on a real Comuniqa implementation.