Skip to main content

Presales and ICOs

How to account for presales, initiation coin offerings, etc.

Written by Jack

Buying tokens with delayed delivery (receipt of acquired assets) isn't uncommon in crypto. These types of transactions are usually called:

  • ICO (Initial Coin Offering)

  • IEO (Initial exchange Offering)

  • IDO (Initial DEX Offering)

  • Token presale, or fair launch

The general timeframe of such transactions is always similar:

  1. ↗️ Withdrawal of pledged tokens
    You send your crypto (ETH, USDC, etc.) to a contract or custodian

    • At this point, you are usually promised a specific amount of presale tokens for your assets, e.g. "You will receive 500 $LIFE tokens for your 1 ETH")

  2. ⏳ Time passes

  3. ↘️ Deposit of presale tokens
    You receive a previously agreed amount of presale tokens in your wallet

Accounting for time-delayed trades like that may be tricky as there's no way to "link" transactions that are days (often months) apart. This article provides steps on how to adjust such transactions to properly record the cost basis and capital gains.

Valuation of presale tokens

There are two ways of deciding what is the value of your presake tokens once you receive them and, in turn, what gain/loss you incurred by participating in this presale:

  1. Presale tokens are worth as much as pledged tokens on the day they were sent

  2. Presale tokens are worth as much as their market value on the day of receipt

The first approach seem to be more common, so this is the one we describe in more detail below.

Adjusting presale transactions

While you cannot "link" presale transactions in Koinly, you can easily ensure that the worth of the two transactions match and, by doing so, you effectively turn them into a trade.

  1. 🔍 Note the value of pledged tokens on the participation day

    • Find the transaction where you sent your pledged tokens

    • Note/copy the worth (market value) of this transaction

    • Adjust if you believe the worth set by Koinly is wrong

    • Depending on the cost basis of pledged tokens, Koinly may calculate a capital gain (or a loss) here

  2. 📝 Set this value as the worth of presale tokens on the day of receipt

    • Find the transaction where presale tokens were deposited to your wallet

    • Presale tokens will often be missing the price completely on this day (will show "Market prices for XYZ are missing" error)

    • Set the worth of those tokens to match the worth of pledged tokens

    • This will establish the cost basis of received tokens

📌 Example: XPL presale

  • You participate in XPL presale by sending 5k USDT on Jul 17th 1st 2025

  • You receive your XPL tokens on Sept 25th 2025

  • You sell XPL tokens on the same day for 20.5k USDT0

Status after importing

Without any adjustments, Koinly assumes the worth of $XPL tokens received is the same as their market value on the day. Because of that, when you sell the tokens right away, there is no gain/loss calculated.

Adjustments

  1. 🔍 Note the value of pledged tokens on the participation day
    5k USDT worth 5k USD


  2. 📝 Set this value as the worth of presale tokens on the day of receipt
    Change worth of deposited XPL to 5k USD - same as worth of pledged tokens

Status after adjustments

After matching the value of pledged and presale tokens, Koinly now calculates a gain when selling XPL tokens:

Common issues and questions

Which presale token valuation method should I use?

There's no clear guideline to say whether one method is better than the other. If in doubt, please confirm it with your tax advisor.

What if my tokens were vested?

If your tokens were vested, you need to distribute the worth of pledged tokens proportionally between the deposits of vested tokens.

Continuing the example above - if the tokens were distributed in 4 equal tranches instead of one, you would assign the worth of $1250 (5000 / 4 =1250) to each:

I received a refund instead of tokens

If the presale didn't go through and you were refunded:

  • Find the participation transaction (withdrawal of pledged assets)

  • Tag it as "Add to Pool"

  • Find the refund transaction (deposit of pledged assets)

  • Tag it as "Remove from Pool"

Using the pool tags turns those transactions into non-taxable, so you receive the same tokens with the same cost basis as you pledged, and no capital gains are calculated at any point.

I never received anything back

If you sent out your pledged tokens but never received any presale tokens nor got your pledged tokens refunded, you may be able to treat it as a loss. You'll need to confirm this with your tax advisor, as adjustments needed depend on when you can record such a loss:

  1. Record a loss on the day you participated in the presale

    • Find the participation transaction (withdrawal of pledged assets)

    • Change the worth of the withdrawal to $0

    • Transaction will now calculate a capital loss equal to the cost basis of tokens pledged

  2. Record a loss on a different day

    • Find the participation transaction (withdrawal of pledged assets)

    • Edit it and change it into an exchange for 100 NULL1 tokens

    • On a day you're supposed to record the loss, create a manual withdrawal of 100 NULL1 tokens

    • NULL1 doesn't have a market price, so it will be automatically assumed $0, calculating a capital loss equal to the cost basis

I got a receipt NFT for my pledged tokens

That actually makes it easier - merge the pledged tokens withdrawal with the NFT into a trade (Exchange), and then merge the withdrawal (burn) of the NFT with the deposit of the presale tokens. The latter may still need its worth (market value) set manually.

Mind that if the presale tokens were vested, you should probably ignore the NFT (even delete it) and follow the steps for vested tokens mentioned above instead.

Did this answer your question?