India uses the FIFO (First In, First Out) method to calculate crypto cost of acquisition — your oldest purchase lots are matched against each sale first, and the profit is the sale price minus that oldest lot's cost. Getting this wrong directly changes how much tax you owe: using a higher-cost lot (like LIFO) would understate profits and is not accepted by the Indian tax department.
- Method: Match each sell to the oldest available buy lot first, then work forward chronologically
- Partial lots: If a buy lot is larger than the sell, allocate cost proportionally (e.g., selling 0.1 from a 0.5 BTC lot = 20% of that lot's cost)
- Per asset: FIFO queues are maintained separately for each coin — Bitcoin, Ethereum, etc. do not cross over
- Carries forward: Unsold lots retain their FIFO position across financial years
- Unmatched sells: If no buy record exists, the cost of acquisition is treated as zero — full sale amount is taxable
Here is a worked step-by-step FIFO example with multiple buys and two sales to show exactly how lot matching and partial-lot cost allocation work.
What is FIFO?
FIFO stands for First In, First Out. It's an accounting method that assumes the first units you bought are the first units you sell. Think of it like a queue at a movie theatre — the person who arrives first gets in first.
For crypto tax purposes, when you sell a portion of your holdings, FIFO matches that sale against your oldest purchase first, then the next oldest, and so on.
Why does India use FIFO? Because the Income Tax Act doesn't explicitly prescribe a method for VDA cost of acquisition, and FIFO is the default method used for inventory/asset costing under Indian accounting standards. The tax department expects you to use FIFO unless there's a specific reason to use another method (there usually isn't for crypto).
Why Does It Matter?
If you bought crypto at different prices over time, the method you use to determine cost of acquisition directly affects your taxable profit. Let me show you.
Say you own 2 BTC total — one bought at ₹10,00,000 and another at ₹15,00,000. You sell 1 BTC for ₹18,00,000.
- FIFO (correct): Uses the ₹10,00,000 buy → Profit = ₹8,00,000 → Tax = ₹2,49,600
- LIFO (wrong): Would use the ₹15,00,000 buy → Profit = ₹3,00,000 → Tax = ₹93,600
That's a ₹1,56,000 difference in tax. In a bull market where your early buys were cheapest, FIFO generally results in higher taxable gains. It's not the most taxpayer-friendly method, but it's the one you need to follow.
Step-by-Step FIFO Example
Let's work through a realistic scenario. Ankit made these Bitcoin trades during FY 2024-25:
Purchases (Buys)
- Buy #1 — April 15, 2024: 0.3 BTC at ₹55,00,000/BTC → Cost: ₹16,50,000
- Buy #2 — July 20, 2024: 0.5 BTC at ₹48,00,000/BTC → Cost: ₹24,00,000
- Buy #3 — November 5, 2024: 0.2 BTC at ₹70,00,000/BTC → Cost: ₹14,00,000
Total holdings: 1.0 BTC. Total cost: ₹54,50,000.
Sale #1 — January 10, 2025: Sells 0.4 BTC at ₹72,00,000/BTC
Sale proceeds: 0.4 × ₹72,00,000 = ₹28,80,000
Now FIFO kicks in. We match against the oldest buy first:
- From Buy #1: Use all 0.3 BTC → Cost: ₹16,50,000 (Buy #1 is now fully consumed)
- From Buy #2: Use 0.1 BTC out of 0.5 BTC → Cost: 0.1/0.5 × ₹24,00,000 = ₹4,80,000 (Buy #2 has 0.4 BTC remaining)
Total cost of acquisition for this sale: ₹16,50,000 + ₹4,80,000 = ₹21,30,000
Profit on Sale #1: ₹28,80,000 - ₹21,30,000 = ₹7,50,000
Remaining Holdings After Sale #1
- Buy #1: Fully used (0 BTC left)
- Buy #2: 0.4 BTC remaining, cost basis: ₹19,20,000
- Buy #3: 0.2 BTC remaining, cost basis: ₹14,00,000
Sale #2 — March 15, 2025: Sells 0.5 BTC at ₹65,00,000/BTC
Sale proceeds: 0.5 × ₹65,00,000 = ₹32,50,000
FIFO matches against the next oldest available lot:
- From Buy #2 (remaining): Use all 0.4 BTC → Cost: ₹19,20,000 (Buy #2 is now fully consumed)
- From Buy #3: Use 0.1 BTC out of 0.2 BTC → Cost: 0.1/0.2 × ₹14,00,000 = ₹7,00,000 (Buy #3 has 0.1 BTC remaining)
Total cost of acquisition for this sale: ₹19,20,000 + ₹7,00,000 = ₹26,20,000
Profit on Sale #2: ₹32,50,000 - ₹26,20,000 = ₹6,30,000
The Complete Picture
Here's how the full FIFO matching looks laid out:
Buy Lot Consumption Table
Buy #1 (0.3 BTC @ ₹55L/BTC)
→ 0.3 BTC used in Sale #1 | Cost allocated: ₹16,50,000 | Status: Fully consumed
Buy #2 (0.5 BTC @ ₹48L/BTC)
→ 0.1 BTC used in Sale #1 | Cost allocated: ₹4,80,000
→ 0.4 BTC used in Sale #2 | Cost allocated: ₹19,20,000 | Status: Fully consumed
Buy #3 (0.2 BTC @ ₹70L/BTC)
→ 0.1 BTC used in Sale #2 | Cost allocated: ₹7,00,000 | Status: 0.1 BTC remaining
Tax Summary
- Sale #1 profit: ₹7,50,000
- Sale #2 profit: ₹6,30,000
- Total taxable gain: ₹13,80,000
- Tax at 30%: ₹4,14,000
- Cess at 4%: ₹16,560
- Total tax: ₹4,30,560
Remaining holding: 0.1 BTC with a cost basis of ₹7,00,000 (from Buy #3). This will be the first lot matched when Ankit sells again in the future.
How Partial Lots Work
You saw this in the example above — Buy #2 was split across two sales. This is called partial lot matching, and it's very common. The math is proportional:
If you bought 0.5 BTC for ₹24,00,000 and you only need 0.1 BTC for a sale, the cost allocated is:
(0.1 / 0.5) × ₹24,00,000 = ₹4,80,000
The remaining 0.4 BTC retains its proportional cost of ₹19,20,000 and stays in the queue for future sales. Think of it like cutting a cake — each slice gets a proportional share of the total cost.
FIFO Gets Complicated With Multiple Assets
FIFO is computed per asset. Your Bitcoin buys match against Bitcoin sells. Your Ethereum buys match against Ethereum sells. They don't cross over.
So if you have 50 different coins across 3 exchanges, you're running 50 separate FIFO queues — one for each asset. This is where manual calculation becomes impractical. For 10 trades, a spreadsheet works fine. For 500+ trades across multiple assets? You need automation.
What Happens When You Sell More Than You Bought?
Sometimes you'll have sells that can't be matched to any buy. This happens when:
- You received crypto from an airdrop, staking reward, or gift that you didn't track as a "buy"
- You transferred crypto from another exchange and only uploaded one exchange's data
- You've been trading for years but only have records from the current financial year
These are called "unmatched sells." The tax department's position is that if you can't prove your cost of acquisition, it's treated as zero. That means the entire sale amount becomes your taxable profit.
Ouch. That's why keeping complete records across all exchanges and wallets is so critical. If you bought 1 ETH on Binance and sold it on CoinDCX, you need data from both exchanges to prove your cost of acquisition.
Common FIFO Mistakes
- Using average cost instead of FIFO: Some traders calculate their average buy price and use that. This isn't FIFO and can result in incorrect tax amounts.
- Not accounting for crypto-to-crypto trades: If you bought BTC and traded it for ETH, that BTC-to-ETH trade is a sell of BTC. You need to apply FIFO to determine the BTC cost of acquisition.
- Ignoring exchange fees in cost basis: Under 115BBH, fees can't be deducted from your profits. But the cost of acquisition itself (what you paid) is your buy price. If you paid ₹1,00,000 for a coin plus a ₹100 buy-side exchange fee, your cost of acquisition is ₹1,00,100 — but fees on the sell side are a separate, non-deductible expense.
- Mixing up financial years: FIFO doesn't reset on April 1. If you bought crypto in FY 2023-24 and sell in FY 2024-25, the old buy is still your cost of acquisition. The queue carries forward.
Let CryptoITR Handle the Math
Here's the reality: if you have more than a handful of trades, doing FIFO by hand is tedious and error-prone. You need to sort all buys chronologically per asset, match each sell against the oldest available lot, handle partial lots with proportional cost allocation, and keep track of remaining quantities.
CryptoITR does all of this automatically. Upload your trade reports from any supported exchange, and our FIFO engine matches every sell to the correct buy lots, computes your cost basis, and calculates the exact tax owed — including per-asset gains and losses, TDS credits, and cess. You get the numbers ready for Schedule VDA without touching a spreadsheet.
