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.
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.
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 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.
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:
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.
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
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
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
Comuniqa Discount Structure — Visual Overview
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.
| Element | Type | What It Does | Comuniqa Use Case |
|---|---|---|---|
| Pricing Setting | Required First | Initializes 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 Item | Setup | Maps 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 Price | Core | Fetches 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 Discount | Core | Applies 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 Discount | Core | Applies 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 Discount | Core | Allows 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 Price | Core | Adjusts 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 Price | Core | Applies 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. |
| Proration | Advanced | Calculates 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. |
| Subscription | Advanced | Calculates 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 Pricing | Advanced | Performs 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 Matrix | Advanced | Uses 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 Service | Advanced | Distributes 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 Price | Advanced | Calculates 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 Pricing | Advanced | Applies 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) | Advanced | Applies 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 Tracking | Advanced | Tracks 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 Propagation | Advanced | Enables 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 Filter | Advanced | Container 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 Pricing | Core | Stops 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. |
| Assignment | Core | Dynamically 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 Values | Core | Rounds 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 Execution | Advanced | Connects 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+"). |
Capabilities Breakdown
Core Capabilities
Advanced / Extended Capabilities
Comuniqa Pricing Model — At a Glance
| Product | Standard Price (ARS/mo) | Price in Bundle (ARS/mo) | Pricing Element |
|---|---|---|---|
| Comuniqa Go! (Vida Digital bundle root) | 69,000 | 69,000 | Priced at bundle parent level |
| Comuniqa Go! (standalone) | 69,000 | 0 | Bundle-Based Price element |
| SIM Card | 0 | 0 | List Price → Price Book Entry = 0 |
| Phone Number | 0 | 0 | List Price → Price Book Entry = 0 |
| Comuniqa Go! Two | 1,650 | 0 | Bundle-Based Price element |
| MoviMundo Plus+ | 13,900 | 0 | Bundle-Based Price element |
| MoviMundo Basic+ | 7,900 | 0 | Bundle-Based Price element |
| Comuniqa Vida Digital Pass C&C | 9,900 | 9,900 | Own Pricing Procedure |
| YouTube Mundo (add-on) | 4,000 | 0 | Bundle-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 | ||
Limitations & Constraints
Documented Platform Limits — Official Values
| Component | Default | Max | Design Implication for Comuniqa |
|---|---|---|---|
| Pricing Procedures per org | 2,000 | 10,000 | Not a concern for Comuniqa's scale. |
| Pricing Procedure timeout | 1 minute | 2 minutes | The default is 1 minute (not 10 seconds). Cumulative execution across many quote lines adds up. |
| Discovery Procedure timeout | 10 seconds | 60 seconds | Discovery procedures face the tighter 10-second constraint. Derived pricing scenarios must be designed for performance. |
| Pricing Elements per procedure | 130 | 200 | The Comuniqa Mobile Pricing procedure will use ~15–25 elements. Well within limits. |
| Pricing Elements per discovery proc. | 50 | 100 | Keep derived pricing logic simple and targeted. |
| Pricing Element duration | 60 sec | 80 sec | Individual elements have their own timeout. A slow Decision Table lookup can block the whole procedure. |
| Map Line Item mappings | 20 | 50 | Sufficient for Comuniqa standard fields. Custom field heavy implementations may approach this. |
| Price Impacting Attributes per product | 25 | — | Comuniqa Go! uses ~2–3. Well within limits. |
| Contributing products for derived pricing | 40 | 50 | Relevant if Comuniqa implements device-linked service pricing. |
| Price Tracking duration | 7 days | 30 days | For ENACOM price transparency requirements, consider the maximum 30-day tracking window. |
| Active Pricing Recipes | 1 | 1 | Only one active recipe at a time. All custom Decision Tables must be registered before use. |
Architectural Constraints
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.
What This Functionality Cannot Cover
| Comuniqa Scenario | Why Pricing Engine Is NOT the Answer | Correct Engine |
|---|---|---|
| Blocking a customer aged 19+ from subscribing to Comuniqa Go! Youth | Age validation is a pre-pricing eligibility gate. Pricing only runs after eligibility passes. | Qualification Rules (BRE + Context) |
| Enforcing MoviMundo Plus+ / Basic+ mutual exclusivity | Using price = 0 as a workaround still activates an invalid order — fulfillment and assets break downstream. | Product Configurator |
| ANSES welfare eligibility verification | Pricing 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 SIMs | Salesforce Pricing operates at quote/order time. Per-event real-time rating requires mediation infrastructure. | External Rating Engine / Mediation Platform |
| VAT calculation on ARS invoices | Tax is a billing-time concern. Pricing calculates net prices excluding tax. | Salesforce Billing / External Tax Engine (e.g., Avalara) |
| ICCID assignment to SIM Card product | ICCID provisioning is a DRO fulfillment task — assignment happens post-activation. | DRO + Inventory Provisioning Integration |
| Contract T&C clause selection | Pricing calculates what a customer pays. Contract terms and legal clauses are a CLM concern. | Salesforce Contracts / CLM |
Architectural Decision Guidance
Decision Patterns for Comuniqa
Best-Practice Design Patterns
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.When NOT to Use the Salesforce Pricing Engine
Knowledge Check — 10 Questions
All questions are grounded in the Comuniqa implementation scenario. Architect-level reasoning required.