Folio v0.9 — CEX + On-chain Consolidation is liveSee what's new →

Crypto Portfolio PnL Calculation: Proceeds, Basis, Fees, and the Realized Line (2026)

Tax·

Crypto Portfolio PnL Calculation: Proceeds, Basis, Fees, and the Realized Line (2026)

Portfolio PnL is not the number an exchange app shows. Realized PnL is proceeds minus cost basis minus fees on a jurisdiction-correct basis method; unrealized PnL is mark-to-market on holdings. The fee treatment, the realized/unrealized split, and why performance PnL is not the taxable gain.
Author avatar Wag3s TeamEditorial team specializing in Web3 finance, crypto tax, and DAO operations. Based in Zurich, Switzerland.

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 PnL number on an exchange app and the gain on your tax return are different figures computed from the same trades — and confusing them is how people both misjudge performance and misfile. This guide is the realized/unrealized split, the fee treatment, and why the two numbers diverge.

TL;DR

  • Realized PnL = proceeds − cost basis − fees, basis on the jurisdiction-mandated method.
  • Unrealized PnL = mark-to-market on what you still hold — paper performance, generally not taxable (individuals, realization regime).
  • Fees: acquisition fees raise basis, disposal fees reduce proceeds, gas per a consistent policy.
  • The basis method (not the arithmetic) is the jurisdiction-specific part — see cost-basis methods.
  • Exchange-app PnL ≠ taxable gain — single venue, simple method, ignores other wallets/self-transfers.
  • Performance PnL and taxable gain are different outputs — compute them 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/Spec-ID from 2025, UK Section 104 pooling, German FIFO, Canadian ACB, French 150 VH bis. Two tools that disagree on the same trades disagree on the basis method, not the formula.

Realized vs unrealized

Realized PnLUnrealized PnL
FromDisposals that happenedPositions still held
TaxFeeds the taxable gainGenerally not taxable (individuals)
UseTax computationPortfolio 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 cost basis.
  • Disposal fees → generally reduce proceeds.
  • Network gas → captured per a consistent, documented policy.

Ignoring fees overstates the gain. Fees attach to the specific transaction, never netted invisibly — the same discipline as reconciliation. Exact deductibility of specific fees can be jurisdiction-specific; document the policy and confirm 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 — ignores other wallets/exchanges;
  • uses a simple running/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

  1. Isolate realized PnL for tax — disposals only, on the mandated basis method.
  2. Report unrealized PnL separately as performance, not as taxable gain.
  3. Attach fees to transactions — acquisition into basis, disposal against proceeds.
  4. Use a complete, cross-wallet history — not a single exchange's view.
  5. Set the basis method per jurisdiction — the formula is constant, the method is not.
  6. Keep performance PnL and taxable gain as distinct outputs of the same data.

How vendor tools handle PnL

Koinly and CoinTracker separate realized from unrealized PnL and compute the taxable line on the jurisdiction method. Confirm the tool aggregates all wallets/exchanges, attaches fees correctly, does not treat self-transfers as realized, and outputs a tax figure distinct from a performance figure rather than echoing an exchange widget.

How Wag3s helps

Wag3s Folio computes realized PnL as proceeds minus cost basis minus fees on your jurisdiction's mandated method across every wallet, reports unrealized performance separately, and excludes self-transfers from the realized line — so the tax figure and the performance figure are each correct and distinct. See the Folio product page.


Further reading

Sources

  • Realized gain identity: proceeds − cost basis − allowable fees; cost basis on the jurisdiction-mandated method
  • Realized (taxable, disposal-based) vs unrealized (mark-to-market, generally non-taxable for individuals) distinction
  • Fee treatment: acquisition fees into basis, disposal fees against proceeds (jurisdiction-specific deductibility for edge cases)
  • Jurisdiction basis methods: US Rev. Proc. 2024-28 per-wallet; UK Section 104; Germany FIFO; Canada ACB; France 150 VH bis
Editorial disclaimer
This article is informational and does not constitute tax or investment advice. PnL for performance and taxable gain are different computations; the latter is jurisdiction-specific. Confirm with a qualified adviser.