Header fields
Each journal entry has a header that sets the context for the transaction. The table below lists all header-level fields, their types, and whether they are required.
The
date field determines which period an entry belongs to. If the period for that date is locked, the entry cannot be created or modified. Change the date to an open period or unlock the period first.
Line fields
Each entry contains two or more lines. Total debits must equal total credits before the entry can be posted. The table below lists all line-level fields.
Linking a line to a
customer_id or vendor_id makes the entry appear in that customer’s or vendor’s sub-ledger, which feeds into aging reports and reconciliation.
Exclude a journal entry from AR or AP aging
Some journal entries touch a customer or vendor sub-ledger for reconciliation or reclassification purposes but shouldn’t be treated as an open receivable or payable. Examples include a reclass between AR accounts, a bad debt write-off, or a correcting entry that offsets an existing invoice outside the normal payment flow. In these cases, keep thecustomer_id or vendor_id on the line so the entry still shows in the sub-ledger and reconciles cleanly, but remove it from the aging report.
The Exclude from AR aging (or Exclude from AP aging) flag controls this. On, it keeps the entry visible on the customer or vendor sub-ledger and in the General Ledger, but removes it from the AR aging and AP aging buckets and from the allowance-for-doubtful-accounts calculation. Off, the entry counts toward aging as normal. Toggling it doesn’t change the underlying entry, only whether aging reports count it, so it can be switched at any time.
Create, post, and list entries
POST /public/v2/journal-entries/ creates an entry from header and line data. Set record_status to draft to save without affecting balances, or posted to apply immediately.
The following example creates a posted entry with an automatic reversal, by setting reversal_date:
reversal_date, with debits and credits swapped. This is the standard pattern for month-end accruals that reverse on the first day of the next period; see How to Post and Reverse Month-End Accruals for the full workflow.
GET /public/v2/journal-entries/ retrieves entries and supports the following filters:
Combine filters to narrow results, such as all posted entries for a single vendor within a date range. Pagination defaults to 100 entries per page; use
page and page_size parameters to navigate larger result sets.
Record numbering
DualEntry assigns each journal entry a record number that is unique and monotonically increasing per organization, starting at 1. Numbers are not guaranteed to be strictly consecutive. Gaps in the sequence are expected and do not indicate missing or deleted entries. Gaps appear because the number is drawn from a per-organization counter on a dedicated connection that commits immediately, before the surrounding save transaction. A number is consumed the moment it is allocated, so any of the following produces a gap:- A journal entry save that fails validation, hits a lock, or is otherwise rolled back after the number was allocated.
- An import batch that aborts partway through after allocating numbers for the remaining rows.
- A draft that is created and then discarded. Drafts consume record numbers at creation time, the same as posted entries.
GET /public/v2/journal-entries/ or the journal entry list view to enumerate all entries for a period.
Classifications
Classifications are multi-dimensional tags you apply to journal entry lines for segmented reporting. Common classifications include Department, Location, Project, and Class. Manage classifications through Configuration → Accounting Setup → Classifications or viaGET /public/v2/classifications/.
When you assign a classification to a line, the balance for that line rolls up into dimension-specific reports. This enables analysis like revenue by department or expenses by project without maintaining separate accounts. A classification can be made mandatory on specific record types, on specific companies, or both. The two axes are independent and cumulative, so a journal entry must carry every classification required for journal entries plus every classification required for its company. DualEntry enforces the requirement when the entry is posted, not when it is saved, so a draft saves without classification values and posting fails with an error naming the missing ones. See How to Set Up Classifications for the setup steps.
Classifications are also available as filters in the flux analysis and financial statements modules, so the tags you apply at the line level carry through to period-end reporting.
Manage classification values through Configuration → Accounting Setup → Classifications or the API. Adding, renaming, and deactivating values does not affect historical entries: deactivated values remain on the entries that already carry them, and simply stop appearing in selection dropdowns for new ones.
Recurring entries
For entries that repeat on a schedule (monthly rent, depreciation, insurance amortization), use recurring journal entries. Create a template viaPOST /public/v2/recurring/journal-entries/ with the same header and line structure, plus a recurrence schedule (frequency, start date, end date). DualEntry generates a draft journal entry from each template on the scheduled date. Review and post the drafts, or configure auto-posting if the amounts are fixed and don’t require review.
For month-end accruals you run on demand (vacation, utilities, unbilled revenue), use accrual templates instead of a recurring journal entry. An accrual template does not generate on a calendar. You choose Run each period, set the dates, and post.
Recurring entries generate drafts by default. Auto-posting posts each generated entry on the scheduled date without a review step.
Intercompany entries
Intercompany journal entries record transactions that span two or more legal entities. UsePOST /public/v2/intercompany-journal-entries/ to create them. Lines on an intercompany entry reference accounts across different companies, and the entry must balance in aggregate: total debits across all entities equal total credits. DualEntry automatically creates the corresponding intercompany receivable and payable on each entity’s books so that individual company trial balances remain in balance. Intercompany eliminations are handled during consolidation.
Attachments
You can attach supporting documents (scanned invoices, contracts, approvals) to any journal entry. Attachments are stored at the header level and accessible from the entry detail view. Use attachments to maintain the audit trail without relying on external file storage. Supported file types include PDF, PNG, JPEG, and CSV. Each entry supports up to 25 attachments with a maximum file size of 10 MB per attachment.Locked-period behavior
Period locks apply to thedate field on the entry. Changing the date on a draft entry to an open period lets you post it even when the original date’s period is locked.
For step-by-step account setup, see How to Create and Manage Chart of Accounts. To protect closed periods from unintended changes, see Period Locking. For anomaly detection on posted entries, see Anomaly Detection.