Posting crypto journals to your ERP without losing the audit trail
Summary or detail, mapping to your chart of accounts, and how to stop the same transaction landing in QuickBooks, Xero or NetSuite twice.
Your general ledger does not need every on-chain transfer, but your auditors will want to get from any GL balance back to the transactions behind it. The design choices are how much detail to post, how accounts map, and how to make sure a retry never posts the same entry twice.
Summary or detail
Detail posting sends one journal per transaction. It gives the most direct trail but can flood a small-business ERP with thousands of lines a month and make bank and account reconciliations harder to read. Summary posting sends one journal per wallet, asset or account per period, with the detail kept in the subledger. Either can be acceptable; what matters is that every summarized line can be traced to the underlying transactions.
Keep in mind that US GAAP reporters applying ASU 2023-08 must disclose, for each significant holding, the units, cost basis and fair value, plus an annual rollforward of additions, dispositions and gains and losses, and cumulative realized gains and losses [1]. Those figures come from asset-level detail, so a summary GL works only if the subledger keeps that detail and ties to it.
Many teams use a hybrid: summary journals for high-volume activity such as gas, small receipts and internal transfers, and detail journals for material or unusual items such as large swaps, loans, grants and anything an auditor will sample.
| Account | Debit | Credit |
|---|---|---|
| Detail entry 1: swap ETH for USDC ETH carrying amount 48,500.00; USDC received 50,000.00 | ||
| Digital assets — USDC | 50,000.00 | |
| Digital assets — ETH | 48,500.00 | |
| Realized gain on digital assets | 1,500.00 | |
| Detail entry 2: gas paid in ETH Gas fair value 120.00; ETH basis consumed 100.00 | ||
| Gas and network fees | 120.00 | |
| Digital assets — ETH | 100.00 | |
| Realized gain on digital assets | 20.00 | |
| Same month as one summary journal Memo references both transaction hashes and the subledger batch ID | ||
| Digital assets — USDC | 50,000.00 | |
| Gas and network fees | 120.00 | |
| Digital assets — ETH | 48,600.00 | |
| Realized gain on digital assets | 1,520.00 | |
Mapping to your chart of accounts
Decide the mapping before the first posting and keep it under change control. Common choices are one asset account per significant token (or per token and custodian), a clearing account for transfers in transit, separate realized gain and loss accounts, an unrealized fair-value adjustment account for ASU 2023-08 remeasurement, and gas and fee expense accounts. Changes to these mappings are system changes; the PCAOB has flagged audits where changes to accounting or finance systems were not shown to be tested before going into production [2].
Each ERP also has its own rules. QuickBooks Online requires each journal entry's total debits and credits to be equal and suggests a memo explaining the entry [3]. In Xero's accounting API, manual journal lines carry a signed line amount where debits are positive and credits negative, journals can be saved as DRAFT or POSTED, each line can carry at most two tracking categories, and a journal can include a URL to its source document [4]. Check the equivalent constraints in NetSuite or any other ERP before designing the export.
Never post the same thing twice
Duplicate postings usually come from retries after a timeout, from re-running a period after a correction, or from two people exporting the same batch. Defences work at three levels:
- Identity: give every journal a stable source key, such as entity, chain and transaction hash for detail entries or entity, wallet, account and period for summaries, and refuse to create a second ERP entry for a key that is already linked.
- Transport: use the ERP's retry protection where it exists. Xero's API accepts an Idempotency-Key header, up to 128 characters, so a retried request is not processed twice [4].
- Reconciliation: after each posting run, tie GL balances for crypto accounts back to the subledger and investigate any difference before close.
Corrections deserve the same care. Rather than editing or deleting a posted entry in the ERP, many teams post a reversing or adjusting entry that references the original, so the trail shows what changed and why. If your process does update an ERP entry in place, read it back first to confirm nobody has edited it in the ERP since it was posted.
Keep the audit trail connected
Put the subledger batch ID and, for detail entries, the transaction hash in the memo or reference field, and attach or link the supporting report. Inspectors have criticized testing that started from records already in the subledger, because it cannot prove that everything on chain was captured [2]. Your reconciliation should therefore run both ways: chain to subledger to GL, and GL back to chain.
What to do
- Choose summary, detail or hybrid posting per activity type and write it into your close policy.
- Lock the account mapping and treat changes as tested, approved system changes.
- Assign a stable source key to every journal and block duplicates before export.
- Use API idempotency features where your ERP offers them.
- Correct by adjusting entries with references, not silent edits.
- Reconcile crypto GL accounts to the subledger every period before sign-off.
Sources
- 6.3 Disclosures About Crypto Assets Within the Scope of ASU 2023-08 (Roadmap: Digital Assets) (Deloitte DART)
- Spotlight: Observations From the Target Team's 2023 Inspections (PCAOB)
- Create journal entries in QuickBooks Online (Intuit QuickBooks)
- Xero Accounting API OpenAPI specification (xero_accounting.yaml) (Xero (GitHub))
General information for finance teams, current as of publication. Not legal, tax or accounting advice.