> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dualentry.com/llms.txt
> Use this file to discover all available pages before exploring further.

# How to Create a Revenue Contract

> Create a revenue contract: enter terms, price performance obligations, set invoicing and recognition, then review the preview before you save.

Create a revenue recognition contract in five steps: **Contract Terms**, **Performance Obligations**, **Invoicing**, **Recognition**, and **Preview**. After you finish, the contract exists as a draft you can return to, or as an active contract (or one waiting for approval) with allocations, invoices, and recognition ready to review.

## Prerequisites

Before you create a contract, confirm the following:

* Revenue recognition is enabled for your organization.
* Your role can create contracts on **Accounting > Revenue Recognition > Contracts**.
* The customer record already exists, and the [item](https://docs.dualentry.com/accountants/core-financials/general-ledger/create-and-manage-items.md) for each obligation already exists. DualEntry fills the obligation **SSP** from that item's List Price in the contract currency, so set List Prices at standalone selling price before you start.
* You know the commercial term, whether you will enter a term total or a per-period rate, and the recognition method for each deliverable.

For the accounting model the form encodes, see [ASC 606 and IFRS 15 in DualEntry](https://docs.dualentry.com/accountants/revenue-recognition/asc-606.md). You can also create contracts through the API at `/public/v2/contracts/` or from a [Stripe subscription sync](https://docs.dualentry.com/accountants/revenue-recognition/stripe-revenue-sync.md). Those paths skip this form; use this page for the in-app wizard.

## Enter contract terms

The **Contract Terms** step identifies the arrangement: who the contract is with, which company holds it, and the dates DualEntry uses for billing and recognition.

1. Go to **Accounting > Revenue Recognition > Contracts** and choose **New Contract**.
2. Optionally apply a **Contract template** to prefill fields, or leave the template blank and enter the terms yourself.
3. Select the **Company** and **Customer**. Both are required before you can activate the contract.
4. Set **Close Date** and **Contract Start Date**. For the end of the term, pick a specific **Contract End Date**, enter a duration in months, or leave the contract ongoing.
5. Choose the **Recognition mode**: **Individual** posts one journal entry per obligation per period; **Subledger** accumulates lines you post in batches. You cannot change this mode after the contract leaves draft. See [Revenue Subledgers](https://docs.dualentry.com/accountants/revenue-recognition/revenue-subledgers/subledgers.md).
6. Confirm **Transaction Currency**. DualEntry fills **Base Currency** from the company. Add a memo, payment terms, payment method, attachments, and any custom fields your organization uses for contracts.

Optional sections on this step:

* **Unbilled receivables account**: This field turns on month-end contract asset tracking. See [How to Track Contract Assets on Revenue Contracts](https://docs.dualentry.com/accountants/revenue-recognition/contract-assets/track-contract-assets.md).
* **Cutover month** and **Prior recognized amount**: Use these only when you are [migrating a mid-life contract](https://docs.dualentry.com/accountants/revenue-recognition/migrate-mid-life-contracts.md).
* **Default early termination fee**: DualEntry uses this as the starting fee if you later terminate the contract.

Choose **Next** to continue. **Save as draft** is available on every step if you need to stop before the terms are complete.

## Add performance obligations

The **Performance Obligations** step is where you add each distinct good or service, choose how it is recognized, and price it. You set invoicing and recognition cadence for each obligation on the next two steps.

1. Add an obligation and select the **Item**. DualEntry fills **SSP** from the item's List Price in the contract currency. Override **SSP** on the obligation when this arrangement uses a different standalone price. See [Configure Allocations and Standalone Selling Price](https://docs.dualentry.com/accountants/revenue-recognition/allocations-and-ssp.md).
2. Set **Recognition Method**. The item's **Default Revenue Recognition Method** is only a starting value. The methods are **Straight line prorate daily**, **Straight line prorate first and last, even period**, **Straight line even periods**, **One time**, **Usage**, and **Milestone**.
3. Price the obligation. For a flat-rate line, choose **Total amount** or **Unit price** (see [Price a flat-rate obligation](#price-a-flat-rate-obligation)). For usage, configure the pricing model on the obligation. See [Usage Pricing: Flat and Tiered Models](https://docs.dualentry.com/accountants/revenue-recognition/usage-and-tiered-pricing/usage-tiered-pricing.md).

Add one obligation per distinct deliverable. A 12-month subscription and a one-time implementation belong on separate obligations so DualEntry can allocate and recognize them independently. Select multiple obligations to bulk-edit shared fields. For year-over-year rate steps, model a [multi-year ramp](https://docs.dualentry.com/accountants/revenue-recognition/multi-year-ramp-deals/multi-year-ramp-deals.md) instead of a single flat-rate line.

## Price a flat-rate obligation

Flat-rate obligations let you enter either the term total or a per-period rate. DualEntry shows the same contract total either way, so the header amount matches what you typed.

Choose the pricing tab that matches the commercial terms:

* **Total amount**: Enter the full obligation **Amount** and **SSP**. DualEntry does not multiply that amount by the number of periods. Use this when you know the term total and do not want to work backwards from a per-period rate.
* **Unit price**: Enter **Quantity per period**, **Unit price per period**, and **SSP per period**. The obligation header shows a live total of quantity × unit price × number of periods.

**Example:** 10 seats at \$100 per period for 12 monthly periods. In **Unit price**, DualEntry shows TCV \$12,000 (10 × \$100 × 12 periods) before you save. In **Total amount**, enter \$12,000 and the header shows \$12,000 with no extra period multiplication.

Switching tabs keeps the values you already typed. The contract subtotal and total sum the same amounts shown on each obligation header.

**One time** and **Milestone** obligations do not multiply across periods. Ten units at \$100 is \$1,000, not \$12,000. Usage obligations use consumption quantity and the usage pricing model, not this per-period TCV formula. See [Milestone Revenue Recognition](https://docs.dualentry.com/accountants/revenue-recognition/milestone-recognition.md) and [Usage Pricing: Flat and Tiered Models](https://docs.dualentry.com/accountants/revenue-recognition/usage-and-tiered-pricing/usage-tiered-pricing.md).

## Set invoicing and recognition

The **Invoicing** and **Recognition** steps hold the billing and recognition cadence for each obligation. On each step, select an obligation from the obligation list, configure it, then select the next one.

On the **Invoicing** step:

1. Keep invoicing on, or turn on **Exclude Invoice** when the invoices come from somewhere else.
2. For a usage obligation, choose a **Billing mode**: **Period (schedule)**, **Sync with recognition**, or **Prepaid drawdown**. See [How to Configure Usage Drawdown](https://docs.dualentry.com/accountants/revenue-recognition/usage-and-tiered-pricing/usage-drawdown.md) when the obligation is prepaid.
3. Set billing **Frequency**, **Interval**, and invoice dates.

On the **Recognition** step, set **Frequency** and **Interval** for schedule-driven methods, and review the recognition schedule. Billing and recognition cadences are independent, so changing one leaves the other alone. See [Recognition Timing: Frequency and Intervals](https://docs.dualentry.com/accountants/revenue-recognition/recognition-timing/recognition-frequency-and-intervals.md).

## Review the contract preview

The **Preview** step is a read-only summary of the contract before you save. Allocations, invoices, and recognition sit in one tabbed summary.

Open each tab that applies:

* **Allocations**: Review the SSP-based split of transaction price across obligations, and confirm each obligation's allocated amount before you activate.
* **Invoice Summary**: Review the invoices DualEntry generates from the invoicing settings on each obligation.
* **Revenue Recognition Summary**: Review the recognition entries DualEntry generates for each obligation by period.

When you edit a contract that already has customer credits, the credits appear below the tabs.

If a total, date, or allocated amount is wrong, go **Back** to the step that holds it and correct it. Entered obligations and rates persist when you move between steps.

## Save a draft or activate the contract

You can leave the form at any time with **Save as draft**, then reopen the contract from the **Draft** tab to finish it. **Save** (or **Send for approval**) on **Preview** creates or updates the contract.

A contract activates from draft only when it has a company, a customer, and at least one obligation, and every obligation has an item, quantity, and rate. If an approval workflow applies, DualEntry keeps the contract in draft and places it in **For Approval**. If no workflow applies, the contract becomes **Active**.

A draft contract has no general ledger impact. When the contract becomes active (or is approved), invoices and revenue recognition entries dated on or before that day post. Later records stay in draft and post automatically once their date arrives. Subledger-mode recognition posts through [batch posting](https://docs.dualentry.com/accountants/revenue-recognition/revenue-subledgers/batch-posting.md) instead. See [ASC 606 and IFRS 15 in DualEntry](https://docs.dualentry.com/accountants/revenue-recognition/asc-606.md) for the rest of the lifecycle.

> [!NOTE]
>
> If required fields are still empty, **Save** stays unavailable. Hover the button to see why, then use **Save as draft** if you need to continue later.

## Troubleshooting

These are the problems that most often stop a new contract from saving or activating:

* **Save is unavailable on Preview**: A required field is empty (company, customer, item, quantity, or rate). Complete the field or choose **Save as draft**.
* **The live TCV is larger than the commercial term total**: You entered a term total in **Unit price**. Switch to **Total amount**, or enter the per-period unit price so quantity × price × periods equals the signed total.
* **The Invoicing or Recognition step is empty**: No obligation is configured yet. Go **Back** to **Performance Obligations** and add one.
* **The contract will not activate**: Add a company, a customer, and at least one obligation, and give every obligation an item, quantity, and rate. Approval workflows can also hold the contract in **For Approval** instead of making it active.
* **Recognition mode cannot be changed**: The contract has left draft. Create a new contract if you need the other mode.

## Next steps

* Review allocated amounts in [Configure Allocations and Standalone Selling Price](https://docs.dualentry.com/accountants/revenue-recognition/allocations-and-ssp.md).
* Set an uncommon recognition cadence in [Recognition Timing: Frequency and Intervals](https://docs.dualentry.com/accountants/revenue-recognition/recognition-timing/recognition-frequency-and-intervals.md).
* Price consumption with [Usage Pricing: Flat and Tiered Models](https://docs.dualentry.com/accountants/revenue-recognition/usage-and-tiered-pricing/usage-tiered-pricing.md).
* Process later commercial changes in [Change Orders, Terminations, and Renewals](https://docs.dualentry.com/accountants/revenue-recognition/change-orders-terminations-renewals.md).
* Check recognized and deferred balances in [Reporting](https://docs.dualentry.com/accountants/revenue-recognition/reporting.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.