# ASC 606 in DualEntry

DualEntry implements the five-step ASC 606 revenue recognition model as a structured workflow. Each step maps directly to a field or action in the contract data model, so the standard's requirements are enforced by the system rather than tracked in spreadsheets.

## Step 1: Identify the contract

In DualEntry, you create a contract record to represent your arrangement with a customer. You can create contracts manually in the UI, through the API at `/public/v2/contracts/`, or automatically from a [Stripe subscription sync](/accountants/revenue-recognition/stripe-revenue-sync).

A contract requires a customer, a start date, and a status. New contracts begin in **draft** status, where you configure their terms before activation. Contracts also support an end date, billing frequency, and currency. The contract record is the top-level unit of accounting for revenue recognition - all obligations, schedules, and journal entries trace back to it.

DualEntry enforces that every contract has at least one performance obligation before you can activate it. This structural requirement ensures the five-step model begins with a complete arrangement rather than an empty shell. You can view all contracts and their current statuses from the contract list view or through the API at `/public/v2/contracts/`.

## Step 2: Identify performance obligations

Each line on the contract is a performance obligation representing a distinct good or service you have promised. You specify the item (the product or service being delivered), the quantity, the unit rate, and the recognition strategy. DualEntry treats each obligation as a distinct unit of accounting.

When you add an obligation, you also set its standalone selling price, billing group, and any obligation-level conditions. If a contract bundles multiple deliverables - for example, a software license and an implementation service - each is its own obligation with its own recognition schedule.

The distinction between obligations matters for allocation and recognition timing. A twelve-month license recognized straight-line and a one-time implementation recognized at milestone completion produce different revenue patterns even though they belong to the same contract. You define this separation at the obligation level so DualEntry can handle each stream independently.

## Step 3: Determine the transaction price

The transaction price is the total consideration you expect to receive from the contract. DualEntry calculates this automatically as the sum of all obligation line amounts - quantity multiplied by unit rate for each obligation.

When the terms of a contract change after activation, DualEntry supports variable consideration through [change orders](/accountants/revenue-recognition/change-orders-terminations-renewals). A change order adjusts the transaction price by adding, removing, or modifying obligations. DualEntry then applies the appropriate modification treatment under ASC 606.

The transaction price does not include amounts allocated to obligations on other contracts. Each contract maintains its own price independently. If you need to link related contracts - for example, a master agreement and a statement of work - you can use contract grouping, but allocation still operates at the individual contract level.

## Step 4: Allocate to performance obligations

DualEntry allocates the transaction price to each obligation based on standalone selling price (SSP). You set the SSP per item in your item records. When the total contract price differs from the sum of the individual SSPs, DualEntry allocates proportionally so that each obligation receives its relative share of the transaction price.

For example, if a contract totals $90,000 and the two obligations have SSPs of $60,000 and $40,000, DualEntry allocates $54,000 and $36,000 respectively. The allocated amount - not the listed line amount - determines how much revenue DualEntry recognizes for each obligation. For full details on SSP configuration, the allocation formula, and the residual method, see [Allocations and SSP](/accountants/revenue-recognition/allocations-and-ssp).

## Step 5: Recognize revenue

Revenue is recognized per each obligation's strategy over the generated recognition schedule. DualEntry generates the schedule when the contract is activated and creates journal entries automatically at each recognition cadence (daily, weekly, monthly, quarterly, semi-annually, or annually).

Available strategies include straight-line, daily pro-rata, milestone, usage-based, immediate, and deposit release. You assign the strategy per obligation, so a single contract can mix approaches. The recognition start date and cadence can differ from the billing start date - billing and recognition are independent schedules.

You can review the resulting entries in the [revenue waterfall and deferred revenue schedule](/accountants/revenue-recognition/reporting). Each journal entry links back to its source obligation, making it straightforward to trace recognized amounts to the underlying arrangement.

Revenue recognition begins only when the contract status is **active**. Contracts in draft status do not generate recognition entries, even if their start date has passed.

## Accumulated revenue on legacy contracts

When you cut over an in-flight contract from a legacy system into DualEntry, enter the amount of revenue already recognized before the cutover date as **accumulated revenue**. DualEntry uses this amount as the contract's opening recognized revenue balance.

Accumulated revenue preserves the historical revenue position without creating duplicate journal entries for periods before DualEntry managed the contract. After activation, DualEntry schedules and posts only the remaining revenue according to the contract's obligations, allocation, and recognition strategy.

Use accumulated revenue only for revenue that was already recognized in the legacy system. Deferred revenue, contract assets, and other opening balance sheet positions should be reconciled through your cutover balances and reviewed in the [revenue waterfall and deferred revenue schedule](/accountants/revenue-recognition/reporting).

## The contract lifecycle

Contracts move through five statuses that govern when recognition occurs and what actions are available.

- **Draft** - the contract is being configured. No recognition occurs.
- **Active** - the contract is live. DualEntry generates recognition schedules and journal entries.
- **Completed** - all obligations are satisfied and all revenue is recognized.
- **Terminated** - the contract ended before its original completion date. Recognition stops or adjusts according to the termination terms.
- **Archived** - the contract is retained for historical reference but is no longer active.


Transitions between statuses are logged in the [audit trail](/accountants/platform-configuration/audit-trail-and-compliance). You can also filter contracts by status in the contract list view and through the API. Moving a contract from draft to active triggers the allocation and schedule generation pipeline described in the next section. Moving a contract to completed, terminated, or archived does not reverse previously recognized revenue - those entries remain in the ledger.

## How the steps connect

The five steps form a pipeline rather than isolated actions. When you activate a contract, DualEntry runs Steps 3 through 5 in sequence: it calculates the transaction price, allocates across obligations by SSP, and builds the recognition schedule.

If a [change order](/accountants/revenue-recognition/change-orders-terminations-renewals) modifies the contract later, DualEntry reruns allocation and adjusts the schedule accordingly. The same pipeline applies - updated price, updated allocation, updated schedule - so the five-step model stays consistent through the contract's lifetime.

For reporting on recognized and deferred revenue, contract assets, and auditor schedules, see [Reporting](/accountants/revenue-recognition/reporting). For the billing side of contracts, see [Subscription Billing](/accountants/platform-configuration/subscription-billing).