Contracts & Amendments
A deep-dive comparison for Salesforce architects and senior consultants: how Salesforce CPQ (SteelBrick-origin) and Salesforce Revenue Cloud each handle contract lifecycle management, subscription assets, mid-term amendments, renewals, and proration — from data model through automation to customization.
Use Case, User Journey & Personas
Core User Journey
(SBQQ__Contract__c)
per product line
(from Contract)
(qty, price, end date)
(standard Contract)
+ Assets
(Amend/Renew/Cancel)
(auto-generated)
updated via Order Mgmt
| Topic | Salesforce CPQ | Revenue Cloud |
|---|---|---|
| Primary When-to-Use |
Best when the entire contract lifecycle originates in CPQ — subscriptions are tracked as SBQQ__Subscription__c records tied to the Contract. Amendments flow through a dedicated Amendment Quote process on the existing Contract record.
|
Best for asset-based ordering (ABO) scenarios where customer assets persist between transactions. RC models the "current state of what a customer owns" explicitly via Asset and AssetLineItem, with changes driven by Asset Actions rather than re-quoting.
|
| Mid-Term Amendment Types |
|
|
| Internal User Personas |
Sales Rep
Contract Manager
Customer Success Mgr
Renewals Manager
Revenue Ops Analyst
Sales Rep initiates amendment quote from Contract; Contract Manager validates and approves; Renewals Manager manages renewal pipeline via Renewal Opportunity.
|
Sales Rep
Contract Admin
Customer Success Mgr
Order Manager
Revenue Ops Analyst
Order Manager drives asset lifecycle via Asset Console; Contract Admin monitors Contract and ContractLineItems; CSM may initiate changes via Experience Cloud portal integration.
|
| External Persona |
Customer (via CPQ Portal — CPQ+)
Requires CPQ+ Communities license. Customer self-service is limited — typically read-only contract view. Amend actions still routed to internal rep via case or opportunity.
|
Customer (via Experience Cloud)
RC has native Commerce + Experience Cloud integration. Customers can initiate Asset Actions (upgrade, cancel, renew) directly through a self-service portal backed by the Asset Action framework.
|
| Key Object Anchor |
Contract record with field SBQQ__Contract__c custom fields. SBQQ__Subscription__c is the child subscription record — one per product per contract term. The "source of truth" for what the customer owns.
|
Standard Contract + Asset object. AssetLineItem stores the subscription granularity. ContractLineItem stores what was contracted at signing. Assets represent the current state; ContractLineItems represent the committed obligation.
|
| Co-Terming Logic |
✓ Built-in co-term to contract end date setting (SBQQ__CoTermedContractsCombined__c). Amendment quote lines are automatically set to contract end date. Pro-rated billing delta calculated by CPQ Billing or Steelbrick Billing.
|
✓ Term alignment is handled by the Proration Policy and the Asset's EndDate. Amendment Orders carry the pro-rated charge for the remainder of the term. The Proration Engine is configurable at the Order Product level.
|
Subsection Summary — Use Case & Journey
Both platforms share the same logical lifecycle (Order → Contract → Asset/Subscription → Amendment → Updated Contract), but they diverge architecturally. CPQ anchors on the Subscription object and Amendment Quotes, keeping changes inside the CPQ quoting engine. Revenue Cloud anchors on the Asset object and Asset Actions, pushing amendment logic into an Order Management framework. CPQ is more intuitive for sales-led amendment flows; RC is more robust for complex, programmatic, or self-service-driven asset lifecycle management. Migration from CPQ to RC typically requires mapping SBQQ__Subscription__c → AssetLineItem + Asset and re-plumbing amendment triggers.
Licensing Requirements
| Capability | Salesforce CPQ | Revenue Cloud |
|---|---|---|
| Base License |
CPQ License
SteelBrick CPQ / Salesforce CPQ user license required for all CPQ users who create or edit quotes, orders, contracts, and subscriptions. Assigned at the User level via Permission Set.
|
Revenue Cloud Revenue Cloud is sold as part of the Revenue Lifecycle Management (RLM) SKU. The base license enables CPQ, Contracts, Billing, and Asset-Based Ordering. Users need the Revenue Cloud User permission set. |
| Amendment & Renewal |
|
|
| Subscription Management |
CPQ ✓ SBQQ__Subscription__c object and all subscription lifecycle fields (Start/End/TerminatedDate/Status) available with base CPQ license.
|
RC Base ✓ Asset + AssetLineItem lifecycle management. AssetStatePeriod tracks temporal subscription states. Full lifecycle (Active, Pending, Suspended, Cancelled) available in base RC.
|
| Asset-Based Ordering (ABO) | ~ CPQ does not have a formal ABO framework. Amendments are driven through Amendment Quotes — essentially a CPQ quote linked to the existing Contract. There is no standalone "Asset Action" concept. Assets exist as standard SF objects but CPQ does not natively manage them as a lifecycle state machine. | ✓ ABO is core to RC's architecture. The Asset Action framework defines valid transitions on Assets (Add, Change, Renew, Cancel, Swap, Suspend, Resume). Asset state machine is managed by the Order Lifecycle Management engine included in the RC license. |
| Billing Integration for Proration | CPQ Basic proration logic built in. Full billing proration, invoicing, and credit notes require Salesforce Billing (separate license add-on). | RC Base Proration policies and billing rules are included. Revenue Cloud includes the Revenue Lifecycle Management billing capabilities natively without a separate billing add-on for standard use cases. |
| API Access for Contracts |
Full Metadata + REST/SOAP API access to SBQQ__Subscription__c, SBQQ__Contract__c fields, Amendment Quote creation via API using SBQQ.ContractManipulationAPI Apex invocable methods. Requires CPQ license in the API context user.
|
Full REST API access to all RC objects. The Connect API exposes Asset Actions programmatically (/commerce/asset-actions endpoints). Headless amendment flows possible without a UI session. API user must have RC User permission set.
|
Subsection Summary — Licensing
CPQ uses a tiered licensing model where full amendment and renewal automation requires the CPQ+ upgrade. Revenue Cloud bundles all amendment, renewal, and asset lifecycle capabilities into the base RC license — no "+"-tier needed for contract management. For organizations already on CPQ evaluating an upgrade, the key licensing consideration is that RC's ABO framework replaces the need for both CPQ's Subscription Management and the separate Salesforce Billing add-on for most mid-market contract scenarios.
Data Model
Asset Ecosystem — Extended Objects Deep Dive
Polymorphic junction that links an AssetAction to its originating record — an OrderItem, a Work Order Line Item, or an OrderItemDetail. Enables RC to trace every asset change back to the exact source transaction regardless of which path triggered it.
AssetAction, OrderItem, WorkOrderLineItem, OrderItemDetailTracks promotional pricing that was applied at the time the AssetAction was created. Preserves the original promotion context so that billing and revenue recognition can correctly account for discounted periods without altering the base price record.
AssetActionSource; links to promotion/discount contextStores key-value attribute pairs on an AssetStatePeriod — e.g. a product attribute that was active during that state window (color, tier, configuration option). Enables time-accurate attribute history without re-querying the product catalog.
AssetStatePeriod; attribute name + value pairsAssetRateCardEntry links an Asset to a specific Rate Card Entry, binding the asset to a negotiated rate structure. AssetRateAdjustment records any manual or automated adjustment applied on top of the rate card — preserving both the baseline and the actual charged rate.
Defines the usage allowance contracted for an Asset — e.g. 1,000 API calls/month included before overage billing kicks in. Links the Asset to a Usage Commitment / Asset Related Object. Compared against actual usage to determine billable overage.
FulfillmentAsset tracks physical or service delivery fulfillment linked to an Asset (e.g. provisioned hardware, deployed service instance). FulfillmentAssetRelationship defines parent/child hierarchy between fulfillment records. FulfillmentAssetAttribute stores configuration attributes on the fulfillment item.
Asset Relationships & Binding Objects
| Object | Purpose | Key Relationships |
|---|---|---|
AssetRelationship |
Defines peer relationships between Assets (e.g. bundled components, dependent services). Separate from the parent/child hierarchy — models many-to-many asset associations | Lookup to two Asset records + ProductRelationshipType |
ProductRelationshipType |
Enum/picklist-like object that classifies what kind of relationship two assets have (Required, Compatible, Incompatible, etc.) | Lookup from AssetRelationship |
BindingObjectRateAdjustment |
Stores a rate adjustment scoped to a binding object (Account, Contract, or Service Account). Allows negotiated rates to be applied consistently across all assets owned by that binding object | Polymorphic lookup to Account / Contract |
BindingObjectRateCardEntry |
Links a binding object to a specific Rate Card Entry — effectively "pins" a negotiated rate card to an Account or Contract level rather than per-asset | Polymorphic lookup to binding object + RateCardEntry |
BindingObjectUsageResourcePolicy |
Defines usage resource policies (pooling, overage rules, entitlement caps) at the binding object level — supports enterprise usage pools shared across multiple assets under one Account | Lookup to Account / Contract + usage policy definition |
OrderAction |
RC-specific object that records the intent of an Order relative to the Asset — New, Amend, Renew, Cancel, Suspend. Distinct from standard Order Type; used by the RC platform to route Asset delta logic correctly | Lookup to Order; drives AssetAction creation on activation |
RC Core Objects — Deep Dive
Standard object, RC-augmented. The legal agreement covering one or more Assets. Created automatically on Order activation (if enabled) or manually. Drives renewal scheduling, auto-renewal, and billing policy linkage.
ContractType__c, AutoRenewalDays__c, RenewalTerm, BillingPolicy__cThe Asset is the central RC subscription record — what the customer currently owns. AssetLineItem carries the subscription granularity: term, quantity, pricing, and billing frequency. Both are created on Order activation.
LifecycleStartDate, LifecycleEndDate, CurrentAmount, Status, RootAssetIdA time-series child of Asset. Each change to quantity, price, or status creates a new AssetStatePeriod record — preserving the full audit history without overwriting. The complete subscription timeline lives here.
StartDate, EndDate, Quantity, TotalPrice, Type (New / Amendment / Renewal)Records every lifecycle event applied to an Asset: New, Amendment, Renewal, Cancellation, Suspension. Acts as the event log that drives the creation of AssetStatePeriods. Each Amendment Order activation creates one AssetAction per changed line.
ActionType, EffectiveDate, AssetId, OrderItemIdStandard child of Contract, extended by RC. Represents the contracted obligation for a specific product. Used by Revenue Scheduling for billing and by renewal automation to determine what should be renewed.
Product2Id, Quantity, UnitPrice, StartDate, EndDate, AssetId
Each lifecycle change creates a new Order with Type = Amendment or Type = Renewal. The Amendment Order's OrderItems carry OriginalOrderItemId — the FK back to the original purchase — enabling delta Asset updates without full record replacement.
Order.Type, OrderItem.OriginalOrderItemId, OrderItem.AssetIdWhen Are RC Contract Objects Created?
| Object | Created When | Created By | Notes |
|---|---|---|---|
Contract |
Order activation (if auto-contract enabled) or manually | RC platform or rep | One Contract per Order by default; can be configured to consolidate |
ContractLineItem |
Contract creation / activation | RC platform (from OrderItems) | One per OrderItem that maps to a contracted product |
Asset |
Order activation | RC platform | New Order = new Asset; Amendment Order = updates existing Asset |
AssetLineItem |
Order activation | RC platform (from OrderItem) | Carries subscription term and pricing detail for the Asset |
AssetAction |
Every lifecycle event (New, Amendment, Renewal, Cancel) | RC platform | Event log; one per affected Asset per activation |
AssetStatePeriod |
Derived from each AssetAction | RC platform | Time-series record; never overwritten — append-only audit history |
CPQ Contract & Subscription Objects
Revenue Cloud Contract & Asset Objects
| Object / Field | CPQ — Field Detail | Revenue Cloud — Field / Object Detail |
|---|---|---|
| Contract |
Standard Contract with CPQ-added fields:
SBQQ__AmendmentOpportunityStage__c
SBQQ__AmendmentOwner__c
SBQQ__AmendmentPricebookId__c
SBQQ__DefaultRenewalContactRoles__c
SBQQ__DisableAmendmentCoTerm__c
SBQQ__ExpirationDate__c
SBQQ__MasterContract__c
SBQQ__Order__c (orig Order)
SBQQ__PreserveBundleStructure__c
SBQQ__RenewalForecast__c
SBQQ__RenewalOpportunityStage__c
SBQQ__RenewalPricebookId__c
SBQQ__RenewalQuoted__c
SBQQ__RenewedContract__c (lookup)
SBQQ__SubscriptionQuantitiesCombined__c
|
Standard Contract with RC-added fields:
AutoRenewalDays__c
ContractType__c (Subscription, Perpetual)
EndDate / StartDate (standard, used natively)
RenewalTerm / RenewalTermUnit
TotalContractValue__c
Status (Draft, Activated, Expired, etc.)
BillingPolicy__c (lookup to BillingPolicy)
PricingStrategy__c
ContractLineItems linked to Contract (standard child object, extended by RC).
|
| Subscription / Asset Record |
SBQQ__Subscription__c — one per product per contract:
SBQQ__Contract__c (M-D to Contract)
SBQQ__Product__c (lookup)
SBQQ__Quantity__c
SBQQ__RegularPrice__c
SBQQ__CustomerPrice__c
SBQQ__ListPrice__c
SBQQ__StartDate__c
SBQQ__EndDate__c
SBQQ__TerminatedDate__c
SBQQ__OriginalQuoteLine__c
SBQQ__RootId__c (bundle parent)
SBQQ__AmendmentSubscriptionType__c
|
Asset (standard, RC-extended) — the "currently owned" record:
Product2Id (lookup)
AccountId
Quantity
CurrentAmount (current MRR/ACV)
LifecycleStartDate
LifecycleEndDate
Status (Active, Cancelled, Suspended)
AssetProvidedById
RootAssetId (bundle parent)
ProductCode
SerialNumber
Plus AssetLineItem for subscription granularity (term, price, discount).
|
| Amendment Delta Calculation |
CPQ calculates the amendment delta on the Amendment Quote. When a quantity changes from 5 → 8, CPQ creates a new Quote Line for the delta (+3 units) at the prorated price to the contract end date.
ProrationMultiplier = (ContractEndDate - AmendDate) / TermDays
DeltaCharge = (NewQty - OldQty) × UnitPrice × ProrationMultiplier
CPQ manages delta — original subscription lines are NOT modified until the amendment order activates.
|
RC calculates amendment deltas via the Proration Engine at the OrderItem level. The Asset Action generates an Amendment Order. The delta charge (positive or negative) is recorded on the OrderItem with:
OrderItemType = Amendment
OriginalOrderItemId (FK to original OrderItem)
StartDate = AmendmentEffectiveDate
EndDate = ContractEndDate
Quantity = DeltaQty (positive or negative)
UnitPrice = ProratedUnitPrice
RC manages delta — the Asset's current state is updated immediately when the Amendment Order activates.
|
| Renewal Tracking |
SBQQ__RenewedContract__c on the new Contract points back to the original Contract. The Renewal Opportunity and Renewal Quote carry SBQQ__RenewedContract__c references. A chain of renewals creates a linked list of Contract records.
|
The renewed Contract references the prior period via standard PreviousContractId (if used) or via the Asset's LifecycleStartDate / LifecycleEndDate timeline. AssetStatePeriod records form a time-series of every state the asset passed through, providing full audit history without a separate "renewed contract" chain.
|
| Bundle / Parent-Child Relationships |
SBQQ__Subscription__c.SBQQ__RootId__c and SBQQ__RequiredBySubscription__c preserve bundle hierarchy in the contract. When amending, CPQ attempts to preserve the bundle structure via SBQQ__PreserveBundleStructure__c on the Contract.
|
Asset.RootAssetId and Asset.ParentId preserve bundle hierarchy. Amendment Orders propagate changes to child assets automatically when the root asset is amended. The hierarchy is also reflected in AssetLineItem.ParentAssetLineItemId.
|
| Order-to-Contract Linkage |
Contract.SBQQ__Order__c (lookup to originating Order). SBQQ__Subscription__c.SBQQ__OrderProduct__c links each subscription back to its source OrderProduct. Amendment Orders are linked via SBQQ__AmendedContract__c.
|
Asset.PurchaseDate + Asset.InstallDate track lifecycle events. OrderItem.AssetId links each OrderItem to the resulting Asset. The Amendment Order's OrderItem.OriginalOrderItemId traces back to the original purchase OrderItem.
|
Migration Mapping Note for Architects
When migrating from CPQ to Revenue Cloud, each SBQQ__Subscription__c record maps to a combination of Asset + AssetLineItem. The key field mappings are:
SBQQ__Subscription__c.SBQQ__Product__c→Asset.Product2IdSBQQ__Subscription__c.SBQQ__Quantity__c→Asset.QuantitySBQQ__Subscription__c.SBQQ__CustomerPrice__c→Asset.CurrentAmount(per unit)SBQQ__Subscription__c.SBQQ__StartDate__c / EndDate__c→Asset.LifecycleStartDate / LifecycleEndDateSBQQ__Subscription__c.SBQQ__TerminatedDate__c→Asset.Status = 'Cancelled'+ finalAssetStatePeriodrecord
Subsection Summary — Data Model
CPQ's data model centers on the custom SBQQ__Subscription__c object as the authoritative subscription record — it is a point-in-time snapshot updated by each amendment. Revenue Cloud's model centers on the standard Asset object with AssetStatePeriod time-series history — it maintains a full temporal audit trail without overwriting records. RC's approach is more suitable for complex billing, revenue recognition, and compliance scenarios; CPQ's approach is simpler to query and report on for sales-centric use cases.
Automations
| Automation | CPQ — Mechanism & Detail | Revenue Cloud — Mechanism & Detail |
|---|---|---|
| Contract Creation from Order |
CPQ Trigger
When an Order is activated (Status = 'Activated'), the CPQ managed package Apex trigger (SBQQ.OrderTrigger) automatically creates a Contract record if SBQQ__Contracted__c = true is set on the Order. Subscriptions are created simultaneously for all OrderItem records with subscription products.
// CPQ auto-contraction setting
Order.SBQQ__Contracted__c = true → triggers:
1. Contract creation
2. SBQQ__Subscription__c per OrderProduct
3. Contract.Status = 'Activated'
|
Order Lifecycle Flow
RC uses the Order Lifecycle Management framework. When an Order transitions to Activated status, a Flow (or configurable lifecycle trigger) generates:
|
| Subscription / Asset Creation |
CPQ Managed Apex Subscriptions auto-created by the CPQ ContractManipulationAPI during contract creation. Fields populated from OrderItem fields. No custom code needed for standard scenarios.
|
Order Mgmt Framework Assets and AssetLineItems created via the Order Lifecycle orchestration. The Asset Creation invocable action can be called from Flow or Apex.
|
| Amendment Quote / Order Auto-Population |
CPQ Amendment Button
The Amend button on the Contract record triggers CPQ's ContractManipulationAPI.amend() method which:
1. Creates a new Quote (Type = 'Amendment')
2. Copies all active Subscriptions as Quote Lines
(original price, qty, dates pre-populated)
3. Sets Quote.SBQQ__MasterContract__c = Contract.Id
4. Sets Quote.SBQQ__StartDate__c = AmendmentEffectiveDate
5. User modifies lines → re-prices delta → Order
All original subscription data is pre-loaded; user only changes the delta.
|
Asset Action Framework
User (or API) initiates an Asset Action on an Asset record. RC automatically:
1. Validates the action against allowed transitions
(e.g., Active → Amend is allowed)
2. Generates an Amendment Order with:
- OrderType = 'Amendment'
- OriginalOrderId FK
- OrderItems for each changed asset
3. Calculates proration on OrderItems
4. Routes Order through approval / activation flow
No separate "quote" step required for amendments — goes directly to Order.
|
| Proration Calculation |
CPQ Engine Proration is calculated by CPQ's pricing engine during quote calculation. The proration multiplier is:
Days Remaining / Total Contract Days × UnitPrice × DeltaQty
Settings: SBQQ__ProrationDayCount__c (365 or 360), SBQQ__DisableAmendmentCoTerm__c on Contract. Advanced proration (partial months, daily billing) requires Salesforce Billing.
|
Proration Policy RC has a configurable Proration Policy object:
|
| Renewal Opportunity Auto-Generation |
CPQ+
CPQ+ has a Renewal Forecast feature. A scheduled batch job (SBQQ.RenewalService) runs periodically and auto-creates Renewal Opportunities N days before Contract expiration (configurable). The Renewal Quote is pre-populated from existing subscriptions.
SBQQ__Quote__c.SBQQ__Type__c = 'Renewal'
SBQQ__Quote__c.SBQQ__RenewedContract__c = Contract.Id
// Subscription lines copied to Quote Lines
// Renewal pricing applied per settings
|
Flow / Auto-Renewal
RC supports Auto-Renewal via:
|
| Auto-Cancel / Termination |
CPQ Cancel is performed by creating an Amendment Quote and setting subscription quantities to 0 or setting SBQQ__TerminatedDate__c directly via Apex/Flow. No out-of-box automatic cancellation flow — typically handled by custom Apex or Process Builder / Flow triggered on a date field.
|
Asset Action Cancel is a first-class Asset Action. The Cancel action:
|
| Lifecycle State Transitions (Suspend/Resume) |
✗ CPQ has no native Suspend/Resume concept. Custom implementation required — typically a custom field on SBQQ__Subscription__c and a billing pause on the Salesforce Billing side.
|
✓ Native Suspend and Resume Asset Actions. When an asset is suspended:
|
Subsection Summary — Automations
CPQ's automation model is quote-centric: every amendment or renewal flows through a Quote, which provides a review/approval checkpoint but adds process steps. Revenue Cloud's automation model is action-centric: Asset Actions generate Orders directly, enabling faster programmatic amendments — ideal for self-service portals and high-volume subscription changes. CPQ's renewal automation (CPQ+ batch job) is mature and field-proven; RC's renewal automation is more configurable but requires careful Flow orchestration. Both platforms require custom automation for complex business rules (e.g., prorated credits with approval thresholds, multi-asset bundle amendments).
Configuration (Architect Setup Level)
Effort Rating Scale
Ratings reflect Salesforce-architect effort to configure from a clean org. Low = 1–4 hrs, clicks only. Medium = 1–2 days, config + some Flow/formula. High = 3+ days, Apex/complex Flow/package settings.
| Configuration Task | CPQ Setup | Revenue Cloud Setup |
|---|---|---|
| Subscription / Contract Settings |
Low Effort
Navigate to CPQ Settings → Subscriptions tab:
|
Medium Effort
RC contract behavior is configured via:
|
| Proration Policy Setup |
Low Effort
Configured entirely in CPQ Settings. Two settings control most scenarios:
|
Medium Effort
RC has a dedicated Proration Policy object (Setup → Proration Policies):
|
| Asset Action Setup | ✗ No equivalent in CPQ. Amendments are initiated via the Amend button (standard CPQ behavior, no separate action configuration needed beyond enabling the button). |
Medium Effort
Asset Actions must be explicitly configured:
|
| Renewal Settings |
Low Effort (base) / Medium (CPQ+)
|
Medium Effort
|
| Amendment Quote Settings |
Low Effort
|
Medium Effort
Amendment behavior in RC is configured at multiple levels:
|
| Order Lifecycle Configuration | Low Effort CPQ Order lifecycle is mostly handled by the managed package. Custom Order Record Types or statuses require Medium effort. The key setting is enabling "Order" in CPQ Settings and mapping Order Products to Subscription behavior. |
High Effort
RC's Order Lifecycle Management is powerful but complex to configure:
|
Subsection Summary — Configuration
CPQ wins on configuration simplicity for standard amendment and renewal scenarios — the CPQ Settings UI provides a centralized, wizard-like configuration experience with sane defaults. Revenue Cloud requires more upfront architectural decisions (Asset Action types, Proration Policies, Order Lifecycle Flows) but rewards that effort with greater flexibility for complex or non-standard amendment scenarios. Budget 2–3x more setup time for RC compared to CPQ for an equivalent standard amendment/renewal configuration; however, RC can implement scenarios that would require custom Apex in CPQ (e.g., Suspend/Resume, Swap, programmatic self-service amendments) with pure configuration.
Customization (Common Additions)
| Customization Pattern | CPQ — Approach & Example | Revenue Cloud — Approach & Example |
|---|---|---|
| Custom Renewal / Amendment Logic |
Apex + Invocable
Common patterns:
// Example: Custom amendment logic via CPQ Plugin
global class MyAmendmentPlugin implements SBQQ.ContractAmendmentPlugin {
global void onAmendmentSaved(
SBQQ__Quote__c quote,
List<SBQQ__QuoteLine__c> lines) {
// Custom business logic here
}
}
|
Flow + Apex
Common patterns:
// Example: Custom Asset Action eligibility check (Apex)
public class AssetAmendEligibility implements AssetActionEligibility {
public Boolean isEligible(Asset a, String actionType) {
// Check custom business rules
return a.Status == 'Active' && a.CustomEligible__c;
}
}
|
| Custom Subscription Management UIs |
LWC + Apex
CPQ's amendment UI is the standard Quote line editor. Custom UIs are common for:
|
LWC + Connect API
RC offers richer UI extension points:
|
| Mid-Term Change Calculators |
Apex + Formula
CPQ's pricing engine handles standard proration, but custom calculators are common for:
|
Proration Policy Override + Apex
RC's Proration Engine is more extensible:
|
| CPQ-to-RC Migration Bridging |
Migration Pattern
Common migration bridging patterns from CPQ side:
|
Migration Pattern
Common migration bridging patterns from RC side:
|
| Complex Proration Overrides |
High Effort Apex Plugin
CPQ's proration is hardcoded in the managed package for the standard formula. Complex overrides require:
|
Medium Effort Policy + Flow
RC's Proration Policy framework is designed for extension:
|
| Approval Integration on Amendments |
Medium Effort
Amendment approvals in CPQ flow through the standard Salesforce Approval Process or Advanced Approvals (separate add-on). The Amendment Quote triggers the approval; approval criteria can reference Quote and Quote Line fields (discount %, term change, etc.). Common pattern: SBQQ__Quote__c.SBQQ__Type__c = 'Amendment' as entry criteria.
|
Medium Effort
RC integrates approvals at the Amendment Order level. Options:
|
Architect Advisory — Common Pitfalls
- CPQ: The CPQ managed package's Apex triggers run synchronously on Order activation. Heavy customization in
SBQQ.AmendmentSaveror post-contract-creation triggers can hit CPU/SOQL limits on large contracts (100+ subscription lines). Use async Apex (Queueable/Batch) for post-processing. - CPQ: Amending a contract with CPQ+ while the original order was created without CPQ can break subscription linkages. Always ensure the original order's
SBQQ__Contracted__cflag was set correctly. - RC: Asset Actions are validated against a state machine. If a product is not configured with the correct Asset Action eligibility, the action will silently fail or throw a platform error. Always test each Asset Action type against each product type in a scratch org before production deployment.
- RC: The Order Lifecycle Flow is a single Autolaunched Flow per Order Record Type. Errors inside the Flow will roll back the entire Order activation. Implement robust fault paths and consider splitting complex logic into sub-flows.
- Migration: CPQ subscriptions with
SBQQ__TerminatedDate__cin the past represent cancelled subscriptions — do not migrate these as Active Assets in RC. Load them asStatus = 'Cancelled'Assets with the correct AssetStatePeriod end record.
Subsection Summary — Customization
CPQ customization leans heavily on Apex plugin interfaces (SBQQ.QuoteCalculatorPlugin, SBQQ.ContractAmendmentPlugin) and VF/LWC overrides to extend managed-package behavior. Revenue Cloud customization uses Flow-first patterns with Apex escape hatches — the platform encourages declarative configuration via Asset Actions, Proration Policies, and Order Lifecycle Flows before resorting to Apex. RC's Connect API enables use cases (headless amendments, third-party portals) that CPQ cannot support without heavy custom development. Organizations on the CPQ-to-RC migration path should plan for a 6–12 month parallel-run period to validate amendment and billing continuity before full cutover.
- Sales-led amendment processes (rep drives the change via Quote)
- Mid-market orgs with straightforward subscription products
- Teams already on CPQ needing renewal automation (CPQ+)
- Scenarios where every change needs Quote-level review/approval
- Simpler data model — SBQQ__Subscription__c is easy to report on
- Faster initial setup for standard amendment scenarios
- High-volume, programmatic, or self-service amendment scenarios
- Complex subscription lifecycles (Suspend, Resume, Swap, Transfer)
- Full audit trail of asset state history (compliance-heavy industries)
- Integration with Experience Cloud self-service portals
- Organizations needing a unified billing + amendment engine
- Future-state architecture: RC is Salesforce's strategic investment