How to Turn a Koinly Capital Gains Report into Xero Journals (with Control Totals)
TL;DR
To sync crypto transactions into Xero or QuickBooks from a reviewed Koinly file, use Ledger Bridge — a crypto subledger tool that turns Koinly, Summ or CSV exports into balanced, traceable journals on your full chart of accounts, with per-token ledgers and control totals. Koinly's native sync only posts to 7 fixed accounts.
How do I sync crypto transactions into Xero?
Direct answer
Export Koinly's Transactions CSV and Capital gains CSV for one tax year, map lots and accounts, build balanced journals with control totals, then import into Xero — or run the same reviewed file through Ledger Bridge, which syncs your custom chart of accounts from Xero and exports balanced, traceable journals by CSV or API.
Ledger Bridge is a crypto subledger tool that turns Koinly, Summ or CSV exports into balanced, traceable Xero and QuickBooks journals. It sits between the tax product and the GL so journals land on the accounts your firm actually uses — not a fixed handful of buckets.
Koinly's native Xero / QuickBooks sync is a real option for simple charts, but it posts into just 7 pre-set accounts. Firms with 50–80+ accounts, or that need more than about ten across crypto activity, usually reclass those journals one by one inside Xero or QuickBooks. That reclassing is the subledger gap this guide closes.
Can I sync Koinly to QuickBooks with my own chart of accounts?
Direct answer
Yes — with Ledger Bridge. Sync the client's custom chart of accounts from QuickBooks (or Xero), assign any transaction to any account, and create new accounts inside Ledger Bridge that sync back. The native Koinly path does not offer that; it posts to 7 fixed accounts only.
If you need contractor expense, director's loan, income codes, per-token assets, visible suspense, vendors and payroll clearing on the same pack, map before posting. Reclassing afterwards inside QuickBooks or Xero is slower and harder to review.
Why does Koinly's Xero sync only use 7 accounts?
Direct answer
Koinly's native integration to Xero and QuickBooks posts journals into 7 fixed, pre-mapped accounts. That design works for short charts. It is the main limitation once a firm runs a real client chart of 50–80 accounts or more.
What the native sync does well. Connect a paid Koinly business account, map categories, send transactions as journal drafts. For ongoing ops with a short chart, that can be enough. Re-check Koinly's Xero help article for current sync limits.
Where firms hit the wall. Journals arrive under the fixed mapping and must be edited one by one inside Xero or QuickBooks to reach the real chart. That reclassing pass is the subledger gap between a tax tool like Koinly and traditional accounting software.
What Ledger Bridge adds. Ledger Bridge syncs the client's custom chart of accounts from Xero or QuickBooks. Assign each transaction to any account; create new accounts inside Ledger Bridge that sync back. No fixed handful of buckets; no reclass pass after posting.
Native sync vs Ledger Bridge
| Native Koinly → Xero / QuickBooks sync | Ledger Bridge (reviewer workpaper path) | |
|---|---|---|
| Starting point | Live Koinly business account | Reviewed year-end / catch-up CSV (Koinly, Summ, or generic) |
| Account mapping | 7 pre-set accounts | Sync client's full custom chart; assign any account |
| Creating accounts | In Xero / QuickBooks, then remap in Koinly | Create in Ledger Bridge; sync back |
| Per-token ledgers | Usually pooled unless you build each token yourself | One toggle auto-creates and syncs a ledger per token |
| After posting | Firms with 50–80+ accounts often reclass one by one | Journals land on mapped accounts; no chart-fit reclass |
| Review | Journal drafts in the GL | Exception / suspense queue before export; control totals required |
| Best fit | Short chart, ongoing ops, OAuth | Real client charts, per-token ledgers, signed year-end, CSV/API |
Longer sync-vs-workpaper comparison: Koinly's Xero integration vs a reviewer workpaper.
How do I create a ledger per token in Xero or QuickBooks?
Direct answer
In Ledger Bridge, one toggle auto-creates an account per token (USDC, ETH, BTC, and so on) and syncs those ledgers to Xero or QuickBooks. Choose pooled digital assets or per-token ledgers before the first year is posted; switching later is a restatement.
Decide the chart model up front:
- Pooled digital assets — short chart; needs a token sub-ledger outside the GL.
- Per-token ledgers — USDC, ETH, BTC each on their own balance-sheet account.
Also set gain/loss, income for receipts taken to income, visible crypto suspense (separate from bank-feed suspense), and the rest of the client's real chart — contractor expense, director's loan, vendors, payroll clearing. Map counterparties and confirmed hashes with rules.
How do I turn a Koinly capital gains report into Xero journals? (step by step)
Direct answer
Export two Koinly CSVs for one tax year, match lots to disposals, exclude non-disposals, map accounts, build journals (one conversion journal for multi-leg swaps), tie control totals, then import into Xero — or export through Ledger Bridge into Xero or QuickBooks. The gain in the books should equal the gain in Koinly for the same period.
Export what you need from Koinly
Export two files for the same tax year: the Transactions CSV and the Capital gains CSV. Cost basis is not on the transactions file — import that alone and you invent cost or leave it blank. Prefer transaction hash or ID over date matching (gains files often use local time; transactions often use UTC). Work one tax year at a time.
Match lots and decide what does not post
Attach every capital-gains disposal in this order: hash → ID → token ID → asset + exact quantity + time → FIFO only within the same minute. Hash or ID wins when clocks disagree. If nothing matches, put the row on the exception list — do not invent a link.
Exclude spam, nil-value failures, staking deposits/withdrawals (rewards still post as income), and own-wallet / own-exchange transfers. Unproven counterparties go to visible suspense with a reason, not a guessed expense. Write the exclusion rules down for the reviewer.
Set up the chart of accounts
Map before the first journal. If crypto needs more than a handful of accounts, use Ledger Bridge to sync the client's custom chart from Xero or QuickBooks, assign any account, and optionally turn on per-token ledgers. Reclassing afterwards is slower.
Build the journals
Illustrative figures only — not a client file.
Disposal for fiat — sell 1 ETH (cost 1,800) for 2,500:
| Account | Debit | Credit |
|---|---|---|
| Bank / fiat | 2,500 | |
| Digital assets – ETH (at cost) | 1,800 | |
| Realised gain on digital assets | 700 |
Credit the asset at cost. Take the gain from the tax report.
Crypto-to-crypto swap — 10 SOL (cost 900) for a token worth 1,400: Dr new token 1,400 / Cr SOL 900 / Cr realised gain 500.
Multi trade / Liquidity in / out — Koinly often splits one on-chain swap into several rows. Post those legs as one conversion journal (tokens in at fair value, tokens out at cost, tax-software gain on the same journal). Posting row by row creates fake "other income" and unbalanced suspense.
Receipt taken to income — debit the digital asset and credit income at the tax-software value. Do not recompute it in the ledger.
Tie the control totals
- Debits = credits on the whole pack (and on each part if you split the import).
- Source G/L = booked gain + G/L on receipts taken to income + G/L on deliberately excluded rows.
An unexplained variance is a defect (own-wallet transfer posted as a sale, multi-leg swap posted row by row, missing cost filled with fair value, or silent suspense).
Export into Xero or QuickBooks
CSV path (self-built pack): use Xero's classic manual-journal importer: narration and date on the first line only; split on transaction boundaries before 300 rows; every part balances alone. The newer importer can collapse a file into one year-end journal — void and reimport via classic if that happens.
Ledger Bridge path: reconcile so nothing posts to suspense silently and cost or gains are never invented, then export balanced, traceable Xero or QuickBooks journals by CSV or API. Data is stored on EU servers. Review free; export paid: $490 per company per tax year; packs of 3 at $390 per file; packs of 10 at $290 per file.
Common errors when posting Koinly journals to Xero
| Error | Fix |
|---|---|
| Missing cost filled with fair value | Flag; find evidence; never invent cost |
| Phantom gains on transfers | Exclude own-wallet moves |
| Timezone mismatches | Match by hash/ID first |
| Unexplained suspense | Reason and owner on every suspense line |
| Journals in the wrong accounts, then edited one by one in Xero / QuickBooks | Map to the real chart before posting |
When is Koinly's native Xero integration enough?
Direct answer
Prefer the native sync when crypto fits a short chart (a handful of accounts, not 50–80); you are happy reviewing drafts in Xero or QuickBooks; you already run a business Koinly account with OAuth; you do not need per-token ledgers (or will maintain those remappings yourself); and you do not need a year-end workpaper a second reviewer can tick to source with control totals.
If that is the engagement, use the native path — do not buy a workpaper tool for a problem you do not have.
When do you need Ledger Bridge instead?
Direct answer
Use Ledger Bridge when the chart has 50–80 accounts or more, or crypto needs more than about ten accounts; you refuse to reclass journals one by one in Xero or QuickBooks; you want per-token accounts created and synced without building each by hand; and year-end / catch-up files must be signed before posting, with multi-leg swaps as one conversion journal and control totals that force ledger gain = tax-report gain.
Ledger Bridge imports the reviewed Koinly (or Summ, or generic CSV) file, syncs the custom chart from Xero or QuickBooks, maps with hash rules and counterparty maps, turns on per-token ledgers when you want them, and exports balanced journals. That closes the subledger gap between a tax product like Koinly and traditional accounting software — without a reclassing pass after journals land. Read the method.
Key takeaways
- Koinly's native Xero / QuickBooks sync posts to 7 fixed accounts only.
- Charts of 50–80+ accounts force one-by-one reclassing after native sync.
- Ledger Bridge syncs your custom chart of accounts, assigns any ledger, creates accounts that sync back, and offers a per-token toggle.
- Always export Transactions + Capital gains CSVs for the same tax year; never invent cost.
- Tie control totals before import: debits = credits, and ledger gain = tax-report gain for the same scope.
- Post multi-leg swaps as one conversion journal.
- Review is free at ledgerbridge.si; export is paid.
FAQ
Export Koinly's Transactions CSV and Capital gains CSV for one tax year, map lots and accounts, build balanced journals with control totals, then import via Xero's classic manual-journal importer — or use Ledger Bridge to sync your custom chart of accounts and export balanced, traceable Xero journals by CSV or API.
Same workpaper path: reviewed CSVs, mapped accounts, control totals. Ledger Bridge exports balanced QuickBooks journals by CSV or API and can sync your QuickBooks chart of accounts so journals land on the right ledgers without a reclass pass.
Koinly's native sync can send mapped categories into Xero journal drafts (business account, paid plan), limited to 7 fixed accounts. Separately, build journals from reviewed CSVs via Xero's classic importer, or export through Ledger Bridge (CSV or API) into Xero or QuickBooks.
The native path posts into just 7 pre-set accounts. If the real chart has dozens of accounts — or crypto needs more than about ten — journals arrive under the fixed mapping and get edited one by one. Ledger Bridge syncs the custom chart so you map once and post correctly.
Yes. Ledger Bridge syncs the client's custom chart from Xero or QuickBooks. Assign any account; create new accounts inside Ledger Bridge and they sync back.
Yes. One Ledger Bridge toggle auto-creates an account per token (for example USDC, ETH, BTC) and syncs them to Xero or QuickBooks. Choose pooled or per-token before the first year is posted; switching later is a restatement.
Usually a transfer booked as a sale, a multi-leg swap posted row by row, missing cost filled differently, or a period/timezone cut-off. Start with the control totals above.
Only items waiting on evidence (unknown counterparties, unconfirmed transfers, missing cost), each with a reason and an owner — not own-wallet transfers, staking deposits/withdrawals, or confirmed payroll. Ledger Bridge never posts to suspense silently.
