Contract asset tracking books a month-end adjustment on each revenue contract so the contract shows one net position on your balance sheet: a contract asset when revenue is recognized ahead of billing, or deferred revenue when billing runs ahead. This page covers turning it on and reviewing the result. After you finish, each contract with an unbilled receivables account carries a Contract asset metric and a Monthly Summary tab, and its adjustments post to the general ledger automatically. For the accounting model, see How Contract Asset Adjustments Work.
Prerequisites
Before you set up contract asset tracking, confirm the following:
- Revenue recognition is enabled for your organization.
- The Default unbilled receivables account field appears on your company in Configuration > Company > Companies. If it doesn’t, contact your DualEntry account team to enable contract asset tracking.
- Your role can edit companies, the chart of accounts, and revenue recognition contracts.
- You know which accounts receivable and other general ledger periods are locked. Adjustments never change a locked month. See Period Locking.
Create an unbilled receivables account
Contract adjustments post the contract asset to an account of the Unbilled Receivable type. The account pickers for this feature only offer active accounts of that type, so create one first if your chart of accounts doesn’t have one.
- Go to Configuration > Accounting Setup > Chart of Accounts and add an account.
- Set Type to Unbilled Receivable. DualEntry assigns a number in the asset range.
- Name the account for what it holds under your policy, for example “Contract Asset” or “Unbilled Revenue”, and save it.
You can also create the account from the field itself. When no active Unbilled Receivable account exists for the company, the account picker shows “Holds revenue earned before invoicing (contract asset).” with a Create one link that opens the account form with the type already set. For general guidance on account setup, see Chart of Accounts.
Set the company default
The company default is the starting value for new contracts, so you set the account once instead of on every contract.
- Go to Configuration > Company > Companies and open the company.
- In the Default Accounts group, set Default unbilled receivables account.
- Save the company.
The default is optional. Leave it empty if only some contracts need contract asset tracking, and set the account on those contracts directly. Changing or clearing the default later doesn’t change any existing contract, because each contract keeps its own copy of the account.
Set the account on a contract
The contract’s own Unbilled receivables account field is what turns adjustments on. A contract with the field empty gets no contract adjustments, whatever the company default says.
- Go to Accounting > Revenue Recognition > Contracts and create or edit a contract.
- In the Contract Terms step, check Unbilled receivables account. When you pick the company on a new contract, DualEntry fills the field from the company default.
- Keep the default, choose a different Unbilled Receivable account, or clear the field to skip adjustments for this contract.
- Save the contract.
DualEntry calculates the contract’s adjustments after you save an active contract. It doesn’t calculate adjustments for draft or archived contracts.
On each performance obligation, the accounts shown are Income account, Deferral account, Discount account, and, when this contract has one, Unbilled receivables account. Those values are read-only. Change Unbilled receivables account in Contract Terms.
Set the account from the API, CLI, or MCP server
Outside the app, the contract’s account is the unbilled_receivable_account_id field on the public contracts API. The company default doesn’t apply here: a contract created through the API, CLI, or MCP server gets no unbilled receivables account unless you send this field.
- API: send
unbilled_receivable_account_id with the account’s ID on POST /public/v2/contracts/, or on PATCH /public/v2/contracts/{record_id}/ to set it on an existing contract. Contract responses return the field so you can check which contracts have it set.
- CLI: include
unbilled_receivable_account_id in the JSON file you pass to dualentry contracts create --file. The dualentry contracts update command replaces the whole contract, so send the full contract record with the field added, or use the API’s PATCH to change only this field. The dualentry contracts get command returns the field in JSON output.
- MCP server: the contract create and update operations accept the same
unbilled_receivable_account_id field.
The monthly summary, the contract adjustment list, and the Sync adjustments action are available only in the app. The public API, CLI, and MCP server don’t expose them. To read contract adjustments outside the app, query the general ledger for the contract’s unbilled receivables account and its deferral accounts. When the contract is a net contract liability, an adjustment can move amounts between deferral accounts without touching the unbilled receivables account (see How DualEntry nets the contract position). See the CLI reference and MCP integration for setup.
Review the contract position
The contract overview shows the contract asset, the month-end chart, and the records behind each month. Open the contract from Accounting > Revenue Recognition > Contracts.
Under Performance Obligations, the Billing and Recognition chart shows the contract’s net position at each month end after adjustments. Its caption is Net position at month end, after adjustments. The legend is Contract asset (unbilled) and Deferred revenue. Filter by year, or choose All.
Below the chart, the revenue summary tabs are Allocations, Invoice Summary, Monthly Summary, and Adjustments.
- Contract asset sits next to Deferred Revenue and shows the contract asset as of the latest month end, with that date under the value. If the contract has no unbilled receivables account, the card reads Not configured and links to edit the contract.
- Monthly Summary replaces the Revenue Recognition Summary tab and shows one row per month end of the contract. See Reporting for what each column means.
- Adjustments lists each posted contract adjustment with its number, date, amount, and status.
Select a month on Monthly Summary to list the records behind it, grouped as Invoices, Customer credits, Revenue recognition, Change orders, Terminations, and Contract adjustments. Each contract adjustment lists the accounts it debited and credited. Select a record to open the GL Impact drawer. The drawer shows the debits and credits for that record, grouped as Posted and Preview when those lines exist, and it links to the record’s detail page.
A note in the drawer may say the adjustment reverses on day 1. It does not. Each month books only the change in the cumulative position since the previous month end.
In the Monthly Summary tab, a lock icon marks a month inside your company’s A/R Transactions or Non GL Transactions lock. Adjustment sync uses a different rule: it leaves a month unchanged when the month falls inside the A/R Transactions or Other GL Transactions lock. The icon alone doesn’t tell you whether a sync will change a month’s adjustment, so check those two locks in Period Locking. Pending in the Adjustment column marks a month without the lock icon that has no posted adjustment yet, for example a future month end.
Sync adjustments after a change
DualEntry recalculates adjustments after changes to the contract’s documents and again on the first day of each month. Use Sync adjustments when you want updated figures right away, for example after correcting an invoice dated in an earlier month.
- Open the contract.
- In the contract’s actions menu, select Sync adjustments.
- Wait for the Adjustments synced message. The metrics and the Monthly Summary tab refresh without reloading the page.
The action is unavailable when the contract has no unbilled receivables account. If the sync fails, the message shows the reason and the figures stay as they were. See Troubleshooting.
Change a contract’s unbilled receivables account
You can move a contract to a different Unbilled Receivable account at any time. Edit the contract, choose the new account, and save. If the contract already has adjustments, DualEntry asks you to confirm with the message Open months will be recalculated with the new account. Closed months stay as they are.
After you confirm, DualEntry syncs the contract. The first open month’s adjustment moves the balance from the old account to the new one, and locked months keep the old account.
You can’t clear the field once the contract has contract adjustments, so contract asset tracking stays on for that contract. Decide whether a contract needs tracking before its first adjustment posts. A contract with no remaining contract asset keeps the account at a zero balance.
Known limits
Contract asset tracking has these limits:
- Adjustments are system-managed. You can’t create, edit, or delete a contract adjustment by hand, and adjustments have no record page of their own. Open them from the month drill-down.
- Locked months don’t change. Changes that affect a locked month land in the first open month instead.
- Draft documents count. Draft invoices, draft recognition entries, and draft subledger lines on the contract are included in the position, so a posted adjustment can reflect a document that hasn’t posted yet.
- Only linked documents count. A customer credit that isn’t linked to the contract doesn’t affect the contract position. Termination fee invoices are also excluded.
- Revenue recognition reports don’t include adjustments. The waterfalls and Rollforward build from contract schedules. See How adjustments appear in reports.
- The account can’t be removed. Once a contract has adjustments, you can switch its unbilled receivables account but not clear it.
- Unarchiving doesn’t restore adjustments immediately. Archiving a contract archives its adjustments. After you unarchive it, the next sync posts them again.
- The Adjustment column is unsigned. It shows each adjustment’s amount without direction. Use the Contract asset and Deferred revenue columns to see which way the position moved.
Troubleshooting
These errors can appear when you save a contract or run Sync adjustments:
Account must be an Unbilled Receivable account: the account you chose has a different type. Pick an account of the Unbilled Receivable type, or create one.
Account must be active: the account is inactive. Reactivate it in the chart of accounts or choose another account.
Cannot clear the unbilled receivable account while the contract has contract adjustments: the contract already has adjustments. Choose a different account instead of clearing the field.
Cannot modify a transaction which was reconciled already: an adjustment the sync needs to update has been reconciled. Unreconcile that entry, then sync again.
No exchange rate is available for ... on one or more dates.: the contract is in a foreign currency and a rate is missing for a month end. Add the rate, then sync again.
Next steps
Last modified on November 3, 2026