🔬 Lesson 02b — Hands-On Lab 🇦🇷 Comuniqa 💰 Pricing Engine

Pricing Engine
Hands-On Lab

Build Comuniqa's complete pricing engine from scratch — price books, pricing recipe, context definitions, pricing procedures, discount logic, bundle zeroing, proration, and price waterfall. Each task shows the expected outcome; click Hint for step-by-step guidance.

📋 Business Context

Business Requirements & Pricing Model

Before touching the platform, understand what Comuniqa needs to achieve commercially and why these pricing rules exist. Every task in this lab maps directly to one or more of the requirements below.

The Comuniqa Pricing Challenge

Comuniqa is an Argentine B2C telco launching its new digital sales platform on Salesforce Revenue Cloud Advanced. Their pricing model has four layers of complexity that must all work together on a single quote:

💰

Base Tariff Structure

  • Comuniqa Go! plan: ARS 69,000/month
  • Comuniqa Go! Two (second SIM): ARS 1,650/month
  • MoviMundo Plus+: ARS 13,900/month
  • MoviMundo Basic+: ARS 7,900/month
  • YouTube Mundo add-on: ARS 4,000/month
  • Vida Digital Pass C&C: ARS 9,900/month
  • SIM Card & Phone Number: ARS 0 (included)
🎟

Discount Schemes

  • Contract Discount: −25% for 12 or 24-month term commitment
  • Tarifa Social: −50% for ANSES-verified welfare recipients
  • Tarifa Social takes precedence — cannot stack with contract discount
  • Bundle zeroing: child products = ARS 0 when inside bundle
  • Retention reps can apply manual discounts (capped)
📦

Bundle Pricing Rules

  • Vida Digital bundle root priced at ARS 69,000
  • Comuniqa Go! child = ARS 0 (zeroed via bundle adjustment)
  • MoviMundo add-ons = ARS 0 inside bundle
  • YouTube Mundo = ARS 0 inside bundle, ARS 4,000 standalone
  • Vida Digital Pass keeps its own price (ARS 9,900)
📅

Mid-Cycle & Compliance

  • Amendments mid-billing-cycle must prorate new lines
  • Annual CPI uplift at renewal (INDEC index + 3%, capped 12%)
  • ENACOM requires full audit trail of every pricing step
  • Price Waterfall must be persisted for regulatory review
  • All prices displayed in ARS rounded to whole pesos

Formal Business Requirements

BR-P01
All Comuniqa B2C products must be priced in ARS from a single Price Book named "B2C Standard ARS". Pricing
BR-P02
The system must automatically apply a 25% discount when a customer selects a 12-month or 24-month contract term. The Contract Term attribute must be price-impacting. Discount
BR-P03
ANSES-verified welfare customers must receive a 50% Tarifa Social discount. This discount must suppress the contract discount — they cannot stack. Discount
BR-P04
Child products inside the Comuniqa Vida Digital bundle must be priced at ARS 0. The bundle root retains its full list price. Pricing
BR-P05
When a new product line is added mid-billing-cycle via amendment, the charge for the partial period must be automatically prorated. Amendment
BR-P06
Sales agents must be able to see a complete step-by-step breakdown of how each price was calculated (Price Waterfall). This must be stored for at least 6 months for ENACOM regulatory compliance. Compliance
BR-P07
At renewal, termed subscriptions must be automatically uplifted by INDEC CPI + 3%, capped at a maximum of 12%. Pricing
BR-P08
All final prices must be rounded to whole ARS (zero decimal places) before being shown on quotes and orders. Format

What You Will Build in This Lab

ℹ Lab Scope This lab implements BR-P01 through BR-P06 and BR-P08. BR-P07 (CPI Uplift) is covered as a configuration walkthrough in Task 6 but requires asset records to test end-to-end. Estimated time: 3–4 hours for a first build.
TaskWhat You BuildBusiness Requirement
Task 1Price Book "B2C Standard ARS" + Pricing RecipeBR-P01
Task 2Context Definition extensions (WelfareEligible, ContractTerm)BR-P02, BR-P03
Task 3Base Pricing Procedure with List Price elementBR-P01
Task 4Contract Discount + Tarifa Social with Stop Pricing precedenceBR-P02, BR-P03
Task 5Bundle-Based Price elements for Vida Digital child zeroingBR-P04
Task 6Proration + Subscription elements for mid-cycle amendmentsBR-P05
Task 7Price Waterfall, Persistence, Rounding, and Procedure AssignmentBR-P06, BR-P08
Pre-Lab

Pre-Lab Setup

Confirm your org and prior work are ready before starting. Check off each item.

Lesson 1 lab is complete — All Comuniqa products exist in PCM: Comuniqa Go!, bundle structure, SIM, Phone Number, MoviMundo add-ons, and Vida Digital Pass.
Salesforce Pricing is enabled — Setup → Salesforce Pricing → toggle "Enable Salesforce Pricing" is ON.
Contract Term attribute is Price Impacting — Navigate to the Comuniqa Go! product → Attributes tab → Contract Term → confirm "Is Price Impacting" = true.
Account.WelfareEligible custom field exists — Setup → Object Manager → Account → Fields → confirm a checkbox field named WelfareEligible__c is present.
You have reviewed Lesson 2 Theory — You understand Pricing Procedures, Pricing Recipes, the Price Waterfall, and the role of Decision Tables.
⚠ Decision Table Refresh is Manual Throughout this lab, whenever you create or update data records that feed a Decision Table (Price Adjustment Tiers, Attribute Based Adjustments, Bundle Based Adjustments), you must manually refresh the Decision Table. This is the most common cause of pricing not working as expected.
T1 Foundation
01
Task 1 — Foundation
Price Book, Price Book Entries & Pricing Recipe
To Do
Objective Create the "B2C Standard ARS" Price Book, add all Comuniqa products as Price Book Entries with the correct selling models and list prices, and configure the Pricing Recipe so the engine can reference Decision Tables.

Price Book Entry Reference

ProductList Price (ARS/mo)Selling ModelCurrency
Comuniqa Go!69,000Term-Defined (12M & 24M) + EvergreenARS
Comuniqa Go! Two1,650EvergreenARS
SIM Card0One TimeARS
Phone Number0EvergreenARS
MoviMundo Plus+13,900EvergreenARS
MoviMundo Basic+7,900EvergreenARS
YouTube Mundo4,000EvergreenARS
Vida Digital Pass C&C9,900EvergreenARS
Comuniqa Go! (bundle root)69,000Term-Defined (12M & 24M)ARS
⚠ Critical — Selling Model Cannot Change After Creation Once a Price Book Entry is saved, its Product Selling Model is locked. If you select the wrong selling model, you must raise a support request to change it. Always validate the selling model in sandbox before creating production records.
✓ Expected Outcome
  • Price Book "B2C Standard ARS" exists, Status = Active, Currency = ARS
  • 9 Price Book Entries created with correct list prices and selling models
  • Pricing Recipe "CQ_Pricing_Recipe" cloned from NGPDefaultRecipe, Status = Active
  • Recipe is set as the active recipe in Salesforce Pricing Setup
1
Navigate to Price Management → Price Books → New (via App Launcher). Name = B2C Standard ARS, Currency = ARS, Status = Active. Save.
2
Open the Price Book. Click the Price Book Entries tab → New. Search for and select Comuniqa Go!. Set List Price = 69000, Selling Model = Term-Defined 12 Months. Save. Repeat for the 24M and Evergreen selling models for the same product.
3
Add all remaining products from the table above, one by one. For SIM Card: List Price = 0, Selling Model = One Time. Price = 0 is intentional — do not leave it blank.
4
Navigate to Setup → Quick Find → Pricing Recipes → New. Name = CQ_Pricing_Recipe. Save.
5
Open CQ_Pricing_Recipe. Go to the Price Adjustment Matrix tab → click Modify. Select all predefined standard decision tables (Price Book Entries, Attribute Discount Entries, Bundle Based Adjustment Entries, Volume Discount Entries). Save. These are the standard DT slots the pricing engine will use.
6
Navigate to Setup → Salesforce Pricing Setup → Select a Pricing Recipe section. Select CQ_Pricing_Recipe as the active recipe. Save.
7
Sync Pricing Data: Still in Salesforce Pricing Setup, find the Sync Pricing Data section → click Sync. This ensures the latest pricing data is available in all decision tables mapped to the recipe. Run this whenever product prices or adjustments are updated.
⚠ Common Error: Price Book not set to Active

A Price Book in Draft status is not visible to the Pricing engine or to Browse Catalogs. Always confirm Status = Active before proceeding.

✅ Checkpoint 1
  • Price Book "B2C Standard ARS" is Active in ARS currency
  • All 9 products have Price Book Entries with correct prices and selling models
  • CQ_Pricing_Recipe is cloned, active, and selected in Salesforce Pricing Setup
T2 Context
02
Task 2 — Context
Extend the Context Definition for Pricing Inputs
To Do
Objective Extend the SalesTransactionContext to surface the fields the Pricing Procedure needs as inputs: the customer's welfare eligibility flag and their selected contract term. Without these context mappings, the discount elements will have no data to evaluate.

Required Context Mappings

Context Tag NameSource ObjectSource FieldUsed By
WelfareEligibleAccountWelfareEligible__cTarifa Social (Task 4)
ContractTermQuote Line ItemSBQQ__ProductOption__r.ContractTerm__cContract Discount (Task 4)
BundleRootIdQuote Line ItemBundle Root Product IdBundle zeroing (Task 5)
EffectiveToQuote Line ItemEffectiveTo__cProration (Task 6)
⚠ Context Tag Name Cannot Match Decision Table Name If you name a context tag TarifaSocialDT and a Decision Table also has that label or API name, the Pricing engine will throw an activation error. Use distinct names — prefix context tags with the data they carry, not the DT they feed.
✓ Expected Outcome
  • SalesTransactionContext extended with 4 new input node mappings
  • All mappings point to correct source objects and fields
  • Context Definition is in Active status
  • No naming conflicts with Decision Table labels
1
Navigate to Setup → Context Definitions. Open SalesTransactionContext. Click Edit.
2
Scroll to the Account node. Click Add Mapping. Tag Name = WelfareEligible, Field = WelfareEligible__c, Data Type = Boolean. Save the mapping.
3
Scroll to the Line Item node. Add Tag Name = ContractTerm, Field = the attribute value field for Contract Term on the quote line. Data Type = Text. Save.
4
Add Tag Name = BundleRootId, Field = the bundle root product reference on the line item. Data Type = Text. Save.
5
Add Tag Name = EffectiveTo, Field = EffectiveTo__c on the line item. Data Type = Date. Save.
6
Click Activate on the Context Definition. Confirm Status = Active. If activation fails, check for naming conflicts with existing Decision Table API names.
✅ Checkpoint 2
  • SalesTransactionContext has 4 new mappings: WelfareEligible, ContractTerm, BundleRootId, EffectiveTo
  • Context Definition Status = Active
  • No activation errors (no naming conflicts)
T3 Procedure
03
Task 3 — Base Procedure
Build the Base Pricing Procedure with List Price
To Do
Objective Clone the Revenue Management Default Pricing Procedure template and configure the first two required elements: Pricing Setting and List Price. This gives you a runnable procedure that fetches the correct ARS list price for any Comuniqa product before any discounts are applied.

Procedure Element Order — Mandatory First Steps

PositionElement TypeConfigurationPurpose
1Required First Pricing SettingMap: LineItem, NetUnitPrice, Subtotal, PriceWaterfall context tagsInitialises all shared variables for the procedure run
2Core List PricePrice Book = B2C Standard ARS · Decision Table = Price Book EntriesFetches ARS list price for the product being priced
ℹ Three Procedure Assignments Required After building the procedure, it must be assigned in three places: (1) Product Discovery Settings for Browse Catalogs display prices; (2) Salesforce Pricing Setup for headless API calls; (3) Revenue Settings for quote and order pricing. Assigning to only one location is the most common post-build mistake.
✓ Expected Outcome
  • Pricing Procedure "CQ_Mobile_Pricing" cloned from template, Status = Active
  • Element 1: Pricing Setting — all four standard variables mapped
  • Element 2: List Price — reading from Price Book Entries DT, B2C Standard ARS
  • Procedure assigned in Revenue Settings (quotes/orders)
  • Simulation test: Comuniqa Go! returns ARS 69,000 list price
1
From App Launcher, find and select Expression Set Templates. Change the list view to All Expression Set Templates. Find and select Revenue Management Default Pricing Procedure.
2
Click Save As. In the dialog: Name = CQ_Mobile_Pricing, Usage Type = Pricing, Context Definition = SalesTransactionContext. Save. The newly cloned procedure now appears in the Pricing Procedures list.
3
From App Launcher, open Pricing Procedures. Find CQ_Mobile_Pricing. On the Details tab, click the procedure version to open the Pricing Procedure Builder.
4
Click Add Element → Pricing Setting. The standard variables (NetUnitPrice, Subtotal) are auto-mapped by default. Map: LineItem → Line Item input, price_water_fall → Price Waterfall output. Save element.
5
Click Add Element → List Price. Under Lookup Table Details set Decision Table = Price Book Entries. Map input rule variables: Product → Product, Price Book → PriceBooks, Product Selling Model → ProductSellingModel. Map input: Quantity → LineItemQuantity. Map output: List Price → ListPrice. Save element.
6
Select Include in Output on the List Price element. Set rank = 1. Click Activate. Confirm Status = Active.
7
Navigate to Setup → Revenue Settings. In the Set Up Salesforce Pricing section, select CQ_Mobile_Pricing. Save. Repeat for Setup → Product Discovery Settings → Select a Pricing Procedure section. Repeat for Setup → Salesforce Pricing Setup → Select a Pricing Procedure section (headless).
8
Use the Simulate button in the Procedure Builder. In Simplified mode enter: Product = Comuniqa Go!, Price Book = B2C Standard ARS. Run simulation. Confirm output shows ListPrice = 69000 ARS.
⚠ Common Error: Procedure assigned in wrong context

Browse Catalogs uses Product Discovery Settings. Quotes and Orders use Revenue Settings. If you only assign to one, prices will appear correct in one place but wrong or missing in the other. All three assignment points must be configured.

✅ Checkpoint 3
  • CQ_Mobile_Pricing procedure is Active with 2 elements: Pricing Setting + List Price
  • Simulation returns ARS 69,000 for Comuniqa Go!
  • Procedure assigned in both Revenue Settings and Product Discovery Settings
T4 Discounts
04
Task 4 — Discount Logic
Contract Discount, Tarifa Social & Stop Pricing Precedence
To Do
Objective Add the two Comuniqa discount schemes — the 25% contract discount (BR-P02) and the 50% Tarifa Social welfare discount (BR-P03) — and configure the List Group + Stop Pricing logic that ensures they never stack.

Discount Data Records to Create First

Record TypeNameInputAdjustment TypeValue
Attribute Based AdjustmentCQ_Contract_12MContract Term = "12 Months"Percentage25%
Attribute Based AdjustmentCQ_Contract_24MContract Term = "24 Months"Percentage25%
Custom Decision TableCQ_TarifaSocial_DTWelfareEligible = TRUEPercentage50%

Procedure Element Order — Discount Block

PositionElementConfiguration
3Advanced List Group (Tarifa Social)Filter: WelfareEligible = TRUE
3aAdvanced Price Adjustment MatrixDT = CQ_TarifaSocial_DT → 50% off
3bCore Stop PricingStops execution for this line — prevents contract discount running
4Core Attribute-Based PriceDT = Attribute Discount Entries → Contract Term → 25% off
5Core Manual DiscountAllows rep override (retention use case)
⚠ Add CQ_TarifaSocial_DT to the Pricing Recipe Before Use Custom Decision Tables must be registered in the active Pricing Recipe before they can be used in a procedure element. Open CQ_Pricing_Recipe → Price Adjustment Matrix tab → Add CQ_TarifaSocial_DT. If you skip this step, the element will fail silently at runtime — no error, just no discount applied.
✓ Expected Outcome
  • Attribute Based Adjustment records created for 12M and 24M contract terms
  • Attribute Discount Entries DT refreshed after record creation
  • CQ_TarifaSocial_DT created, added to CQ_Pricing_Recipe, refreshed
  • Procedure now has 5 elements in correct order with List Group + Stop Pricing
  • Simulation: Contract Term = 12M → ARS 51,750 (69,000 − 25%)
  • Simulation: WelfareEligible = TRUE → ARS 34,500 (69,000 − 50%), contract discount NOT applied
1
From App Launcher, open Price Management → Price Adjustment Schedules → All Price Adjustment Schedules. Find and open Standard Attribute Based Adjustment. If it is Active, deactivate it first before adding records — the platform requires this.
2
From the Standard Attribute Based Adjustment record, click Attribute Based Adjustment → New. Specify: Product = Comuniqa Go!, Product Selling Model = Term-Defined 12 Months, Adjustment Type = Percentage, Adjustment Value = 25, Effective From = today. Click Next. Set condition: Attribute = Contract Term, Operator = Equals, Value = 12 Months. Save.
3
Repeat Step 2 for the 24-month discount: Product Selling Model = Term-Defined 24 Months, Adjustment Value = 25, Attribute Value = 24 Months. Save.
4
Return to the Standard Attribute Based Adjustment schedule record. Click Active to reactivate it. Save.
5
Navigate to Setup → Decision Tables → Attribute Discount Entries → Refresh. Confirm the new records appear in the preview. This step is mandatory.
6
Create the Tarifa Social Decision Table. Navigate to App Launcher → Lookup Tables → New Decision Table. Name = CQ_TarifaSocial_DT, Application Usage = Pricing, Type = Standard. Add input: WelfareEligible (Boolean). Add outputs: AdjustmentType (Text), AdjustmentValue (Number). Add one data row: TRUE → Percentage → 50. Activate the DT.
7
Open CQ_Pricing_Recipe. Go to Price Adjustment Matrix tab → Modify. Select CQ_TarifaSocial_DT. Map output variables: AdjustmentValue → TierValue, AdjustmentType → AdjustmentType. Save the recipe.
8
Open CQ_Mobile_Pricing procedure. Deactivate to edit. After the List Price element, add a List Group element. Set filter condition: WelfareEligible = TRUE.
9
Inside the List Group, add a Price Adjustment Matrix element. Select DT = CQ_TarifaSocial_DT. Map input WelfareEligible from context. Map outputs to AdjustmentType and AdjustmentValue.
10
Still inside the List Group, add a Stop Pricing element after Price Adjustment Matrix. This prevents the contract discount from also running for welfare-eligible lines.
11
After the List Group (outside it), add an Attribute-Based Price element. Decision Table = Attribute Discount Entries. Map the ContractTerm context tag as input. Activate the procedure.
12
Run simulations: (a) ContractTerm = 12 Months, WelfareEligible = false → expect ARS 51,750. (b) WelfareEligible = true → expect ARS 34,500 with no contract step in the waterfall.
⚠ Common Error: Both discounts applying to welfare customers

If Stop Pricing is missing from inside the List Group, or the List Group filter condition is wrong, welfare-eligible customers will receive both the 50% Tarifa Social AND the 25% contract discount (75% total). Always run the simulation with WelfareEligible = TRUE and confirm only one discount step appears in the waterfall.

✅ Checkpoint 4
  • Attribute Based Adjustment records exist for 12M and 24M
  • Attribute Discount Entries DT refreshed
  • CQ_TarifaSocial_DT registered in CQ_Pricing_Recipe and refreshed
  • Procedure has List Group (WelfareEligible filter) → PAM → Stop Pricing, then Attribute-Based Price outside the group
  • Simulation: 12M contract → ARS 51,750 ✓ · Welfare → ARS 34,500, no stacking ✓
T5 Bundle
05
Task 5 — Bundle Pricing
Bundle-Based Price Elements & Child Product Zeroing
To Do
Objective Configure Bundle-Based Adjustment records so that child products inside the Comuniqa Vida Digital bundle are priced at ARS 0, while retaining their standalone list prices when sold outside the bundle (BR-P04).

Bundle-Based Adjustment Records to Create

Root BundleRoot Bundle Selling ModelParent ProductParent PSMProductProduct PSMAdj. TypeValueSchedule
Comuniqa Go! (Vida Digital)Term-Defined 12MComuniqa Go! (Vida Digital)Term-Defined 12MComuniqa Go!Term-Defined 12MOverride0Standard Bundle Based Adjustment
Comuniqa Go! (Vida Digital)Term-Defined 12MComuniqa Go! (Vida Digital)Term-Defined 12MComuniqa Go! TwoEvergreenOverride0Standard Bundle Based Adjustment
Comuniqa Go! (Vida Digital)Term-Defined 12MComuniqa Go! (Vida Digital)Term-Defined 12MMoviMundo Plus+EvergreenOverride0Standard Bundle Based Adjustment
Comuniqa Go! (Vida Digital)Term-Defined 12MComuniqa Go! (Vida Digital)Term-Defined 12MMoviMundo Basic+EvergreenOverride0Standard Bundle Based Adjustment
Comuniqa Go! (Vida Digital)Term-Defined 12MComuniqa Go! (Vida Digital)Term-Defined 12MYouTube MundoEvergreenOverride0Standard Bundle Based Adjustment

PSM = Product Selling Model. Repeat each record for the 24M selling model variant of the bundle root if applicable to your org's price book setup.

ℹ Vida Digital Pass keeps its own price Vida Digital Pass Convenience Store & Café retains its ARS 9,900 price even inside the bundle. Do NOT create a Bundle-Based Adjustment record for it. Only the products listed above are zeroed.
✓ Expected Outcome
  • 5 Bundle-Based Adjustment records created with Override = 0
  • Bundle Based Adjustment Entries DT refreshed after all records created
  • Bundle-Based Price element added to CQ_Mobile_Pricing procedure
  • Simulation: Comuniqa Go! inside Vida Digital bundle → ARS 0
  • Simulation: Comuniqa Go! standalone → ARS 69,000 (unchanged)
1
From App Launcher → Price Management → Price Adjustment Schedules → All Price Adjustment Schedules. Find and open Standard Bundle Based Adjustment. If it is Active, deactivate it first before adding records.
2
Click Bundle Based Adjustment → New. For the first record, specify all required fields: Root Bundle = Comuniqa Go! (Comuniqa Vida Digital), Root Bundle Selling Model = Term-Defined 12 Months, Parent Product = Comuniqa Go! (Comuniqa Vida Digital), Parent Product Selling Model = Term-Defined 12 Months, Product = Comuniqa Go!, Product Selling Model = Term-Defined 12 Months, Adjustment Type = Override, Adjustment Value = 0, Price Adjustment Schedule = Standard Bundle Based Adjustment. Set effective date. Save.
3
Repeat Step 2 for the remaining 4 products in the table (Comuniqa Go! Two, MoviMundo Plus+, MoviMundo Basic+, YouTube Mundo). Use the correct Product Selling Model for each product (Evergreen for all except Comuniqa Go!). Verify that Root Bundle and Parent Product fields match the exact bundle product name from PCM.
4
Return to the Standard Bundle Based Adjustment schedule record. Click Active to reactivate it. Save.
5
Navigate to Setup → Decision Tables → Bundle Based Adjustment Entries → Refresh. Confirm all 5 records appear in the preview. This refresh is mandatory.
6
Open CQ_Mobile_Pricing. Deactivate to edit. After the List Price element, add a Bundle-Based Price element. Set Decision Table = Bundle Based Adjustment Entries. Map the required input rule variables from the DT: Price Adjustment Schedule, Product Selling Model, Effective From/To, Product, Parent Product, Parent Product Selling Model, Root Bundle, Root Bundle Selling Model. Map BundleRootId context tag to Root Bundle. Save and reactivate.
7
Test: Create a quote, add the Vida Digital bundle. Open quote lines and verify: bundle root = ARS 69,000 · Comuniqa Go! child line = ARS 0 · MoviMundo add-on = ARS 0 · Vida Digital Pass = ARS 9,900.
⚠ Common Error: Decision Table not refreshed after creating adjustment records

Bundle Based Adjustment records exist in the database, but the Pricing Procedure reads from the cached DT snapshot. If you don't refresh the DT, child products will continue showing their full list price inside the bundle. Always refresh immediately after creating or editing Bundle-Based Adjustment records.

✅ Checkpoint 5
  • 5 Bundle-Based Adjustment records created (Override = 0)
  • Bundle Based Adjustment Entries DT refreshed
  • Bundle-Based Price element in CQ_Mobile_Pricing procedure
  • Bundle root = ARS 69,000 · child products = ARS 0 · Vida Digital Pass = ARS 9,900
T6 Proration
06
Task 6 — Mid-Cycle Amendments
Proration & Subscription Elements
To Do
Objective Configure the Proration Settings in Salesforce Pricing Setup and add the Proration + Subscription element pair to the procedure so that new lines added mid-billing-cycle via amendment are correctly charged for only the remaining days of the period (BR-P05).

Proration Calculation — Comuniqa Go! Two Example

Scenario: Comuniqa Go! Two (ARS 1,650/mo) added on April 20th. Billing period = April 1–30 (30 days).
Remaining days = April 30 − April 20 + 1 = 11 days
Proration multiplier = 11 / 30 = 0.3667
Prorated charge = ARS 1,650 × 0.3667 = ARS 605.05
Rounded to whole pesos = ARS 605
⚠ Proration Settings Must Be Configured Before the Element Works The Proration element in the procedure reads its configuration from Proration Settings in Salesforce Pricing Setup. If you add the element but don't configure Proration Settings, mid-cycle amendments will charge the full monthly amount. Proration Settings define the billing period anchor and the cycle length for Evergreen and One Time products.
✓ Expected Outcome
  • Proration Settings configured in Salesforce Pricing Setup (Evergreen = Monthly, anchor = billing start date)
  • Proration element added to procedure (position: after Bundle-Based Price, before discounts)
  • Subscription element added immediately after Proration element
  • Amendment test: Comuniqa Go! Two added April 20 → ARS 605 charge for April
  • Price Waterfall shows both the Proration step (multiplier = 0.3667) and Subscription step
1
Navigate to Setup → Salesforce Pricing Setup → Proration Settings. Set: Evergreen Term Value = Monthly, One Time Term Value = One Time. Billing Period Anchor = the billing start date field on your order. Save.
2
Open CQ_Mobile_Pricing. Deactivate to edit. After the Bundle-Based Price element, add a Proration element. Configure: Term = Evergreen, use EffectiveTo context tag for the end-of-period date. Save.
3
Immediately after the Proration element, add a Subscription element. This element reads the Proration Multiplier output from the Proration element and calculates: NetUnitPrice × ProrateMultiplier × Quantity. Save.
4
Reactivate the procedure. Create a test amendment: on an existing Comuniqa Go! subscription, add Comuniqa Go! Two with a start date mid-month. Confirm the quote line shows the prorated amount, not the full ARS 1,650.
5
Bonus — CPI Uplift (walkthrough only): Navigate to Revenue Cloud → Price Revision Policies → New. Name = AR_CPI_Policy, Type = Price Index, Formula = MIN(12, PriceIndex + 3). Create an Index Rate record for the current INDEC CPI value. To fully test, an asset record reaching renewal date is required.
✅ Checkpoint 6
  • Proration Settings configured in Salesforce Pricing Setup
  • Proration + Subscription elements in procedure in correct order
  • Amendment test: mid-cycle addition shows prorated charge, not full monthly price
  • Price Waterfall shows Proration Multiplier step
T7 Waterfall
07
Task 7 — Compliance & Rounding
Price Waterfall, Persistence, Rounding & Final Assignment
To Do
Objective Enable Price Waterfall and Waterfall Persistence for ENACOM regulatory compliance (BR-P06), add the Rounding Values element to deliver clean whole-peso prices (BR-P08), and verify the complete procedure is correctly assigned across all three contexts.
🔴 ENACOM Compliance — Waterfall Persistence Cannot Be Retroactive Price Waterfall Persistence must be enabled BEFORE the first quote is created. Enabling it after go-live will not produce waterfall logs for quotes already created. Treat this as a day-one deployment requirement, not an optional feature to add later.

Final Procedure Element Summary

#ElementPurpose
1Pricing SettingInitialise procedure variables
2List PriceFetch ARS list price from B2C Standard ARS
3Bundle-Based PriceZero child products inside Vida Digital bundle
4ProrationCalculate partial-period multiplier for amendments
5SubscriptionApply proration multiplier to net price
6List Group (WelfareEligible = TRUE)Conditional block for Tarifa Social
6a→ Price Adjustment MatrixApply 50% Tarifa Social discount
6b→ Stop PricingPrevent contract discount from also running
7Attribute-Based PriceApply 25% contract discount (12M / 24M)
8Manual DiscountAllow retention rep override discount
9Rounding ValuesRound to 0 decimal places (whole ARS)
✓ Expected Outcome
  • Price Waterfall enabled and Price Waterfall Persistence enabled in Salesforce Pricing Setup
  • Rounding Values element added as last element (Round Half Up, 0 decimal places)
  • Procedure assigned in all 3 contexts: Revenue Settings, Product Discovery Settings, Salesforce Pricing Setup (headless)
  • Full quote test passes: waterfall visible on each quote line showing all applied steps
  • All ARS prices display as whole pesos with no decimal places
1
Navigate to Setup → Salesforce Pricing Setup. Find Price Waterfall toggle → set to Enabled. Find Price Waterfall Persistence toggle → set to Enabled. Save. Do this before creating any test quotes.
2
Open CQ_Mobile_Pricing. Deactivate to edit. Add a Rounding Values element as the last element. Configure: Decimal Places = 0, Rounding Rule = Half Up, Field to Round = NetUnitPrice. Save.
3
Confirm the full element order matches the table above. Reactivate the procedure.
4
Navigate to Setup → Salesforce Pricing Setup → Pricing Procedure. Assign CQ_Mobile_Pricing here (headless API context). This is the third assignment point.
5
Create a full test quote: Account with WelfareEligible = FALSE, add Comuniqa Go! with Contract Term = 12 Months. Submit the quote. Open the quote line → click View Waterfall. Confirm you see: List Price (69,000) → Attribute-Based Price (−17,250) → Net Unit Price (51,750).
6
Create a second test quote: Account with WelfareEligible = TRUE. Submit. View Waterfall on quote line. Confirm you see: List Price (69,000) → Tarifa Social (−34,500) → Stop Pricing → Net Unit Price (34,500). The Contract Discount step should NOT appear.
⚠ Common Error: Waterfall not visible on quote lines

If the Price Waterfall toggle was not enabled in Setup before the quote was created, waterfall data is not generated for that quote. Enable the toggle, then create a fresh test quote. Existing quotes will not have waterfall data retroactively populated.

✅ Checkpoint 7 — All Systems Go
  • Price Waterfall + Persistence enabled in Salesforce Pricing Setup
  • Rounding Values element: 0 decimal places, Half Up, last in procedure
  • CQ_Mobile_Pricing assigned in all 3 contexts (Revenue Settings, Discovery Settings, Pricing Setup)
  • Contract discount quote: waterfall shows List Price → −25% → ARS 51,750
  • Welfare quote: waterfall shows List Price → −50% → Stop Pricing → ARS 34,500 (no stacking)
  • Bundle quote: child products = ARS 0, Vida Digital Pass = ARS 9,900
  • All prices display as whole pesos
Final

Final Lab Validation Checklist

Work through every item below before calling this lab complete. This mirrors the pre-go-live pricing validation a solution architect would perform on a real Comuniqa implementation.

Price Book — "B2C Standard ARS" is Active, all 9 products have entries with correct ARS list prices and selling models
Pricing Recipe — CQ_Pricing_Recipe is Active, set as the org's active recipe, all custom DTs registered (CQ_TarifaSocial_DT)
Context Definition — SalesTransactionContext extended with WelfareEligible, ContractTerm, BundleRootId, EffectiveTo. Status = Active.
Procedure structure — CQ_Mobile_Pricing has all 9 elements in the correct order. Status = Active.
Decision Table refreshes — Attribute Discount Entries, Bundle Based Adjustment Entries, CQ_TarifaSocial_DT all refreshed after data creation
Procedure assignments — CQ_Mobile_Pricing assigned in all 3 contexts: Revenue Settings, Product Discovery Settings, Salesforce Pricing Setup
Test: Standalone plan, no discount — Comuniqa Go!, no contract, no welfare → ARS 69,000
Test: Contract discount — Comuniqa Go!, 12-month contract → ARS 51,750 (−25%)
Test: Tarifa Social — no stacking — WelfareEligible = TRUE → ARS 34,500 (−50%), contract discount step absent from waterfall
Test: Bundle child zeroing — Comuniqa Go! inside Vida Digital bundle → ARS 0. Standalone Comuniqa Go! → ARS 69,000 unchanged
Test: Proration — Comuniqa Go! Two added mid-month → partial charge (not full ARS 1,650). Waterfall shows proration multiplier step.
Test: Waterfall persistence — Quote line shows "View Waterfall" link. Waterfall log is stored and retrievable. All prices display as whole ARS pesos.
✅ Lab Complete If all 12 items are checked, you have successfully built Comuniqa's complete pricing engine in Salesforce Revenue Cloud Advanced — covering list pricing, two discount schemes with precedence enforcement, bundle zeroing, proration, and regulatory audit trail. You are now ready for Lesson 3 — Rate Management.