Use when configuring the Salesforce product catalog and pricing structure: creating Product2 records, setting up Standard and custom Pricebooks, managing PricebookEntry junction records, enabling multi-currency pricing, configuring Product Schedules (Revenue and Quantity), or troubleshooting incorrect prices on Opportunity line items and Quotes. Triggers: 'add product to pricebook', 'pricebook entry', 'standard pricebook', 'product catalog', 'multi-currency product pricing', 'product schedule', 'revenue schedule', 'quantity schedule', 'deactivate product'. NOT for CPQ (Salesforce Revenue Cloud / SBQQ) product configuration, CPQ pricing rules, or CPQ bundle setup. NOT for Quote template layout or PDF generation.
Use this skill when configuring or troubleshooting Salesforce's native product catalog and pricing structure. The core data model involves three objects — Product2, Pricebook2, and PricebookEntry — working together as a junction pattern. Misunderstanding the role of each object is the single most common source of incorrect pricing on Opportunity line items and Quote line items.
This skill does NOT cover CPQ (Salesforce Revenue Cloud / SBQQ) pricing rules, CPQ bundles, or CPQ price actions. Route those requests to the architect/cpq-vs-standard-products-decision skill.
Gather this context before working on anything in this domain:
The Salesforce product catalog is a three-object model:
IsActive flag, and any custom fields. A Product2 record has no price on its own.IsActive flag. Each org has exactly one Standard Pricebook (created automatically) and can have unlimited custom Pricebooks.UnitPrice. When a rep adds a product to an Opportunity or Quote, they are selecting a PricebookEntry — not the Product2 directly.The dependency chain is:
IsActive = true).Skipping step 2 and going straight to a custom Pricebook entry is a hard platform error — the API will reject it.
Every Salesforce org has exactly one Standard Pricebook. Its properties:
IsActive = false).Test.getStandardPricebookId() in Apex tests. Hardcoding its ID in test code is a common and problematic anti-pattern — the ID varies between orgs and sandboxes.Custom Pricebooks can be created without limit. Each custom Pricebook:
UnitPrice per product per currency than the Standard Pricebook.Opportunity.Pricebook2Id. All products added to that opportunity must come from the same Pricebook. Mixing entries from different Pricebooks on a single opportunity is not supported.When multi-currency is enabled, each PricebookEntry is scoped to a specific currency. For a product to be available in multiple currencies:
CurrencyIsoCode field on PricebookEntry determines which currency that entry's UnitPrice is expressed in.Example: a product sold in USD and EUR requires four PricebookEntry records — one in Standard/USD, one in Standard/EUR, one in CustomPricebook/USD, and one in CustomPricebook/EUR.
Product Schedules split how revenue or quantity is recognized across time after an opportunity is closed. There are two types:
Schedules must be enabled at two levels:
Product Schedules affect how Collaborative Forecasting rolls up revenue if the forecast type is set to use Product Schedules as the forecast object. Confirm the forecasting setup before enabling schedules in a production org.
Setting Product2.IsActive = false hides a product from the selection picker when adding products to new Opportunities or Quotes. It does NOT:
This is intentional — deactivation is safe for catalog cleanup and does not break historical data. Always prefer deactivation over deletion for products that have ever appeared on a closed or historical Opportunity.
When to use: Different customer segments (e.g., direct customers vs. reseller partners) receive different list prices for the same products.
How it works:
UnitPrice per product.Pricebook2Id to the appropriate Pricebook for that customer segment. All products added to the opportunity must come from that same Pricebook.When to use: The org sells in more than one currency and reps need to price deals in the customer's local currency.
How it works:
| Situation | Recommended Approach | Reason |
|---|---|---|
| Need different prices for different customer segments | Create custom Pricebooks per segment | One Pricebook per Opportunity; custom Pricebooks keep segment pricing isolated |
| Product no longer for sale | Deactivate Product2 (IsActive = false) | Deactivation hides from picker; deletion risks breaking historical data |
| Need to retire a custom Pricebook | Deactivate Pricebook2; cannot delete if referenced by open Opportunities | Deactivation prevents new selection; existing line items are preserved |
| Selling in multiple currencies | Create one PricebookEntry per product per currency per Pricebook | Multi-currency requires explicit entries — exchange rate conversion does not create entries |
| Revenue installments or phased delivery | Enable Product Schedules at org and product level | Schedules model time-phased revenue/quantity; must be enabled before use |
| Rep cannot see a product in an Opportunity | Check PricebookEntry exists for that product/Pricebook/currency combo | Missing junction record is the most common cause |
Step-by-step instructions for an AI agent or practitioner working on this task:
IsActive = true, populate product code and family fields. Do not skip the product family field if reports or filters will use it.UnitPrice. For multi-currency orgs, repeat per currency.python3 skills/admin/products-and-pricebooks/scripts/check_products_and_pricebooks.py --manifest-dir path/to/metadata and address all flagged issues before deploying.Run through these before marking work in this area complete:
IsActive = true and a populated product codearchitect/cpq-vs-standard-products-decision — Use when the business is evaluating CPQ vs standard Products/Pricebooks, or when pricing complexity (bundles, rules, approvals) exceeds standard capabilities.admin/quotes-and-quote-templates — Use when quote line items are not showing correct prices from the Pricebook or when the quote PDF needs to reflect pricing data.admin/opportunity-management — Use when the relationship between products, Pricebooks, and opportunity stage/forecast rollup is the core design question.admin/collaborative-forecasts — Use when Product Schedules are being used as the forecast object and schedule-based revenue rollup needs to be configured.