Your chart of accounts defines every GL account available for posting in DualEntry. A well-structured chart keeps reporting clean, integrations predictable, and multi-entity consolidation straightforward.
Plan your numbering scheme
DualEntry uses numeric account numbers as the primary identifier for each account. You assign the numbering convention. DualEntry does not enforce a specific range, but a consistent scheme makes filtering and reporting far easier.
A common pattern:
| Range | Account type |
|---|
| 1000-1999 | Assets |
| 2000-2999 | Liabilities |
| 3000-3999 | Equity |
| 4000-4999 | Revenue |
| 5000-5999 | Cost of goods sold |
| 6000-6999 | Operating expenses |
| 7000-7999 | Other income / expense |
Leave gaps between ranges so you can insert new accounts without renumbering. If you operate multiple entities, consider prefixing or suffixing the account number with an entity identifier, or use classifications to tag entries by entity instead. Organizations with complex structures often reserve a dedicated range (e.g., 8000-8999) for intercompany accounts so they are easy to identify during consolidation. Before finalizing the scheme, map it against your reporting requirements: your financial statement groupings rely on the account’s account_type, so a logical numbering scheme speeds up the setup of those groupings.
Create an account
To create an account, navigate to Settings → Chart of Accounts → Add Account or use the API. Each account requires the following fields:
| Field | Type | Required | Description |
|---|
number | integer | Yes | Unique numeric identifier. Cannot be changed after the account has posted activity. |
name | string | Yes | Display name shown in reports and dropdowns. |
account_type | string (enum) | Yes | The account category, which controls normal balance direction. Lowercase enum values such as bank, accounts_receivable, fixed_asset, accounts_payable, equity, income, cost_of_goods_sold, and expense. |
currency_iso_4217_code | string | null | Yes | ISO 4217 currency code for the account. Set to null to use the entity default. |
is_active | boolean | Yes | Whether the account is available for posting. |
parent_account_id | integer | null | Yes | The ID of the parent account, or null for a top-level account. See parent-child hierarchy below. |
Optional fields include description, company_id, and category_1099. To create an account via the API, send a POST to /public/v2/accounts/ with these fields in the request body.
The following example creates a top-level operating expense account:
POST /public/v2/accounts/
Content-Type: application/json
{
"name": "Office Supplies",
"number": 6100,
"account_type": "expense",
"parent_account_id": null,
"is_active": true,
"currency_iso_4217_code": null
}
You cannot change an account number after transactions have posted to it. If you need to restructure, create a new account and use bulk reclassification to move historical balances.
Structure accounts with parent-child hierarchy
DualEntry supports a two-level hierarchy within the chart of accounts: parent accounts group related child accounts (also called sub-accounts) under a single roll-up. Use this when you want detail for day-to-day posting but a single line on financial statements.
- Parent account. A summary account that aggregates the balances of its children. You do not post transactions directly to a parent; it exists purely to roll up its children on reports. Parents must share the same account type and normal balance direction as their children (for example, an Expense parent can only have Expense children).
- Child account. A postable account that reports its balance both on its own and as part of its parent’s total. Journal entries, bills, invoices, and integrations all reference child accounts, not the parent.
For example, you might create a parent expense account 6000 - Marketing with children 6010 - Paid Advertising, 6020 - Events, and 6030 - Content. Your team codes invoices to the child accounts, and the P&L can display either the full detail or just the 6000 - Marketing roll-up depending on the report’s grouping level.
Create a child account
To make an account a child, set its Parent Account field to an existing account of the same type. From the UI, open Settings → Chart of Accounts → Add Account (or edit an existing account) and select the parent from the dropdown. Via the API, pass parent_account_id when calling POST /public/v2/accounts/:
POST /public/v2/accounts/
Content-Type: application/json
{
"name": "Paid Advertising",
"number": 6010,
"account_type": "expense",
"parent_account_id": 142,
"is_active": true,
"currency_iso_4217_code": null
}
Set parent_account_id to null for a top-level account. To convert a child back into a top-level account, PATCH the account with parent_account_id: null.
DualEntry supports a single level of nesting: a child account cannot itself be a parent. If you need more granularity, add more children under the same parent rather than nesting further.
Plan the grouping before creating the children. You cannot assign a parent to an account whose type differs from the parent’s, and you cannot change an account’s type once it has children or posted activity.
Align accounts with items, banking, and 1099
Certain DualEntry features depend on specific account mappings. Setting these up correctly before you go live prevents misclassified transactions that require reclassification later.
- Items. Each product or service item links to an income account and optionally a COGS account. When you create invoices or bills referencing items, DualEntry posts to these accounts automatically.
- Bank connections. Each connected bank account maps to a GL asset account. See Bank Connections for setup.
- 1099 tracking. Vendor payments that qualify for 1099 reporting post to expense accounts flagged as 1099-eligible. See 1099 Tracking to configure which accounts are included.
Review these mappings during initial setup and again when you add new bank connections, items, or vendor payment workflows. Catching misalignments before a close period saves time compared to running bulk reclassification after the fact. If you change an item’s income or COGS account, the change applies to future transactions only; existing posted entries retain their original account.
Manage accounts across multiple entities
In a multi-entity setup, DualEntry shares the chart of accounts across all companies by default. This means account 6100 - Office Supplies exists in every entity’s ledger, which simplifies consolidated reporting.
If an account should only appear for a specific entity, restrict it using the account’s entity scope setting under Settings → Chart of Accounts → Edit Account. Scoped accounts are hidden from journal entry dropdowns for entities they don’t belong to. When adding a new account in a multi-entity environment, decide whether it applies globally or to a subset of entities before saving. Changing scope after transactions have posted requires moving those transactions first.
For consolidated financial statements, the shared chart of accounts structure ensures that accounts roll up consistently across entities. If you need entity-specific detail without separate accounts, use classifications to tag transactions by entity, department, or location and report on them through dimension-filtered views.
Merge two accounts
If you end up with duplicate or overlapping accounts (for example, two “Office Supplies” accounts created during a migration), you can merge them instead of manually re-coding every historical entry. Merging combines a source account into a target account: all posted activity, item mappings, bank and credit card references, budgets, allocation rules, fixed asset mappings, and reconciliation history are re-pointed to the target, and the source account is deleted.
To merge accounts, navigate to Settings → Chart of Accounts, select the source account, and choose Merge into another account. Pick the target account and confirm. The merge runs in a single audited transaction and is recorded in the audit log against the target account (event type ACCOUNT_MERGED), capturing both the source and target account numbers and names.
Requirements
Both accounts must satisfy every rule below before a merge is allowed:
- Both accounts belong to the same organization.
- Both accounts have the same account type (Asset, Liability, Equity, Revenue, or Expense).
- Both accounts have the same 1099 category.
- Neither account has a linked financial account (connected bank feed).
- The source account is not a system account.
- The source account has no child accounts.
- The target account is not a child of the source account.
- If both accounts have budget cells, no cells overlap for the same budget, year, and month.
- No entry on the source account falls in a locked AR, AP, or GL period for the target account’s company.
Bank accounts and credit card accounts cannot be merged from the UI. If you need to consolidate them, contact support.
What happens during a merge
DualEntry processes the merge as a single transaction, so concurrent edits to either account are blocked until it completes. It updates every reference to the source account, including:
- GL entries and every record line type (journal entries, bill lines, direct expense lines, customer and vendor payment lines, allocation lines, currency revaluation lines).
- Item mappings (income, expense, deferral, asset, and discount accounts).
- Fixed asset, amortizable asset, disposal, and revaluation account fields.
- Bank and credit card account fields on payments, deposits, refunds, transfers, cash sales, and direct expenses.
- Reconciliations, allocation schedules and templates, contracts, budgets, and integration records.
- Parent-account pointers on any child accounts.
Once every reference is updated, the source account is deleted and the lock is released.
Merges cannot be undone. Confirm that the target account’s number, name, account_type, and default classifications are correct before merging, because historical entries will inherit them going forward. For very large accounts, the merge may exceed the request timeout; in that case, use bulk reclassification or bulk import to consolidate the data instead.
Retrieve and update accounts via the API
Use the following endpoints to manage accounts programmatically:
| Operation | Method | Endpoint |
|---|
| List all accounts | GET | /public/v2/accounts/ |
| Get a single account | GET | /public/v2/accounts/{account_number}/ |
| Create an account | POST | /public/v2/accounts/ |
| Update an account | PATCH | /public/v2/accounts/{account_number}/ |
The list endpoint supports filtering by account_types, number, and company_id. Use it to pull a specific subset (for example, all expense accounts for a single entity) when building reports or integration logic. The PATCH endpoint lets you update the account name, description, and classifications, but not the account number or account_type on accounts with posted activity.
Deleting an account is only allowed if it has zero posted transactions. Inactive accounts can be archived instead, which hides them from dropdowns while preserving historical data.
After completing these steps, your chart of accounts is structured, numbered, and aligned with items, bank connections, and 1099 tracking. Next, learn how to record transactions against these accounts in Journal Entries, or set up your close process to reconcile and review balances at period end.