PrivateACB

Documentation › United Kingdom

UK Capital Gains Formulas

Technical reference for the mathematical formulas PrivateACB uses to calculate UK Capital Gains Tax. This guide covers the Section 104 pool, cost apportionment for matching rules, and worked examples.

Section 104 Pool Formula#

Each cryptocurrency has its own Section 104 pool tracking two values:

  • Pool quantity (Q) — total tokens in the pool
  • Pool cost (C) — total allowable cost in GBP

On Acquisition (Unmatched)#

When tokens are acquired and not consumed by same-day or 30-day matching:

Q_new = Q_old + acquired_quantity
C_new = C_old + acquired_cost

On Disposal (Pool Portion)#

When tokens are disposed from the pool:

Disposed_cost = C × (disposed_quantity ÷ Q)
Q_new = Q - disposed_quantity
C_new = C - Disposed_cost

Pool Average Cost#

Average_cost = C ÷ Q

The average cost per token stays the same after a disposal — only the total quantity and total cost decrease proportionally.


Same-Day Matching Cost (Section 105)#

Consolidation#

All same-day acquisitions are consolidated into a single acquisition:

Consolidated_acq_quantity = Σ(all same-day acquisition quantities)
Consolidated_acq_cost = Σ(all same-day acquisition costs)

All same-day disposals are consolidated into a single disposal:

Consolidated_disp_quantity = Σ(all same-day disposal quantities)
Consolidated_disp_proceeds = Σ(all same-day disposal proceeds)

Cost Allocation#

If the disposal quantity is less than or equal to the acquisition quantity:

Same_day_cost = Consolidated_acq_cost × (Consolidated_disp_quantity ÷ Consolidated_acq_quantity)

If the disposal quantity exceeds the acquisition quantity, only the acquisition quantity is matched:

Same_day_matched_quantity = Consolidated_acq_quantity
Same_day_cost = Consolidated_acq_cost
Remainder = Consolidated_disp_quantity - Consolidated_acq_quantity

The remainder passes to the 30-day rule.


30-Day Matching Cost (Section 106A)#

Matching Order#

Acquisitions within the 30-day window are matched in chronological order (earliest first):

Window_start = disposal_date + 1 day
Window_end = disposal_date + 30 days

Cost Allocation Per Acquisition#

For each acquisition in the window, starting with the earliest:

Matched_quantity = MIN(remaining_disposal_quantity, available_acquisition_quantity)
Matched_cost = acquisition_cost × (Matched_quantity ÷ acquisition_quantity)

The acquisition’s available quantity decreases as it’s consumed by disposals. Earlier disposals have priority.

Multiple Acquisitions#

If the disposal spans multiple acquisitions:

Total_30day_cost = Σ(Matched_cost for each acquisition)
Total_30day_quantity = Σ(Matched_quantity for each acquisition)

Any remaining disposal quantity after exhausting the 30-day window passes to the Section 104 pool.


Disposal Gain/Loss#

Complete Formula#

Gain_or_Loss = Proceeds - (Same_day_cost + Thirty_day_cost + Pool_cost)

Where:

  • Proceeds = total GBP proceeds from the disposal
  • Same_day_cost = cost from same-day matching (may be £0)
  • Thirty_day_cost = cost from 30-day matching (may be £0)
  • Pool_cost = cost from Section 104 pool for remaining quantity (may be £0)

If Gain_or_Loss > 0, it’s a chargeable gain. If Gain_or_Loss < 0, it’s a capital loss.

Match Type Classification#

PrivateACB classifies each disposal by which rules contributed:

Match TypeMeaning
Same-day100% of disposal matched by same-day rule
30-day100% of disposal matched by 30-day rule (no same-day)
Pool100% of disposal matched from Section 104 pool
MixedTwo or more rules contributed to the disposal

Pool Update After Disposal#

Only the pool portion of a disposal affects the pool:

Pool_disposed_quantity = Total_disposed_quantity - Same_day_matched_quantity - Thirty_day_matched_quantity
Pool_disposed_cost = Pool_cost × (Pool_disposed_quantity ÷ Pool_quantity)

New_pool_quantity = Pool_quantity - Pool_disposed_quantity
New_pool_cost = Pool_cost - Pool_disposed_cost

Tokens matched by same-day or 30-day rules do not affect the pool.


Annual Exempt Amount (AEA)#

Application#

Net_gains = Total_gains - Total_losses
Taxable_gains = MAX(0, Net_gains - AEA)
Estimated_tax = Taxable_gains × CGT_rate

AEA Amounts by Tax Year#

Tax YearAEA
2024/25 onwards£3,000
2023/24£6,000
2022/23 and earlier£12,300

CGT Rates (from 30 October 2024)#

BandRate
Basic rate18%
Higher rate24%

Income Tax Rate (Separate from CGT)#

Crypto income — staking, mining, airdrops, lending interest — is taxed at the taxpayer’s Income Tax rate, not their CGT rate. The dashboard exposes a separate Income tax rate dropdown with options 20% (basic), 40% (higher), 45% (additional). It controls only the estimated-tax-on-income display; the CGT calculation above is unaffected.

Estimated_income_tax = Total_crypto_income × Income_tax_rate
Total_estimated_tax  = Estimated_income_tax + (Taxable_gains × CGT_rate)

HMRC Rounding#

HMRC expects pro-rata costs to be rounded up to the nearest pound for allowable costs. PrivateACB maintains full decimal precision internally and applies rounding in reports and PDF exports.


Worked Example: All Three Rules (TC6 / CRYPTO22256)#

This example demonstrates the complete calculation flow using all three matching rules.

Setup: 100,000 token F in pool, total cost £300,000.

Transactions#

DateTransactionQuantityAmount
31 JulBuy10,000£45,000
31 JulSell30,000£150,000
5 AugSell20,000£100,000
6 AugBuy50,000£225,000
7 AugSell100,000£150,000

Step 1: Build Match Table (Pass 1)#

31 Jul disposal (30,000 tokens):

  • Same-day: 10,000 tokens from 31 Jul acquisition
  • 30-day window (1 Aug — 30 Aug): 6 Aug acquisition has 50,000 tokens
  • Matched: 20,000 of 50,000 from 6 Aug
  • Remainder: 0 (30,000 = 10,000 same-day + 20,000 thirty-day)

5 Aug disposal (20,000 tokens):

  • Same-day: none
  • 30-day window (6 Aug — 4 Sep): 6 Aug acquisition has 30,000 remaining
  • Matched: 20,000 of 30,000 from 6 Aug
  • Remainder: 0

7 Aug disposal (100,000 tokens):

  • Same-day: none
  • 30-day window (8 Aug — 6 Sep): no acquisitions
  • Remainder: 100,000 → pool

Step 2: Process Transactions (Pass 2)#

31 Jul acquisition (10,000 tokens, £45,000):

  • Matched to 31 Jul disposal → diverted, does not enter pool

31 Jul disposal (30,000 tokens, £150,000):

  • Same-day cost: £45,000 (10,000 tokens)
  • 30-day cost: £225,000 × (20,000/50,000) = £90,000 (20,000 tokens)
  • Pool cost: £0 (0 tokens)
  • Gain: £150,000 - £45,000 - £90,000 = £15,000

5 Aug disposal (20,000 tokens, £100,000):

  • Same-day cost: £0
  • 30-day cost: £225,000 × (20,000/50,000) = £90,000 (20,000 tokens)
  • Pool cost: £0
  • Gain: £100,000 - £90,000 = £10,000

6 Aug acquisition (50,000 tokens, £225,000):

  • 40,000 matched to disposals → diverted
  • 10,000 unmatched → enter pool
  • Pool update: 100,000 + 10,000 = 110,000 tokens; £300,000 + £45,000 = £345,000

7 Aug disposal (100,000 tokens, £150,000):

  • Same-day cost: £0
  • 30-day cost: £0
  • Pool cost: £345,000 × (100,000/110,000) = £313,636
  • Loss: £150,000 - £313,636 = -£163,636

Summary#

DisposalMatch TypeGain/Loss
31 JulMixed (same-day + 30-day)+£15,000
5 Aug30-day+£10,000
7 AugPool-£163,636
Total-£138,636

Comparison: CA vs US vs AU vs UK#

FormulaCanadaUnited StatesAustraliaUnited Kingdom
Cost methodWeighted average (ACB)Lot cost (per parcel)Lot cost (per parcel)Same-day/30-day cost, then pool average
Gain formulaProceeds - ACB per unit × qtyProceeds - lot costProceeds - lot costProceeds - (SD cost + 30d cost + pool cost)
Loss adjustmentDenied loss → added to ACBDeferred loss → added to replacement basisNoneNo adjustment — matching changes cost used
Inclusion/discount50% inclusion rateST/LT rates50% discount (>12 months)AEA deduction (£3,000)
Tax formula(Gain × 50%) × marginal rateST @ ordinary + LT @ LTCG rateQ18 netting then discount(Net gains - AEA) × CGT rate


Last Updated: July 2026 PrivateACB Version: 2.12.0