Crypto Portfolio PnL Calculation: Proceeds, Basis, Fees, and the Realized Line (2026)
Crypto Portfolio PnL Calculation: Proceeds, Basis, Fees, and the Realized Line (2026)
Reviewed by Wag3s Editorial Team — verified against the realized-PnL = proceeds − basis − fees identity, the realized/unrealized split, and the jurisdiction-specific basis-method dependency · Last reviewed May 2026
Crypto Portfolio PnL Calculation
The profit-and-loss number on an exchange dashboard and the gain you report on a tax return start from the same trades and almost never agree. The dashboard mixes realized and unrealized movement, sees only one venue, and rarely uses the cost-basis method your country requires. Pulling those threads apart is the difference between knowing how your portfolio is doing and knowing what you owe. This article sets out the realized PnL identity, how fees enter it, and why the performance figure and the taxable figure are two distinct outputs of the same history. The basis method that feeds the calculation is jurisdiction-specific and is covered in the cost basis methods pillar; here the focus is the PnL computation itself, not which method your country mandates.
In brief
- Realized PnL on a disposal is proceeds minus cost basis minus allowable fees, with the basis computed on your jurisdiction's mandated method.
- Unrealized PnL is the mark-to-market change on positions you still hold: paper performance, generally not taxable for individuals under a realization regime.
- Acquisition fees raise the cost basis, disposal fees reduce proceeds, and network gas is captured under a consistent, documented policy.
- The jurisdiction-specific part is the basis method, not the arithmetic, which is why two tools can disagree on the same trades.
- An exchange app's PnL is a performance indicator, not the taxable gain: it covers one venue, uses a simple running method, and can misread self-transfers.
- Performance PnL and taxable gain answer different questions and should be computed separately.
The realized PnL identity
For a disposal:
Realized PnL = proceeds − cost basis − allowable fees
The arithmetic is trivial; the cost basis input is not. It must use the method your jurisdiction mandates: US per-wallet FIFO or Spec-ID from 2025, UK Section 104 pooling, German FIFO, Canadian ACB, or French 150 VH bis. Two tools that disagree on the same trades are disagreeing on the basis method, not the formula.
Realized vs unrealized
| Realized PnL | Unrealized PnL | |
|---|---|---|
| From | Disposals that happened | Positions still held |
| Tax | Feeds the taxable gain | Generally not taxable (individuals) |
| Use | Tax computation | Portfolio performance |
A portfolio view blends both for performance; a tax computation needs the realized line isolated and on the correct basis method (see realized vs unrealized). Mixing them is the classic "why do I owe tax on a paper gain" confusion.
Fees are not optional
- Acquisition fees generally increase the cost basis.
- Disposal fees generally reduce proceeds.
- Network gas is captured under a consistent, documented policy.
Ignoring fees overstates the gain. They attach to the specific transaction and are never netted away invisibly, the same discipline as reconciliation. The exact deductibility of particular fees can be jurisdiction-specific, so document the policy and confirm the edge cases.
Why the exchange number is wrong for tax
An exchange PnL display is an indicative performance figure, not the tax figure, because it typically:
- covers one venue only and ignores your other wallets and exchanges;
- uses a simple running or average method, not your jurisdiction's mandated one;
- may misclassify self-transfers as disposals (see internal transfer vs disposal);
- excludes off-venue acquisitions that set the real basis.
The taxable gain needs a complete, cross-wallet, jurisdiction-correct computation, not a venue widget.
Practical guidance
- Isolate realized PnL for tax — disposals only, on the mandated basis method.
- Report unrealized PnL separately as performance, not as taxable gain.
- Attach fees to transactions — acquisition into basis, disposal against proceeds.
- Use a complete, cross-wallet history — not a single exchange's view.
- Set the basis method per jurisdiction — the formula is constant, the method is not.
- Keep performance PnL and taxable gain as distinct outputs of the same data.
Choosing a tool: separating performance from tax
A portfolio tracker and a tax engine are doing different jobs, and the gap matters most when a single tool claims to do both, as Koinly, CoinTracker and others do. Before you treat a tool's output as your taxable gain rather than a performance read, check that it:
- pulls in every wallet and exchange, not just the venues with an easy API, since an off-venue acquisition sets the real basis;
- attaches acquisition fees to basis and disposal fees to proceeds, rather than dropping them or netting them invisibly;
- classifies wallet-to-wallet transfers as non-events, so they never appear as disposals in the realized line;
- exposes the taxable figure as a separate output from the performance figure, rather than echoing the exchange's own PnL widget.
If a tool cannot show you the realized line on its own, on your jurisdiction's method, it is giving you performance dressed up as a tax number.
Worked example: realized PnL vs exchange-app display vs taxable gain
The following illustrates why three figures — exchange display, total portfolio PnL, and taxable gain — routinely disagree on the same activity.
Fact pattern: A US trader holds BTC on two platforms.
- Exchange A: bought 1 BTC at $28,000 on 1 March 2025. Sold 1 BTC on 15 October 2025 for $62,000. Exchange fee: $62 (charged in USD, deducted from proceeds).
- Exchange B: bought 0.5 BTC at $55,000 ($27,500 total) on 1 August 2025. Still held.
- Self-transfer: moved 0.5 BTC from Exchange A to a hardware wallet in April 2025 before the sale.
What Exchange A's app shows: Exchange A's PnL widget sees a purchase at $28,000 and a sale at $62,000 — it displays a gain of $34,000. It does not know about the $62 fee, typically does not adjust for it, and shows no unrealized position because it cannot see Exchange B.
Correct realized PnL calculation (Exchange A disposal):
Realized PnL = $62,000 (proceeds) − $28,000 (cost basis, FIFO, per-wallet) − $62 (disposal fee) = $33,938
The holding period is over 7 months (March to October 2025), which for a US taxpayer is less than 12 months — short-term, taxed as ordinary income.
Self-transfer classification: The April 2025 movement of 0.5 BTC from Exchange A to the hardware wallet is a self-transfer between own wallets — not a disposal. It carries cost basis with it (half the $28,000 basis, i.e. $14,000) but generates no realized gain and is excluded from the taxable line. A tool that misclassifies this as a disposal would manufacture an additional $0 gain or loss (proceeds of $0 and basis of $14,000 = a phantom $14,000 loss), distorting both PnL and cost basis for the remaining units.
Unrealized PnL on Exchange B: The 0.5 BTC bought at $55,000 and still held is a paper position. If BTC is at $62,000 at period-end, the unrealized PnL = (0.5 × $62,000) − $27,500 = $3,500. This is portfolio performance — it feeds no taxable gain and is shown separately from the realized line.
Total performance PnL vs taxable gain:
| Metric | Amount |
|---|---|
| Exchange A realized gain (with fee) | $33,938 |
| Unrealized PnL on Exchange B | $3,500 |
| Total performance PnL | $37,438 |
| Taxable gain (realized only) | $33,938 |
The two figures differ by the unrealized position. Both are computed from the same transaction history but answer different questions: performance answers "how did the portfolio do?"; taxable gain answers "what do I owe tax on?". Mixing them — reporting the $37,438 as taxable income — overstates tax; ignoring fees — reporting $34,000 — also overstates by $62.
Where Wag3s fits
Wag3s Folio computes realized PnL as proceeds minus cost basis minus fees on your jurisdiction's mandated method, across every wallet rather than a single venue, and keeps the unrealized performance view on a separate line so the two never blur. Self-transfers are excluded from the realized figure and carry their basis across, and fees are attached to the transactions they belong to. The result is a performance number and a taxable number that are each internally consistent. The taxable line is built to be reviewed by a qualified tax adviser before it reaches a return, not to substitute for that review.
Further reading
- Crypto Cost Basis Methods 2026
- Realized vs Unrealized Gains in Crypto
- FIFO vs LIFO vs HIFO for Crypto
- Internal Transfer vs Disposal in Crypto
- Crypto Capital Gains Calculation France (150 VH bis)
- Crypto Bank Reconciliation: Subledger to General Ledger
Sources
- IRS — Frequently asked questions on digital asset transactions: gain or loss on a disposition is proceeds less adjusted basis, and basis includes acquisition costs such as fees.
- IRS — Rev. Proc. 2024-28: per-wallet/account basis and the FIFO or Specific Identification methods used to compute the US realized line from 2025.
- Jurisdiction basis methods: HMRC Cryptoassets Manual CRYPTO22200 (UK Section 104 pool); Germany § 23 EStG (FIFO); Canada CRA crypto-asset income (adjusted cost base); France Article 150 VH bis (Légifrance).
Crypto Tax-Lot Selection: Specific Identification, Done Right (2026)
Specific identification lets you choose which crypto lot is sold — but only if done at or before the sale with adequate records, and per-wallet after IRS Rev. Proc. 2024-28. The standing-instruction requirement, what counts as adequate records, and why an after-the-fact spreadsheet fails.
US Crypto Per-Wallet Cost Basis: Rev. Proc. 2024-28 (2026)
From 1 January 2025 US crypto cost basis must be tracked per wallet and account — universal/aggregate is gone. IRS Rev. Proc. 2024-28's per-wallet rule, the one-time safe harbor for pre-2025 basis, the FIFO/Specific-ID methods, and the Form 1099-DA timeline (proceeds 2025, basis 2026).
Every chain, integration, and competitor mentioned in this article gets its own page — coverage detail, comparison signals, and the audit trail your finance team needs.
- Calculator
Free Crypto Tax Calculator
Connect a wallet and export tax-ready reports (IRS, HMRC, DGFiP). Free during Alpha.
View page - Chain
Ethereum
ERC-20, DeFi positions, gas treatment, restaking.
View page - Chain
Solana
SPL tokens, native stake, Jupiter, Metaplex NFTs.
View page - Integration
NetSuite integration
Mid-market and enterprise crypto subledger.
View page - Integration
QuickBooks integration
SMB GL with daily JE sync.
View page - Integration
Safe integration
DAO and corporate multi-sig accounting.
View page