Install
$ agentstack add skill-arohitu-salesforce-revenue-cloud-skills-revenue-cloud-pcm ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Salesforce Product Catalog Management (PCM)
You are helping with Salesforce Product Catalog Management in Salesforce Revenue Cloud / Agentforce Revenue Management / Revenue Cloud Advanced / Revenue Cloud Billing. This is the newer core-platform product family that uses standard/core Salesforce objects such as Product2, Quote, QuoteLineItem, ProductClassification, and related PCM objects. Do not drift into legacy managed-package Salesforce CPQ (SBQQ__) or legacy Salesforce Billing (BLNG__) patterns unless the user explicitly asks for those products.
PCM models the company's product portfolio — catalogs, categories, products, bundles, dynamic attributes, classifications, qualification rules, selling models, and the Product Discovery experience.
This file is your routing layer. It contains the gotchas you must always remember and a map of when to load which reference. Do not try to answer detailed PCM questions from this file alone — load the right reference first.
Always-true gotchas (never forget these)
These are the corrections most agents need before they can be useful in PCM. Internalize them:
- Bundles use a TWO-table structure, not one. A configurable bundle has both
ProductRelatedComponent(the line linking a child to a parent) andProductComponentGroup(the section the line belongs to). Static bundles can skip groups; configurable bundles cannot. Don't model a bundle without thinking through both. - Attributes can be attached at TWO levels.
ProductClassificationAttrdefines the template attribute on a classification.ProductAttributeDefinitionis the instance attached to a specificProduct2. A product based on a classification inherits its attributes; you only create aProductAttributeDefinitionwhen overriding an inherited attribute on a specific product or adding a one-off attribute. Confusing these two is the most common PCM modeling error. - Qualification rules default to
qualified. A product or category with NO qualification/disqualification record is visible. Qualification beats disqualification when both apply. Don't write a rule "to make it visible" — write a rule to restrict visibility. ProductSellingModelis its own object, not a Product2 picklist. Pricing term length and unit live onProductSellingModel. A product is linked to one or more selling models viaProductSellingModelOption. Pricing (rates, books) lives in a separate Salesforce Pricing module — do NOT try to put price on Product2 directly for PCM-driven flows.Product2.Type = 'Bundle'is the switch that turns a product into a bundle. Without it,ProductRelatedComponentrows pointing to it will not be treated as bundle components by the runtime. Also setConfigureDuringSalecorrectly:Allowed(configurable),Not Allowed(static), orNone(simple product).Product2.BasedOnId(the classification link) is what makes a product inherit attributes. SettingBasedOnIdis mandatory before you can rely on classification-driven attributes; without it, you have to attach every attribute viaProductAttributeDefinitiondirectly.- Catalogs and categories are time-bounded.
EffectiveStartDate/EffectiveEndDateonCatalog, andEffectiveFromDate/EffectiveToDateon qualification/disqualification rules. A "missing" product in Product Discovery is most often an expired effective-window, not a permission or rule problem. - API version matters. Most PCM objects appear in API v60.0+. Some (
ProductRampSegment,IsNavigational,ProductComponentGroup.ParentGroupId,Product2.UsageModelType) are v62.0+.AttrPicklistExcludedValueis v61.0+. Check the API version of the org before assuming an object exists. - PCM is not standalone. It hands records off to Salesforce Pricing, Product Configurator, Transaction Management, and Billing. A "wrong" PCM model often shows up as a downstream pricing or configurator error. When debugging, identify which module is actually emitting the error before changing PCM.
- Permission set groups, not profiles. PCM ships permission sets:
ProductCatalogManagementDesigner,ProductCatalogManagementViewer, plus community variants. Compose them via permission set groups; do not clone profiles. - Describe the org before data migration or bulk lookup work. Object and field API names vary by org/version: catalogs may expose as
ProductCatalograther thanCatalog, andAttributePicklistValuemay usePicklistIdrather thanAttributePicklistId. - This is not legacy managed-package CPQ/Billing. Revenue Cloud / Agentforce Revenue Management uses core objects and unnamespaced APIs for PCM. Avoid
SBQQ__CPQ andBLNG__Billing assumptions, fields, and object names unless the user explicitly says they are working on those legacy managed packages.
When to load which reference
Read only the reference(s) relevant to the current task. Each reference is self-contained.
| User intent | Load | |---|---| | "What is PCM?", architecture, how modules connect | references/01-architecture.md | | Editions, license, permission sets, personas, setup | references/02-setup-and-permissions.md | | Catalogs, categories, navigation, hierarchy, default catalog | references/03-catalogs-and-categories.md | | Attribute definitions, picklists, attribute categories, validation | references/04-attributes.md | | Product classifications, attribute templates, inheritance | references/05-product-classifications.md | | Product creation, simple vs bundle, components, cardinality, overrides | references/06-products-and-bundles.md | | Product variants (size/color/storage), variation parents | references/07-product-variants.md | | Qualification / disqualification rules, decision tables, eligibility | references/08-qualification-rules.md | | Selling models (one-time, term-defined, evergreen), proration, ramp | references/09-selling-models.md | | Product Discovery, Browse Catalogs, Guided Selection, search | references/10-product-discovery.md | | Hard limits — sizing, max attrs, max bundle depth, etc. | references/11-limits.md | | Field-level lookup for ANY PCM object (Product2, AttributeDefinition, etc.) | references/12-object-reference.md | | Catalog/bundle migration, CSV export, load order, target-org import | references/13-data-migration.md |
When the user's question spans multiple areas (e.g., "build a configurable phone bundle with color and storage attributes"), load multiple references — but only the ones you need.
Standard workflows
These are the workflows that appear over and over. Follow the named steps; the detailed "how" is in the referenced file.
Workflow A — Stand up a new product catalog from scratch
- Confirm editions and permission sets — load
02-setup-and-permissions.md. - Create the
Catalogrecord withEffectiveStartDate, optionalEffectiveEndDate, andCatalogType— load03-catalogs-and-categories.md. - Build the category hierarchy under the catalog (max 5 levels deep, excluding root). Set
IsNavigationalfor browse paths. - Create
AttributeDefinitionrecords for the attributes the products share. Group them withAttributeCategoryif reusable — load04-attributes.md. - Create
ProductClassificationtemplates and link attributes viaProductClassificationAttr— load05-product-classifications.md. - Create
Product2records, setBasedOnIdto the classification — load06-products-and-bundles.md. - Link products to categories via
ProductCategoryProduct. - Add
ProductSellingModelOptionrows tying each product to one or moreProductSellingModels — load09-selling-models.md. - Add qualification rules only if you need to restrict visibility — load
08-qualification-rules.md. - Validate via Product Discovery — load
10-product-discovery.md.
Workflow B — Build a configurable bundle
- Create the parent
Product2withType = 'Bundle'andConfigureDuringSale = 'Allowed'. - Create
ProductComponentGrouprows for each section of the bundle (e.g., "Choose phone", "Choose plan"). - For each child product, create
ProductRelatedComponent, settingParentProductId,ChildProductId, andProductComponentGroupId. SetMinQuantity,MaxQuantity,Quantity,IsComponentRequired,IsDefaultComponent,IsQuantityEditable,QuoteVisibility. - If the bundle needs cardinality overrides for a particular root context, create
ProductComponentGrpOverride(group cardinality) and/orProductRelComponentOverride(component cardinality), tying both to a rootOverrideContextId. - Cap: ≤200 components per bundle hierarchy, ≤600 attribute overrides, ≤10 component or group overrides per bundle. See
references/11-limits.md. - Run Validate Product Definition in the UI before treating the bundle as ready.
Detail in references/06-products-and-bundles.md.
Workflow C — Add dynamic attributes to a product family
- Decide: are the attributes shared across many products? If yes, attach via
ProductClassification(template). If unique to one product, attach directly toProduct2. - Create
AttributeDefinitionrows for each attribute (setDataType). - For picklist-typed attributes, create
AttributePicklistandAttributePicklistValuerows. - Group attributes via
AttributeCategory+AttributeCategoryAttributeif reusable. - Attach to template:
ProductClassificationAttrrows. - To exclude specific picklist values for a classification or product, create
AttrPicklistExcludedValuerows. - To override an attribute on a specific product, create
ProductAttributeDefinitionand setOverriddenProductAttributeDefinitionId.
Detail in references/04-attributes.md and references/05-product-classifications.md.
Workflow D — Diagnose "product is missing from Browse Catalogs"
Check in this order — most common cause first:
Product2.IsActive = true?Product2.AvailabilityDatereached andDiscontinuedDate/EndOfLifeDatenot yet passed?ProductCategoryProductrow exists for the catalog category being browsed?Catalog.EffectiveStartDatereached,EffectiveEndDatenot passed?ProductDisqualificationorProductCategoryDisqualrecord evaluating toIsDisqualified = truefor current context?- Qualification procedure (if configured) returning false for this user?
- Product Discovery search index up to date? (After bulk loads, a reindex is required.)
- User has the right permission set (Viewer at minimum)?
Detail in references/08-qualification-rules.md and references/10-product-discovery.md.
Workflow E — Migrate catalog or bundle product data
- Confirm the input mode: a catalog name/id/code, or one or more bundle
Product2ids/codes whereProduct2.Type = 'Bundle'. - Describe the source org schema before querying, especially
ProductCatalog/Catalogand attribute picklist fields. - Expand the product graph through
ProductRelatedComponent, collectingChildProductIdproducts andChildProductClassificationIdclassifications. Recurse into child products that are bundles. - Include reusable attribute foundation objects (
AttributeDefinition,AttributePicklist,AttributePicklistValue,AttributeCategory,AttributeCategoryAttribute) plus scoped classification/product attribute records. - Generate CSVs with source ids and helper business keys for lookup/remapping.
- Load a target org in analyzed dependency order with checkpointed id mapping. The load package must be usable without source org access after export.
Detail in references/13-data-migration.md.
Available scripts
This skill bundles helper scripts under scripts/ for inspecting a Salesforce org's PCM data via the Salesforce CLI (sf). They require sf authenticated to a target org. Reference them only when the user wants to inspect or load real org data.
scripts/describe-pcm-objects.sh— Runssf sobject describefor every PCM object and writes the full schemas topcm-describe/. Useful for confirming which fields exist in a specific org/API version before writing queries.scripts/query-product-tree.sh— Given aProduct2.Idof a bundle, recursively prints the bundle hierarchy with components, groups, and attributes. Use to validate a bundle was modeled correctly.scripts/list-catalogs.sh— Lists every active catalog with categories and product counts. Quick health check after a deploy.scripts/check-orphans.sh— Finds common modeling defects: products withType = 'Bundle'but no components; classifications with no products; qualification rules with expired effective dates.
Each script prints --help with usage. They are read-only by default.
For fragile migration/export/import work, prefer a dedicated script over ad hoc SOQL. If adding migration scripts, use relative paths and explicit interfaces such as:
scripts/export-pcm-migration.py— Export by--target-org,--catalog-name/--catalog-idor--bundle-product-id/--bundle-product-code, and--out-dir. It should write CSVs, a manifest, analyzed load order, and coverage notes.scripts/load-pcm-migration.py— Load a generated package into a target org with--target-org, interactive pauses, checkpointed id mapping, and local error reports. It must not require source org access.
Things this skill explicitly does NOT cover
These are adjacent modules. If the user crosses into them, say so and stop:
- Pricing math, price books, rate cards → Salesforce Pricing module (separate).
- Quote/order line creation, runtime configurator UI behavior → Product Configurator + Transaction Management.
- Billing operations outside PCM master data (invoicing, billing schedules, revenue recognition) → Revenue Cloud Billing/Billing module.
- Approval flows on quotes → Advanced Approvals.
- Asset and subscription lifecycle after order fulfillment → Dynamic Revenue Orchestrator.
PCM ends where the product is defined and discoverable. Anything past that belongs to a sibling module in the Revenue Cloud core product family. Do not switch to legacy SBQQ__ or BLNG__ managed-package behavior unless the user explicitly requests it.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: arohitu
- Source: arohitu/salesforce-revenue-cloud-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.