Skip to main content
Journal entries are the core transaction record in DualEntry. Every financial event, whether entered manually, created by a sub-ledger, or synced from an integration, posts to the General Ledger as a journal entry with balanced debits and credits.

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 account 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 the customer_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. Open the journal entry, toggle Exclude from AR aging (or Exclude from AP aging) on, and save. The entry stays visible on the customer or vendor sub-ledger and in the General Ledger, but DualEntry omits it from the AR aging and AP aging buckets and from the allowance-for-doubtful-accounts calculation. This keeps aging reports focused on true open receivables and payables without editing the underlying entry. Toggle it off at any time to reintroduce the entry to aging.

Create, post, and list entries

To create an entry via the API, send a POST to /public/v2/journal-entries/ with 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 accrual entry with an automatic reversal:
When reversal_date is set, DualEntry creates a mirror entry on that 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. Retrieve journal entries with GET /public/v2/journal-entries/. The endpoint 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.
If your auditors ask about skipped journal entry numbers, the gaps are a byproduct of how identifiers are allocated, not evidence of removed records. Every posted entry is retained and fully traceable: use the audit trail to demonstrate completeness, and 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 via GET /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. You can require classifications on specific accounts, and DualEntry blocks posting if a required classification is missing. 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 and intercompany entries

For entries that repeat on a schedule (monthly rent, depreciation, insurance amortization), use recurring journal entries. Create a template via POST /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. Intercompany journal entries record transactions that span two or more legal entities. Use POST /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.
Recurring entries generate drafts by default. Enable auto-posting only for entries with fixed amounts that don’t need period-over-period review, such as depreciation on a straight-line asset.

Attachments and locked-period behavior

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. Period locks apply to the date 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.
Entries posted to a locked period cannot be edited or voided. If you need to correct an entry in a locked period, unlock the period (requires admin or controller permission) or post an adjusting entry in the current open period.
For step-by-step account setup, see Chart of Accounts. To protect closed periods from unintended changes, see Period Locking. For anomaly detection on posted entries, see Anomaly Detection.
Last modified on August 27, 2026