📘 Lesson 02 — Core Platform Mechanics 🇦🇷 Comuniqa Case Study ⚡ Pricing Engine

Pricing in Agentforce
Revenue Management

A structured, architect-level deep-dive into the Salesforce Pricing engine — grounded in Comuniqa's actual product and pricing requirements. Covers how pricing works, Pricing Recipes, all Pricing Elements, limitations, implementation challenges, and architectural decision guidance.

01 Foundation

Foundational Definitions

Before you can design with the Salesforce Pricing engine, you need a firm mental model of its core vocabulary. These are not just objects — they are design concepts that shape every downstream decision.

📦

Price Book

A named catalogue of products and their list prices for a given market segment, channel, or currency. Comuniqa uses a "B2C Standard ARS" price book. Multiple price books can exist per org — one product can appear at different prices in different books.

📘

Cost Book

Tracks the internal COGS of a product. Optional but enables margin analysis and cost-aware pricing logic. Useful for Comuniqa to track cost-to-serve for MoviMundo partner content.

🧾

Pricing Recipe

A grouping of Decision Tables that serve as the data source for the Pricing engine. Every org has one active Pricing Recipe. When Salesforce Pricing is activated, your org is automatically set up with a predefined recipe (NGPDefaultRecipe). You clone and customise it rather than creating from scratch. Required before building any Pricing Procedure.

⚙️

Pricing Procedure

A declarative, ordered stack of pricing elements that executes sequentially to calculate the final net price. Built on the Expression Set framework. Three distinct uses: Product Discovery pricing, headless API pricing, and quote/order pricing — each requires its own procedure assignment.

🏷️

Price Adjustment Schedule

Rules that modify the list price based on quantity tiers, product attributes, or bundle membership. Three types: Price Adjustment Tiers (volume), Attribute-Based Adjustments, Bundle-Based Adjustments.

🔽

Price Waterfall

The step-by-step audit log of every pricing calculation — from list price to final net price. Must be explicitly enabled in Setup. Supports persistence (stored logs) and Decision Explainer for custom step-level messages.

🧮

Decision Table (BRE)

A lookup table with multiple inputs and outputs. The Business Rules Engine equivalent. Drives attribute-based, volume, bundle, contract, and derived pricing lookups. CSV-based decision tables are NOT supported in Salesforce Pricing.

🌐

Context Framework

The runtime data layer. The SalesTransactionContext is the default context for quotes and orders. Can be extended for custom fields. A context tag cannot share the same name as a decision table label or API name.

🔄

Product Selling Model

Defines HOW a product is sold: One Time, Term-Defined, or Evergreen. Required on every Price Book Entry. Cannot be changed after a Price Book Entry is created — a critical design constraint.

🔬

Discovery Procedure

A separate procedure type (Usage Type: Pricing Discovery) that gathers contributing pricing factors for derived pricing scenarios. Runs before the main Pricing Procedure. Used for derived pricing and asset-based pricing calculations.

ℹ Three Pricing Procedure Contexts — A Critical Setup Distinction Salesforce Pricing requires three separate procedure assignments: (1) Product Discovery Settings → used to show list prices in Browse Catalogs; (2) Salesforce Pricing Setup → used for headless API calls; (3) Revenue Settings → used to calculate prices on quotes and orders. Using the wrong procedure in the wrong context is one of the most common setup mistakes.
🇦🇷 Comuniqa Vocabulary Mapping Price Book: "B2C Standard ARS" · Pricing Recipe: "NGPDefaultRecipe" (cloned and customized) · Decision Tables: "Tarifa Social Discount DT", "Contract Discount DT", "Bundle Adjustment DT" · Context: SalesTransactionContext extended with Account.WelfareEligible, Quote.ContractTerm · Pricing Procedure: "Comuniqa Mobile Pricing" (cloned from Revenue Management Default)
02 Functional Deep Dive

Detailed Functional Explanation

How the Pricing Engine Works — Setup to Execution

Salesforce Pricing is not a simple price list lookup. It is a declarative, procedural pricing engine built on the Expression Set framework. Before any quote can be priced, a deliberate setup sequence must be completed: enable Salesforce Pricing → configure a Pricing Recipe → clone a Pricing Procedure template → configure Context Definitions → assign the procedure in the correct location (Discovery, headless, or Revenue Settings).

"Pricing procedures are fundamental to all pricing strategies in Revenue Cloud, enabling businesses to implement dynamic pricing rules and efficiently calculate a product's final net price. They act as the core engine for pricing calculations in Salesforce Pricing, providing a flexible and powerful way to manage both simple and complex pricing scenarios." — Salesforce Pricing Documentation

Pricing Recipe — The Often-Overlooked Foundation

The Pricing Recipe is a prerequisite that most architects overlook until something breaks. Every org can only have one active Pricing Recipe. It groups all Decision Tables that the Pricing engine can reference. When you create a Pricing Procedure, it can only call Decision Tables that are registered in the active recipe. For Comuniqa, all custom discount tables (Tarifa Social, Contract Discount, Bundle Adjustment) must be added to the recipe's Price Adjustment Matrix tab before they can be used in a Pricing Procedure element.

⚠ Pricing Recipe is a Singleton — Design Carefully Only one Pricing Recipe can be active at a time. If you add a Decision Table to the recipe for one product family, it becomes available to all Pricing Procedures in the org. Naming governance for Decision Tables is critical to avoid cross-procedure pollution. For Comuniqa: prefix all custom tables — e.g., "CQ_TarifaSocial_DT", "CQ_ContractDiscount_DT".

The Price Waterfall — Comuniqa Go! Example

The waterfall is the execution trace of the Pricing Procedure. Price Waterfall must be explicitly enabled in Salesforce Pricing Setup. Below is a live trace for Comuniqa Go! with a 12-month contract:

Price Waterfall — Comuniqa Go! + 12-Month Contract Discount (ARS/month)

Real-Life Comuniqa Scenarios

Scenario: Customer subscribes to Comuniqa Go! standalone with a 12-month contract. Physical SIM.

  • Pricing Setting element initializes context: LineItem, NetUnitPrice, Subtotal, Price Waterfall tags are set
  • List Price element → queries Price Book Entries DT → returns ARS 69,000
  • Volume Discount element → no volume discount (qty=1)
  • Attribute-Based Price element → Contract Term = "12 Months" → Adjustment Type = Percentage, Adjustment Value = 25% → −ARS 17,250
  • Manual Discount element → no rep override applied
  • SIM Card, Phone Number: List Price element returns ARS 0. Waterfall confirms intentional zero.
✅ Final: ARS 51,750/month for Comuniqa Go! + ARS 0 SIM + ARS 0 Phone Number

Scenario: Customer subscribes to Comuniqa Go! (Vida Digital) bundle with Vida Digital Pass + YouTube Mundo add-on.

  • Bundle root (Comuniqa Go! Vida Digital): List Price = ARS 69,000. No adjustment at bundle level.
  • Comuniqa Go! child component: Bundle-Based Price element detects bundle membership → Adjustment Type = Override, Adjustment Value = 0 → child price = ARS 0
  • Vida Digital Pass Convenience Store & Café: Own procedure → List Price = ARS 9,900
  • YouTube Mundo add-on: Bundle-Based Price element → if sold within bundle context = ARS 0; standalone = ARS 4,000
✅ Total: ARS 69,000 (bundle) + ARS 9,900 (Vida Digital Pass) + ARS 0 (YouTube in bundle) = ARS 78,900/month

Scenario: Customer qualifies for Tarifa Social (ANSES-verified welfare discount, 50% off) with no contract commitment.

  • ANSES eligibility check ran in Eligibility Rules layer → sets Account.WelfareEligible = TRUE
  • Context Definition reads WelfareEligible flag from Account node
  • Price Adjustment Matrix element → Decision Table lookup: WelfareEligible = TRUE → Adjustment Type = Percentage, Adjustment Value = 50%
  • Tarifa Social takes precedence — a List Group element with Stop Pricing prevents the contract discount element from executing when WelfareEligible = TRUE
  • Price Waterfall shows the Tarifa Social step clearly, providing full regulatory audit trail for ENACOM compliance
✅ Final: ARS 34,500/month — 50% Tarifa Social applied, contract discount suppressed

Scenario: Customer on Comuniqa Go! adds Comuniqa Go! Two on the 20th of April — mid-billing-cycle (30-day month).

  • Amendment triggers re-pricing on the new Comuniqa Go! Two line only
  • Proration element calculates multiplier: (April 30 − April 20 + 1) / 30 days = 11/30 = 0.3667
  • Subscription element calculates: ARS 1,650 × 0.3667 = ARS 605.05 for the partial April period
  • From May onwards, full ARS 1,650/month
  • Architectural note: Proration requires a configured Proration Setting in Salesforce Pricing Setup
✅ April charge: ARS 605.05 (prorated) → May onwards: ARS 1,650/month

Comuniqa Discount Structure — Visual Overview

Active Discount Schemes — Comuniqa B2C
Select Contract Discount (12 or 24 months)
−25% · Attribute-Based Price element
Tarifa Social (government welfare)
−50% · Price Adjustment Matrix element
Comuniqa Family Go! Discount
Variable % by tenure · Formula-Based element
Bundle child pricing (Go! in bundle)
ARS 0 · Bundle-Based Price element
Mid-cycle amendment proration
× multiplier · Proration + Subscription elements
03 Pricing Elements

Pricing Elements — The Building Blocks

Pricing elements are the fundamental components of a Pricing Procedure. Each element represents one step in the price calculation. They execute in order, each reading context data and decision tables to produce an output that feeds the next step.

ElementTypeWhat It DoesComuniqa Use Case
Pricing SettingRequired FirstInitializes the procedure. Maps common variables (LineItem, NetUnitPrice, Subtotal, Price Waterfall). Must be first in every procedure. Note: standard variables (NetUnitPrice, Subtotal) are auto-mapped by default — manual mapping is only needed to override defaults.Present in all Comuniqa pricing procedures. Maps ARS currency, quote line, and waterfall output tags.
Map Line ItemSetupMaps variables at main and sub-line item levels. Must be second, immediately after Pricing Setting. Required when custom fields exist on Quote Line Item, Quote Line Item Detail, Order Product, or Order Product Details — the context definition must also be updated to include those custom tags. Does NOT support parallel execution.Needed if Comuniqa adds custom fields to quote lines (e.g., a loyalty flag). Context definition must be updated alongside.
List PriceCoreFetches the base price from the Price Book Entries decision table. Starting point for all calculations. Use Price Book Entries V2 for derived pricing scenarios.Step 1 in every Comuniqa procedure. Fetches ARS 69,000 for Comuniqa Go! from the B2C Standard ARS price book.
Volume DiscountCoreApplies a single reduced price per unit once a quantity threshold is met (Range method). All units get the same discount once threshold is crossed.Relevant for B2B IoT line extensions if Comuniqa adds enterprise SIM bulk orders.
Tier DiscountCoreApplies different prices to different quantity ranges (Slab method). Each range gets its own discount percentage.Family Go! Data Bundle: could tier discount based on family group size.
Manual DiscountCoreAllows sales reps to apply discretionary discounts (Amount or Percentage). Not tied to a decision table. Used for negotiated deals.Retention team can apply ad-hoc loyalty discounts on Comuniqa Go! renewals, capped by floor price or approval workflow.
Attribute-Based PriceCoreAdjusts price based on price-impacting product attributes. Reads Attribute Discount Entries DT. Attribute must be marked "Is Price Impacting" on the product record.Contract Term attribute on Comuniqa Go! drives the 25% discount. SIM Format (eSIM vs Physical) could drive a setup fee difference.
Bundle-Based PriceCoreApplies adjustments when a product is sold as part of a bundle. Reads Bundle Based Adjustment Entries DT. Requires root bundle, parent, and product all linked.Zeros Comuniqa Go! child price (ARS 69,000 → ARS 0) and MoviMundo add-ons within the Vida Digital bundle.
ProrationAdvancedCalculates a multiplier based on how much of a billing period the customer uses. Used for mid-cycle starts, upgrades, and cancellations. Outputs a Proration Multiplier.Comuniqa Go! Two added mid-month: multiplier = days remaining / days in period. ARS 1,650 × multiplier = partial charge.
SubscriptionAdvancedCalculates total subscription price using the Proration Multiplier × Net Unit Price × Quantity. Must follow the Proration element.Used alongside Proration for all mid-cycle Comuniqa amendments and new termed subscriptions.
Formula-Based PricingAdvancedPerforms mathematical calculations using custom formulas. Up to 5 formulas per element. Supports IF/THEN logic. Does NOT support derived products on quote line items.Family Go! Discount: variable % based on aggregated tenure. IF(familyTenure > 24, price * 0.85, price * 0.90).
Price Adjustment MatrixAdvancedUses custom Decision Tables for complex, context-based pricing logic. Supports Procedure Output Resolution (MIN, MAX, SEQUENCE, STACK).Tarifa Social discount — custom DT with WelfareEligible flag as input. Also used for combined discount precedence resolution.
Discount Distribution ServiceAdvancedDistributes a quote-level (header) discount across individual line items. Equal or proportional distribution. Must be the LAST element. Can only be used ONCE per procedure.If Comuniqa offers a total bill discount (e.g., ARS 10,000 off for retention), this distributes it proportionally across all active lines.
Derived PriceAdvancedCalculates a product's price from another product or asset. Requires a Discovery Procedure to run first. Derived product list price must be set to ARS 0.A "Device Protection Plan" priced at 10% of the handset value — plan price derives from the handset's price.
Contract-Based PricingAdvancedApplies previously negotiated contract prices. Reads Contract Pricing Entries DT. Enables contract-level overrides of standard pricing for key accounts.Large corporate Comuniqa accounts negotiating custom SIM rates.
Price Revision (CPI)AdvancedApplies inflation-based price uplifts at renewal using Price Revision Policies and Index Rate records. Only supported on termed assets.Critical for Comuniqa in Argentina's high-inflation environment. Annual renewal uplifts tied to INDEC CPI data automatically.
Price TrackingAdvancedTracks a product's minimum and maximum recorded price over a configurable period (up to 30 days, default 7). Supports Get, Save, and Save & Get action types.Comuniqa can track the min/max ARS price of Comuniqa Go! over the last 30 days for regulatory transparency reporting.
Price PropagationAdvancedEnables hierarchical pricing — rolling up child line item prices to parent groups. Only ONE per procedure. Not compatible with Derived Pricing or Promotions elements.Complex multi-service enterprise quotes where group totals need to roll up to a quote group summary.
List Group / List FilterAdvancedContainer for conditional processing. List Filter narrows items. Only ONE filter per group.Apply contract discount ONLY on lines where IsContracted = TRUE. Apply Tarifa Social ONLY if WelfareEligible = TRUE.
Stop PricingCoreStops procedure execution for a specific line item. Waterfall shows where execution stopped. Used for conditional exit logic.After Tarifa Social is applied: Stop Pricing prevents contract discount element from also executing on the same line.
AssignmentCoreDynamically sets or changes context tag values without touching the database. Useful for defaulting null values.Handle Comuniqa Go! orders where EffectiveTo is not set — Assignment element defaults it from the quote's close date.
Rounding ValuesCoreRounds currency outputs to a specified decimal place using Round Up, Round Down, or Half Up rules.Round final ARS prices to whole pesos (0 decimal places) for clean invoice presentation in the Argentine market.
Promotion ExecutionAdvancedConnects Global Promotions Management with Revenue Cloud. Cannot be used with Price Propagation or Derived Price in the same procedure.Comuniqa seasonal promotional campaigns (e.g., "Verano Promo: 3 months free on MoviMundo Plus+").
⚠ Pricing Procedure Composition Constraints Some elements cannot coexist in the same procedure: Derived Price and Discount Distribution Service cannot be combined. Price Propagation cannot be combined with Derived Pricing or Promotion Execution. Discount Distribution Service must always be the last element and can only appear once. Design your procedure topology before building.
04 Capabilities

Capabilities Breakdown

Core Capabilities

✓ Multiple Price Books ✓ Cost Books / Margin ✓ Pricing Recipes (DT grouping) ✓ Pricing Procedures (declarative) ✓ Price Waterfall + Persistence ✓ Volume & Tier Adjustments ✓ Attribute-Based Pricing ✓ Bundle-Based Adjustments ✓ Manual / Discretionary Discounts ✓ Decision Table Integration ✓ Context-Driven Pricing ✓ Pricing Discount Calendar ✓ Simulation in Procedure Builder ✓ Cumulative Quantity Pricing ✓ Pricing Adjustment Batch Jobs

Advanced / Extended Capabilities

⚡ Headless Pricing via REST API ⚡ Proration & Subscription Pricing ⚡ Formula-Based Pricing ⚡ Price Adjustment Matrix (custom DT) ⚡ Discount Distribution Service ⚡ Derived Pricing (product/asset/header) ⚡ Contract-Based Pricing ⚡ Price Revision / CPI Uplift ⚡ Price Tracking (min/max history) ⚡ Price Propagation (roll-up hierarchy) ⚡ Procedure Output Resolution (MIN/MAX/SEQUENCE/STACK) ⚡ Parallel Pricing Element Execution ⚡ Decision Explainer (custom waterfall messages) ⚡ Einstein AI Context Tag Mapping ⚡ Promotion Execution (Global Promotions) ⚡ Standard & Custom Pricing Actions (Calculate Price button) ⚡ Advanced Detail Line Pricing (custom field mapping via ARC) ⚡ Pricing Action Parameters (price from any object record page)

Comuniqa Pricing Model — At a Glance

ProductStandard Price (ARS/mo)Price in Bundle (ARS/mo)Pricing Element
Comuniqa Go! (Vida Digital bundle root)69,00069,000Priced at bundle parent level
Comuniqa Go! (standalone)69,0000Bundle-Based Price element
SIM Card00List Price → Price Book Entry = 0
Phone Number00List Price → Price Book Entry = 0
Comuniqa Go! Two1,6500Bundle-Based Price element
MoviMundo Plus+13,9000Bundle-Based Price element
MoviMundo Basic+7,9000Bundle-Based Price element
Comuniqa Vida Digital Pass C&C9,9009,900Own Pricing Procedure
YouTube Mundo (add-on)4,0000Bundle-Based Price element
Contract Discount (12/24 mo)−25% via Attribute-Based Price element · Is Price Impacting = Contract Term
Tarifa Social−50% via Price Adjustment Matrix element · Custom DT: WelfareEligible = TRUE
05 Limitations

Limitations & Constraints

Documented Platform Limits — Official Values

ComponentDefaultMaxDesign Implication for Comuniqa
Pricing Procedures per org2,00010,000Not a concern for Comuniqa's scale.
Pricing Procedure timeout1 minute2 minutesThe default is 1 minute (not 10 seconds). Cumulative execution across many quote lines adds up.
Discovery Procedure timeout10 seconds60 secondsDiscovery procedures face the tighter 10-second constraint. Derived pricing scenarios must be designed for performance.
Pricing Elements per procedure130200The Comuniqa Mobile Pricing procedure will use ~15–25 elements. Well within limits.
Pricing Elements per discovery proc.50100Keep derived pricing logic simple and targeted.
Pricing Element duration60 sec80 secIndividual elements have their own timeout. A slow Decision Table lookup can block the whole procedure.
Map Line Item mappings2050Sufficient for Comuniqa standard fields. Custom field heavy implementations may approach this.
Price Impacting Attributes per product25Comuniqa Go! uses ~2–3. Well within limits.
Contributing products for derived pricing4050Relevant if Comuniqa implements device-linked service pricing.
Price Tracking duration7 days30 daysFor ENACOM price transparency requirements, consider the maximum 30-day tracking window.
Active Pricing Recipes11Only one active recipe at a time. All custom Decision Tables must be registered before use.
🔴 Corrected: Procedure Timeout is 1 Minute (Default), NOT 10 Seconds The 10-second default applies to Discovery Procedures, not Pricing Procedures. Pricing Procedures default to 1 minute, with a maximum of 2 minutes. Derived pricing scenarios that use discovery procedures face the tighter 10-second constraint per discovery execution.

Architectural Constraints

🔒 Product Selling Model Cannot Change After Price Book Entry Creation
Once a Price Book Entry is created with a Product Selling Model, the selling model cannot be changed. For Comuniqa, if Comuniqa Go! is initially added to the price book with an Evergreen selling model but should have been Term-Defined, a support ticket must be raised to modify it. This is a critical first-setup constraint — validate selling model assignments in sandbox before creating production price book entries.
📊 CSV-Based Decision Tables Not Supported
Salesforce Pricing explicitly does NOT support CSV-based decision tables or decision matrices. All Decision Tables used in Pricing Procedures must be Standard or Advanced type built on Salesforce objects. For Comuniqa, any pricing data currently in spreadsheets must be migrated to Salesforce objects before it can drive pricing logic.
🔄 No Native Pricing Procedure Versioning
Pricing Procedures have no native version management. When you modify an active procedure, all new invocations — including amendments on existing Comuniqa Go! subscriptions — use the updated logic immediately. Mitigation: use separate named procedures per pricing campaign period, and route amendments to the procedure version active at sale time using a metadata-controlled routing rule.
⚠ Procedure Plan Migrations Not Supported
Procedure Plans cannot be migrated from one org to another via package files. All other pricing metadata (recipes, decision tables, context definitions, procedures) can be packaged and deployed. This means Comuniqa's Procedure Plan configurations must be manually recreated in each org (sandbox → staging → production).
💰 Multicurrency: Deactivate Before Enabling
To enable multicurrency in an org that already has active pricing procedures: first deactivate all pricing procedures, then enable multicurrency, then add the Currency field to affected decision tables, then reactivate. For Comuniqa's ARS-only implementation this is not currently relevant, but if they expand to USD-pegged pricing (common in Argentina), this sequence is mandatory and disruptive.
06 Implementation Challenges

Common Implementation Challenges

⚠ Real-World Mistakes — Comuniqa Context

  • Wrong Procedure Assigned to Wrong Context: Team assigns the Revenue Settings pricing procedure to the Product Discovery Settings page. Customers browsing the catalog see wrong prices. The three procedure assignments (Discovery, headless, Revenue Settings) must each use the correct purpose-built cloned procedure.
  • Pricing Recipe Not Updated Before Use: Team creates a new "Tarifa Social" Decision Table but forgets to add it to the Pricing Recipe's Price Adjustment Matrix tab. The element cannot find the table and silently returns no discount. Always update the recipe before creating procedures that reference new tables.
  • Context Tag Named Same as Decision Table: A developer names a context tag "TarifaSocialDT" — the same as the Decision Table's API name. The Pricing engine throws an error during activation. Context tags cannot share names with decision table labels or API names.
  • Bundle-Based Adjustment Missing Root Bundle Field: Team creates a Bundle-Based Adjustment record for Comuniqa Go! as a child but leaves Root Bundle blank. The Bundle-Based Price element cannot find the adjustment. Root Bundle, Parent Product, and Product must all be correctly populated.
  • Tarifa Social and Contract Discount Stacking: Both discount steps are in the procedure with no precedence logic. A welfare-eligible customer with a 12-month contract receives 75% off (50% + 25%). A List Group + Stop Pricing element must enforce that Tarifa Social suppresses the contract discount step.
  • Proration Not Configured for Amendment Flow: Team adds the Proration element but forgets to configure the Proration Settings in Salesforce Pricing Setup. Mid-cycle amendments fail to calculate partial charges, generating a full month charge. Proration Settings are a prerequisite, not optional.
  • Decision Tables Not Refreshed After Data Changes: Pricing analyst updates Comuniqa Go! Two's price adjustment tier from ARS 1,650 to ARS 1,800. The Pricing Procedure continues to return ARS 1,650 because the Volume Discount Entries decision table was not refreshed. Decision Tables must be manually refreshed whenever source data changes — this is not automatic.
  • Price Waterfall Not Enabled in Setup: Go-live without enabling Price Waterfall and Price Waterfall Persistence. Agents cannot explain discount breakdowns to customers. Billing disputes arise because there is no audit trail. Price Waterfall must be enabled before the first quote is created.
  • Amendment Pricing Re-runs Full Procedure: A promotional step was added to the Comuniqa Go! pricing procedure in October. In November, a customer amends their subscription (adds Go! Two). The amendment re-invokes the full procedure, and the existing Comuniqa Go! base plan line now reflects the October promotional price — violating the customer's original contract rate. Version routing for amendments is essential.
🔴 ENACOM Compliance Risk — No Waterfall Persistence = No Audit Trail Argentine telecom regulator ENACOM requires pricing transparency. Without Price Waterfall Persistence enabled, there is no stored record of how each customer's price was calculated. If a billing dispute arises, Comuniqa cannot reconstruct the pricing logic that was applied at quote time. Price Waterfall Persistence should be treated as a compliance requirement, not an optional feature.
07 Boundaries

What This Functionality Cannot Cover

Comuniqa ScenarioWhy Pricing Engine Is NOT the AnswerCorrect Engine
Blocking a customer aged 19+ from subscribing to Comuniqa Go! YouthAge validation is a pre-pricing eligibility gate. Pricing only runs after eligibility passes.Qualification Rules (BRE + Context)
Enforcing MoviMundo Plus+ / Basic+ mutual exclusivityUsing price = 0 as a workaround still activates an invalid order — fulfillment and assets break downstream.Product Configurator
ANSES welfare eligibility verificationPricing reads the WelfareEligible flag from Context — it does not perform the ANSES API call.Eligibility Rules + ANSES API Integration
Per-MB data event rating for IoT SIMsSalesforce Pricing operates at quote/order time. Per-event real-time rating requires mediation infrastructure.External Rating Engine / Mediation Platform
VAT calculation on ARS invoicesTax is a billing-time concern. Pricing calculates net prices excluding tax.Salesforce Billing / External Tax Engine (e.g., Avalara)
ICCID assignment to SIM Card productICCID provisioning is a DRO fulfillment task — assignment happens post-activation.DRO + Inventory Provisioning Integration
Contract T&C clause selectionPricing calculates what a customer pays. Contract terms and legal clauses are a CLM concern.Salesforce Contracts / CLM
✅ Architect Principle The Pricing Engine answers: "What does this eligible, configured customer pay?" It does not determine eligibility, enforce configuration rules, assign physical resources, calculate tax, or generate invoices. Each of those concerns has a dedicated engine — and they all depend on the correct price being calculated here first.
08 Architecture

Architectural Decision Guidance

Decision Patterns for Comuniqa

Does the Comuniqa Go! price change based on customer segment, contract term, or welfare status?
✅ YES → Multiple discount schemes apply
Use separate elements for each scheme with explicit precedence logic: Tarifa Social (Price Adjustment Matrix + Stop Pricing) suppresses Contract Discount (Attribute-Based Price). Use List Group to conditionally execute each block.
Does a product's price change when sold as part of a bundle?
✅ YES (Comuniqa Go! = ARS 0 in bundle)
Configure a Bundle-Based Adjustment record (Root Bundle, Parent Product, Product, Selling Model, Override = 0). The Bundle-Based Price element reads it automatically. Refresh the Bundle Based Adjustment Entries DT after changes.
Does Comuniqa need pricing exposed to Agentforce agents and external channels?
✅ YES → Design for headless
Assign a dedicated cloned procedure to the Salesforce Pricing Setup (headless) context. Keep procedures UI-independent: all inputs from Context, all outputs as deterministic currency values. Enable Parallel Execution to improve API response times for complex multi-line quotes.
Does Argentina's high inflation require automatic renewal price adjustments?
✅ YES → Use Price Revision / CPI
Create Price Revision Policy records (e.g., "AR CPI") with INDEC-sourced Index Rate records. Add the Price Revision element to the renewal pricing procedure. Only applies to termed assets — not one-time or evergreen.

Best-Practice Design Patterns

🏗 Pattern: Domain-Scoped Pricing Procedures
Never build one mega-procedure for all Comuniqa products. Recommended: (1) Comuniqa Mobile Plan Procedure — base tariff, contract discount, Tarifa Social, proration; (2) Comuniqa Add-On Procedure — MoviMundo, Go! Two, Family Go! formula; (3) Vida Digital Pass Procedure — pass subscription price; (4) Comuniqa Discovery Procedure — derived pricing for device-linked services. Each is independently testable, deployable, and governable.
🔧 Pattern: Context-First Architecture
Design Context Definitions before writing a single procedure element. Required Comuniqa context mappings: Account.WelfareEligible, Quote.ContractTerm__c, Quote.BundleId, QuoteLine.ProductCode, Account.ResidencyStatus. Validate every mapping with a simulation before authoring procedure logic. Broken context mappings cause silent failures — no error, just wrong prices.
📅 Pattern: Tarifa Social Rate Governance via Effective Dates
ENACOM-mandated Tarifa Social rate changes (e.g., 50% → 55%) should be managed by creating new Price Adjustment Schedule records with the correct effective date range — not by modifying an existing active record directly. Each rate change gets its own dated record (Effective From / Effective To), so the engine automatically applies the correct rate based on transaction date. The Pricing Discount Calendar is a visualization tool that lets pricing analysts see all these date-effective discount records in one calendar view — it shows what has been configured, but is not itself a governance configuration mechanism.
🔐 Pattern: Amendment Version Safety
Store the Pricing Procedure name used at sale time on the Asset record (custom field). On amendment, the orchestration layer routes to the procedure version active at original sale time for existing lines, and the current latest procedure for new lines. This prevents mid-contract price drift — Comuniqa customers with 12-month contracts receive the discount rate they signed up for, regardless of subsequent procedure changes.
🤖 Pattern: Headless & Agentforce API-Ready Design
For Agentforce quoting agents invoking pricing headlessly, procedures must be UI-independent: no hardcoded UI-only variables, all inputs via Context tags, all outputs as clean currency values. Enable Parallel Execution for independent elements to reduce API response latency. Assign the headless procedure specifically in Salesforce Pricing Setup (separate from the Revenue Settings procedure). Monitor pricing API performance via Price Logs Capture.

When NOT to Use the Salesforce Pricing Engine

✗ ANSES eligibility verification ✗ Per-MB IoT event rating ✗ MoviMundo mutual exclusivity ✗ VAT/tax on ARS invoices ✗ Credit check (Veraz/Nosis) ✗ ICCID provisioning assignment ✗ Max active lines enforcement
Knowledge Check

Knowledge Check — 10 Questions

All questions are grounded in the Comuniqa implementation scenario. Architect-level reasoning required.

Question 1 of 10 — Pricing Elements

Comuniqa Go! customers with a 12-month contract receive a 25% discount. The "Contract Term" attribute is marked as "Is Price Impacting". Which Pricing Element handles this calculation?

A) Volume Discount element, reading the quantity-based adjustment schedule
B) Attribute-Based Price element, reading the Attribute Discount Entries decision table where Contract Term = "12 Months" returns Adjustment Type = Percentage, Adjustment Value = 25%
C) Price Adjustment Matrix element with a custom Decision Table
D) Formula-Based Pricing element using an IF formula on Contract Term
Question 2 of 10 — Discount Precedence

A Comuniqa customer qualifies for both the Select Contract Discount (25%) and Tarifa Social (50%). What mechanism prevents both discounts from stacking to 75% off?

A) The Pricing Recipe is configured to allow only one discount per product
B) The Eligibility Rule layer resolves discount precedence before pricing runs
C) A List Group element with WelfareEligible = TRUE as the filter condition, followed by the Tarifa Social Price Adjustment Matrix step and a Stop Pricing element, prevents the Contract Discount element from executing for welfare-eligible customers
D) The Pricing Recipe is set to First Match, which automatically selects the highest discount
Question 3 of 10 — Procedure Setup
📋 After go-live, Comuniqa's Browse Catalogs shows correct list prices. But when agents submit quotes, the prices are different — they appear to be missing the contract discount step.

What is the most likely root cause?

A) The Pricing Procedure timeout is too short — it is timing out before the discount element runs
B) The wrong pricing procedure was assigned in Revenue Settings. Browse Catalogs uses the Product Discovery procedure (list price only). Quotes and orders use the procedure set in Revenue Settings — if a different procedure was assigned there, quote prices will differ from catalog prices.
C) The Pricing Recipe was not refreshed after the procedure was activated
D) Price Waterfall Persistence is not enabled, which prevents discounts from being applied
Question 4 of 10 — Proration
📋 A Comuniqa customer on a monthly billing cycle activates Comuniqa Go! Two (ARS 1,650/month) on the 20th of a 30-day month. The billing period runs 1st–30th.

What is the correct prorated charge for the partial month, and which elements produce this?

A) ARS 1,650 — full month is always charged on activation regardless of start date
B) ARS 605 (approx) — Proration element calculates multiplier = 11 remaining days / 30 total days = 0.3667. Subscription element then calculates: ARS 1,650 × 0.3667 × qty 1 = ARS 605.05. The pair of Proration + Subscription elements must appear in this exact sequence in the procedure.
C) ARS 825 — the platform automatically prorates to the nearest half-month
D) ARS 550 — Formula-Based Pricing calculates (ARS 1,650 / 30) × 10 remaining days
Question 5 of 10 — Decision Tables
📋 The Comuniqa pricing team updates the Tarifa Social discount rate from 50% to 55% in the Price Adjustment Tier record. The next day, agents report that quotes still show 50% off for welfare-eligible customers.

What step did the team forget?

A) They forgot to reactivate the Pricing Procedure after the change
B) They forgot to refresh the Decision Table. After any change to source object data (Price Adjustment Tiers, Attribute Based Adjustments, etc.), the corresponding Decision Table must be manually refreshed from Setup → Decision Tables → Refresh. The engine reads from the cached decision table, not live records.
C) They forgot to update the Pricing Recipe to register the new rate
D) They forgot to sync pricing data in Salesforce Pricing Setup
Question 6 of 10 — Pricing Limits

A developer states: "Our Comuniqa Go! Pricing Procedure has a 10-second default timeout — we need to optimize aggressively." Is this accurate?

A) Yes — the default timeout for all Salesforce Pricing procedures is 10 seconds
B) No — the default timeout for Pricing Procedures is 1 minute (with a maximum of 2 minutes). The 10-second default applies to Discovery Procedures. The developer has confused the two procedure types.
C) Yes — the timeout is 10 seconds, but each element has its own 60-second timeout, so the procedure won't actually time out
D) The timeout is configurable per procedure with no default constraint
Question 7 of 10 — Bundle Pricing
📋 A pricing analyst sets up a Bundle-Based Adjustment record to zero out Comuniqa Go! when sold inside the Vida Digital bundle. Two days after activation, agents report that Comuniqa Go! still shows ARS 69,000 on quotes within the bundle.

What is the most likely cause?

A) The Bundle-Based Price element is missing from the Pricing Procedure
B) The Bundle Based Adjustment Entries Decision Table was not refreshed after the new adjustment record was created. The Pricing Procedure reads from the cached DT, not from the live Salesforce record. The analyst must navigate to Setup → Decision Tables → "Bundle Based Adjustment Entries" → Refresh.
C) The adjustment record needs to be added to the Pricing Recipe before it takes effect
D) The product selling model on the adjustment record doesn't match the Price Book Entry
Question 8 of 10 — CPI / Price Revision
📋 Comuniqa wants to automatically apply a 3% renewal uplift to all termed Comuniqa Go! subscriptions at their annual renewal date, indexed to the Argentine INDEC CPI rate plus 3% additional margin, capped at 12%.

Which combination of platform features implements this requirement?

A) Formula-Based Pricing element with a hardcoded 3% formula in the renewal pricing procedure
B) Create a Price Revision Policy record (Type = Price Index, Region = AR, Formula = MIN(12, PriceIndex + 3)). Create Index Rate records with INDEC CPI values per effective period. Add the Price Revision element to the renewal pricing procedure. Note: this only works for termed assets — not one-time or evergreen.
C) Use the Price Tracking element to record historical prices and a Formula element to calculate the uplift from the tracked minimum
D) Create a Manual Discount element pre-populated with −3% and require the agent to apply it at renewal time
Question 9 of 10 — Element Constraints

Comuniqa's pricing architect wants to build a single "Master Pricing Procedure" that includes: Derived Pricing (for device-linked services), Discount Distribution Service (for total-bill retention discounts), and Promotion Execution (for seasonal campaigns). Is this valid?

A) Yes — all these elements can coexist in a single procedure
B) No — Derived Price cannot be combined with Discount Distribution Service in the same procedure. Additionally, Price Propagation cannot coexist with Derived Pricing or Promotion Execution. The architect must design separate domain-scoped procedures and route line items to the correct procedure based on product type.
C) Yes — but the Discount Distribution Service must be placed before the Derived Price element
D) Only Promotion Execution and Derived Price cannot coexist — Discount Distribution Service can be combined with either
Question 10 of 10 — Governance & Compliance
📋 ENACOM (Argentine telecom regulator) requests that Comuniqa provide a detailed audit trail showing exactly how each customer's monthly bill was calculated — specifically which discounts were applied, at what step, and in what order — for all bills issued in the past 6 months.

Which Salesforce Pricing feature directly enables Comuniqa to respond to this regulatory request?

A) The Pricing Discount Calendar, which shows all discounts applied to each product over time
B) The Price Tracking element, which records min/max price history for each product over a 30-day window
C) Price Waterfall Persistence, which stores detailed logs of each pricing calculation step at the time of execution. Combined with Decision Explainer for custom step-level explanations, this gives Comuniqa a complete, step-by-step audit trail per quote/order that can be retrieved for regulatory review. This must have been enabled in Salesforce Pricing Setup before the bills were issued — it cannot be retroactively applied.
D) The Price Logs Capture feature, which collects logs from pricing API calls for performance monitoring only