name: revenue-recognition-requirements description: "Use this skill to configure and troubleshoot Salesforce Billing revenue recognition rules, schedules, and GL transaction generation in compliance with ASC 606. Triggers: 'revenue schedule not generated after order activation', 'blng__RevenueSchedule__c records missing', 'how to configure blng__RevenueRecognitionRule__c on a product', 'Finance Periods not set up before revenue schedule generation', 'revenue schedule did not update after contract amendment', 'performance obligation allocation for bundled products', 'distribution method for revenue spread', 'ASC 606 implementation in Salesforce Billing'. NOT for billing schedule setup (see billing-schedule-setup skill), NOT for standard Salesforce CPQ quoting, NOT for OpportunityLineItem native Revenue Schedules (standard platform feature unrelated to Salesforce Billing), NOT for Salesforce Revenue Cloud (Revenue Lifecycle Management)." category: admin salesforce-version: "Spring '25+" well-architected-pillars:
- Reliability
- Operational Excellence
- Security triggers:
- "revenue schedule records are not generated after activating the order in Salesforce Billing"
- "blng__RevenueSchedule__c records missing or show wrong amounts after order activation"
- "how do I set up ASC 606 compliant revenue recognition rules in Salesforce Billing"
- "Finance Periods must be configured before revenue schedules can be generated"
- "revenue schedule did not update after amending the contract or order"
- "how to configure performance obligation allocation across bundled products"
- "which revenue distribution method should I use for a SaaS annual subscription" tags:
- revenue-recognition-requirements
- salesforce-billing
- blng-namespace
- asc-606
- revenue-schedule
- revenue-recognition-rule
- finance-periods
- revenue-transaction
- gl-events
- performance-obligation
- distribution-method inputs:
- "Salesforce org with Salesforce Billing managed package (blng__ namespace) installed on top of Salesforce CPQ"
- "Activated or draft Order with OrderProducts sourced from a CPQ Quote"
- "Product2 records requiring blng__RevenueRecognitionRule__c lookup configuration"
- "Finance Periods configured in Salesforce Billing setup (hard prerequisite)"
- "Determination of revenue recognition treatment: immediate, straight-line, event-based, or custom"
- "Clarification of whether bundled products require separate performance obligation allocation"
- "GL account mapping requirements for blng__RevenueTransaction__c records" outputs:
- "Configured blng__RevenueRecognitionRule__c records on Product2 with correct treatment and distribution method"
- "blng__RevenueSchedule__c records auto-generated per OrderProduct at Order activation"
- "blng__RevenueTransaction__c GL event records representing earned and deferred revenue movements"
- "Finance Period configuration verified before schedule generation"
- "Decision guidance on distribution method selection and amendment handling"
- "Checklist confirming ASC 606 compliance requirements are met in configuration" dependencies: [] version: 1.0.0 author: Pranav Nagrecha updated: 2026-04-28
Revenue Recognition Requirements
This skill activates when a practitioner needs to configure Salesforce Billing revenue recognition rules, schedules, and GL transaction generation for ASC 606 compliance — from Finance Period setup through blng__RevenueTransaction__c posting and amendment handling.
Before Starting
Gather this context before working on anything in this domain:
- Confirm the Salesforce Billing managed package (namespace prefix
blng__) is installed. Revenue recognition objects live entirely within this managed package — they do not exist in standard Salesforce or CPQ alone. - Confirm Finance Periods are configured in Salesforce Billing setup. Finance Periods are a hard prerequisite: the Billing engine cannot generate
blng__RevenueSchedule__crecords if no Finance Periods exist that overlap the Order's service date range. - Identify the required recognition treatment for each product: Immediate Recognition, Straight-Line (rateable), Event-Based, or a custom distribution schedule.
- Know whether products are sold as bundles that require separate performance obligation allocation under ASC 606 rules — bundle components may need individual
blng__RevenueRecognitionRule__crecords. - Confirm the GL account mapping requirements —
blng__RevenueTransaction__crecords feed downstream ERP integrations and must carry the correct GL account codes.
Core Concepts
Object Chain: Rule → Schedule → Transaction
Salesforce Billing implements ASC 606 through a three-level object chain. All three objects live in the blng__ namespace:
blng__RevenueRecognitionRule__c (configured on Product2)
↓ (triggers at Order activation)
blng__RevenueSchedule__c (one per OrderProduct; holds the recognition schedule)
↓ (generated as Finance Periods close or revenue events fire)
blng__RevenueTransaction__c (individual GL events: earned revenue and deferred revenue movements)
blng__RevenueRecognitionRule__c is the configuration object. It is set as a lookup on the Product2 record and defines the recognition treatment (how revenue is spread) and the distribution method (what period boundaries drive the spread). It does not hold amounts — amounts are computed at schedule generation time.
blng__RevenueSchedule__c is the computed schedule. One record is created per OrderProduct when the Order is activated. It holds the total contract value to be recognized and the breakdown of that value across Finance Periods. Unlike billing schedules, revenue schedules use Finance Periods — not calendar months — as their period boundary.
blng__RevenueTransaction__c represents individual GL events. Each transaction record marks a movement of revenue from deferred to earned status, or a reversal. These are the records that feed ERP and GL integrations. They are generated when a Finance Period closes or when a revenue event triggers recognition.
Finance Periods: Hard Prerequisite for Schedule Generation
Finance Periods (blng__FinancePeriod__c) define the accounting calendar used by the revenue recognition engine. They must be created and activated in Salesforce Billing setup before any blng__RevenueSchedule__c records can be generated.
The revenue engine calculates how revenue is distributed across Finance Periods. If no Finance Periods exist that overlap an Order's service dates, the engine cannot allocate revenue and the schedule record is not created — with no error surfaced to the end user. This is a silent failure.
Finance Periods do not auto-generate. An admin must explicitly create them for all periods that will have active revenue schedules, including future periods for multi-year subscriptions.
Revenue Distribution Methods
The blng__DistributionMethod__c field on blng__RevenueRecognitionRule__c controls how contract revenue is spread across Finance Periods. Salesforce Billing supports:
| Distribution Method | Behavior |
|---|---|
| Daily Proration | Revenue allocated proportionally to the number of days in each Finance Period that overlap the service date range |
| Equal Distribution | Revenue divided equally across all Finance Periods in the service range, regardless of period length |
| Percent Distribution | Admin defines a custom percentage per period on the rule |
| Single Period | Full amount recognized in one Finance Period (immediate recognition) |
For SaaS annual subscriptions, Daily Proration is the most common choice because it correctly handles partial-month periods at subscription start and end.
Revenue Recognition Treatments
The blng__RecognitionTreatment__c field on blng__RevenueRecognitionRule__c defines the trigger for recognition:
| Treatment | Behavior |
|---|---|
| Immediate | Revenue is recognized at Order activation. Used for one-time products delivered at point of sale. |
| Rateable | Revenue is spread ratably over the service period. The most common treatment for subscription SaaS products (ASC 606 §606-10-25-27 performance obligation satisfied over time). |
| Event-Based | Revenue is recognized when a specified event occurs (e.g., delivery confirmation, milestone completion). Requires an event record to trigger the recognition. |
| Custom | Admin-defined schedule; rarely used. |
Contract Amendments Do Not Auto-Update Revenue Schedules
When a contract is amended (Order amendment or replacement order in CPQ Billing), the existing blng__RevenueSchedule__c record is not automatically updated. The revenue engine does not re-compute previously generated schedules. The practitioner must:
- Cancel or close the existing revenue schedule manually.
- Ensure the amendment order generates a new
blng__RevenueSchedule__cfor the amended terms. - Reconcile any periods already recognized under the old schedule.
This is a critical difference from billing schedules, which handle amendments through a separate amendment order product. Revenue schedules require explicit manual intervention to align with amended contract values.
Performance Obligation Allocation for Bundles
Under ASC 606, bundled products that contain multiple distinct performance obligations must have revenue allocated to each obligation based on standalone selling price (SSP). In Salesforce Billing:
- Each bundle component Product2 that is a distinct performance obligation should have its own
blng__RevenueRecognitionRule__c. - The
blng__StandaloneSellingPrice__cfield on the bundle component drives the allocation ratio. - If SSP fields are not populated, the Billing engine defaults to allocating revenue based on the list price ratio, which may not comply with ASC 606 SSP requirements.
Common Patterns
Pattern 1: SaaS Annual Subscription — Monthly Revenue Spread
When to use: A SaaS product is sold as a 12-month subscription. Revenue must be recognized ratably month by month, not at invoice date.
How it works:
- Create a
blng__RevenueRecognitionRule__cwithblng__RecognitionTreatment__c = Rateableandblng__DistributionMethod__c = Daily Proration. - Set the rule as the
blng__RevenueRecognitionRule__clookup on the Product2 record. - Confirm Finance Periods exist for all 12 months of the subscription service period.
- Activate the Order — one
blng__RevenueSchedule__cis created per OrderProduct, pre-calculated across each Finance Period. - As each Finance Period closes,
blng__RevenueTransaction__cGL event records are generated for the earned portion.
Why not the alternative: Using Immediate recognition for a 12-month subscription recognizes the full contract value at activation. This violates ASC 606 §606-10-25-27 (performance obligation satisfied over time) and misstates deferred revenue on the balance sheet.
Pattern 2: Amendment Requires Manual Revenue Schedule Reconciliation
When to use: A customer upgrades a subscription mid-term (e.g., adds seats at month 6 of a 12-month contract). The existing revenue schedule must be reconciled against the amended terms.
How it works:
- The CPQ amendment order creates a new OrderProduct representing the uplift.
- At activation of the amendment order, a new
blng__RevenueSchedule__cis created for the uplift delta only. - The original
blng__RevenueSchedule__cis NOT modified — it continues to recognize revenue based on the original contract value. - Finance team must confirm whether the two schedules produce the correct cumulative GL entries. In some cases, the original schedule must be manually closed and a net-new schedule created for the full amended value.
Why not the alternative: Attempting to edit blng__RevenueSchedule__c records directly corrupts the recognition timeline and produces double-counting in GL entries. The object is system-managed — treat it as read-only after generation.
Decision Guidance
| Situation | Recommended Approach | Reason |
|---|---|---|
| SaaS subscription, recognize ratably | Rateable treatment + Daily Proration distribution | Compliant with ASC 606 over-time recognition; handles partial months correctly |
| One-time product delivered at sale | Immediate treatment + Single Period distribution | Full amount earned at point of sale; no deferred revenue balance required |
| Professional services, milestone-based | Event-Based treatment | Ties recognition to delivery event, not calendar; supports ASC 606 point-in-time obligation |
| Bundle with distinct performance obligations | Separate blng__RevenueRecognitionRule__c per component with SSP allocation | ASC 606 requires SSP-based allocation across distinct obligations |
| Mid-term amendment (upgrade/downgrade) | Generate new schedule for delta; manually close and reconcile original if needed | Revenue engine does not auto-update existing schedules; manual reconciliation required |
| Finance Periods missing for service dates | Create Finance Periods first; then re-trigger schedule generation | Silent failure: schedules do not generate without Finance Periods covering the date range |
Recommended Workflow
Step-by-step instructions for an AI agent or practitioner working on this task:
- Verify Finance Period prerequisites — Navigate to Salesforce Billing setup and confirm that Finance Periods (
blng__FinancePeriod__c) exist and are Active for all calendar periods that overlap the Order's service date range. Create missing Finance Periods before proceeding. Without this step, revenue schedule generation silently fails. - Configure blng__RevenueRecognitionRule__c on Product2 — Create or confirm the Revenue Recognition Rule with the correct
blng__RecognitionTreatment__c(Rateable, Immediate, Event-Based) andblng__DistributionMethod__c(Daily Proration, Equal Distribution, Single Period). Assign the rule to theblng__RevenueRecognitionRule__clookup on each in-scope Product2 record. - For bundles, configure SSP allocation — For each bundle component Product2 that is a distinct ASC 606 performance obligation, set
blng__StandaloneSellingPrice__c. Confirm the allocation ratios sum correctly across all components. - Activate the Order — Change Order Status to Activated. Confirm that
blng__RevenueSchedule__crecords are created — one per OrderProduct with a Revenue Recognition Rule. If records are missing, verify Finance Period coverage and the Product2 rule lookup. - Validate revenue schedule line distribution — Open each
blng__RevenueSchedule__crecord and review the child line records. Confirm amounts are distributed correctly across Finance Periods with expected proration logic. - Confirm blng__RevenueTransaction__c GL event generation — After Finance Periods close (or event-based triggers fire), confirm that
blng__RevenueTransaction__crecords are created with the correct GL account codes, amounts, and period references. These feed downstream ERP integrations. - For amendments: reconcile manually — If an Order amendment changes contract value, confirm the amendment order generates a new
blng__RevenueSchedule__cfor the delta. Coordinate with Finance on whether the original schedule requires manual closure and replacement. Document the reconciliation in the Finance Period notes.
Review Checklist
Run through these before marking work in this area complete:
- Finance Periods exist and are Active for all service date periods covered by the Order
- Every in-scope Product2 has
blng__RevenueRecognitionRule__clookup populated with the correct rule - Recognition treatment (Rateable/Immediate/Event-Based) matches the ASC 606 performance obligation type for each product
- Distribution method matches contract and Finance reporting requirements (Daily Proration for partial-month accuracy)
- For bundles:
blng__StandaloneSellingPrice__cis set on each distinct performance obligation component -
blng__RevenueSchedule__crecords were auto-generated at Order activation (not manually created) - Revenue schedule line amounts sum to the correct total contract value
-
blng__RevenueTransaction__cGL events carry correct GL account codes for the downstream ERP integration - For amendments: original revenue schedule has been reviewed; manual reconciliation was performed if contract value changed
Salesforce-Specific Gotchas
Non-obvious platform behaviors that cause real production problems:
- Finance Periods are a silent hard prerequisite — If Finance Periods do not exist for the Order's service date range,
blng__RevenueSchedule__crecords are not generated when the Order activates. No error is thrown, no warning appears — the system simply skips schedule creation. Always verify Finance Periods before activating Orders or debugging "missing revenue schedule" issues. - Revenue schedules do not auto-update on contract amendment — Unlike CRM contract fields that update when an amendment record is saved,
blng__RevenueSchedule__crecords are immutable after generation. An amendment order generates a new delta schedule; it does not revise the original. Finance teams that expect the original schedule to reflect the amended contract value will find a persistent discrepancy until the original is manually reconciled. - blng__RevenueSchedule__c and OpportunityLineItem Revenue Schedules are completely different objects — Standard Salesforce allows "Revenue Schedules" to be enabled in Setup > Products > Schedule Settings, which populates the
Revenue Schedulesrelated list on OpportunityLineItems. This is a standard CRM feature for splitting opportunity revenue across periods for forecasting. It has no relationship toblng__RevenueSchedule__c, does not interact with the Salesforce Billing engine, and does not generate GL transactions. Enabling or populating standard Revenue Schedules has zero effect on Salesforce Billing recognition behavior. - SSP defaults to list price ratio if unset — For bundle products, if
blng__StandaloneSellingPrice__cis not populated on bundle components, the engine allocates revenue using list price ratios. List price ratios may not equal the SSP ratios required by ASC 606, creating an audit finding. This mismatch is not flagged by the platform. - blng__RevenueTransaction__c records are system-created; manual edits corrupt GL integrity — Revenue Transaction records are created by the Billing engine as Finance Periods close. Direct edits via data loader or Apex bypass the engine's internal consistency checks and can produce GL balances that do not reconcile to the revenue schedule totals. Treat these records as read-only.
Output Artifacts
| Artifact | Description |
|---|---|
blng__RevenueRecognitionRule__c record | Configuration record defining treatment and distribution method; set on Product2 |
blng__RevenueSchedule__c records | Auto-generated at Order activation; one per OrderProduct; holds recognition timeline |
blng__RevenueTransaction__c records | GL event records generated as Finance Periods close; feed ERP integrations |
Finance Period records (blng__FinancePeriod__c) | Accounting calendar prerequisite; must exist before schedules can generate |
Related Skills
admin/billing-schedule-setup— Configure billing schedules and invoice runs (separate from revenue recognition; both may apply to the same product)admin/cpq-order-management— Understand how CPQ Quote-to-Order flow creates OrderProducts that drive both billing and revenue schedule generation