Skip to main content
Advanced Custom CSV Import

A Guide to Importing Unsupported Integration via the Advanced Custom CSV

Patrick McGimpsey avatar
Written by Patrick McGimpsey
Updated this week

The Advanced Custom CSV feature in Crypto Tax Calculator (CTC) allows users to import data from unsupported integrations, providing greater flexibility in managing their transactions. Below is a detailed guide covering everything you need to know about using Custom CSV.

Important: If manually importing transactions from multiple exchanges or wallets, create a separate CSV for each source. Combining them into one file may cause confusion between source and destination accounts in the app.


Step 1: Complete the Advanced Custom CSV

Gather the data you want to import from your crypto account. This can be:

  • A CSV file from a blockchain explorer or exchange.

  • A manually recorded transaction history if your crypto account doesn’t provide downloadable data.

How to Fill in the Custom CSV Columns

The table below provides a detailed guide on what to enter in each column.

Column

Description

Timestamp (UTC)

The default format is YYYY-MM-DD HH:mm:ss. To use a different format, click on 'Advanced Options' when importing the file. (Check here for more details.)

Type

The type of transaction. Only valid transaction types can be used.

Base Currency

The asset related to the transaction type.

Base Amount

The amount (excluding fee) of the Base Currency.

Quote Currency (Optional)

  • Only required if you have a quote for the base asset.

  • Commonly used if the Type is buy or sell.

  • Leave it blank to let CTC automatically apply the market price after import.

Quote Amount
(Optional)

  • The amount (excluding fee) of the Quote Currency.

  • Only required if you have a quote for the base asset.

  • Commonly used if the Type is buy or sell.

Fee Currency

(Optional)

The currency in which the fee was paid.

Fee Amount

(Optional)

The amount of the Fee Currency.

From

(Optional)

  • The name of the source account.

  • Leave it blank to automatically use the exchange or wallet name from which you import the CSV.

  • Do not mix transactions from different sources in the same CSV. Create a separate file for each exchange or wallet to ensure accurate data mapping.

To

(Optional)

  • The name of the destination account.

  • Leave it blank to automatically use the exchange or wallet name from which you import the CSV.

  • Do not mix transactions from different sources in the same CSV. Create a separate file for each exchange or wallet to ensure accurate data mapping.

Blockchain

(Optional)

The blockchain where the transaction happened. This is particularly important for interacting with wallets that are imported on multiple chains.

Note: only the blockchains we support are valid. If an invalid blockchain is entered, this field will be ignored in the app.

ID

(Optional)

  • A unique transaction ID that you would like to associate with this transaction for easy searching.

  • Leave blank for CTC to automatically assign one.

(Optional)

The price per unit of the 'Base Currency'. If left blank, the price defaults to market price.

(Optional)

This is the currency of the Reference Price Per Unit.

  • Only fiat currencies are valid. Cryptocurrencies (including stablecoins) in this column will be ignored.

  • Only use this when Reference Price Per Unit is filled.

  • If left blank but with Reference Price Per Unit filled, this defaults to USD.

NOTE - if you have no information to input for some columns, please do NOT delete any columns as this will cause a fail in import parsing error.


How to Fill in the Custom CSV: Examples of Transaction Types

Trade Example

On March 2nd 2024 at 10:37:29, I bought 1 ETH with 3000 USDC, encountering a 1 USDC fee on Binance Exchange;

Transfer Example

On March 2nd 2024 at 11:33:17, I sent 1 ETH from Binance Exchange to my Metamask Wallet, encountering a 0.001 ETH fee;

Airdrop Example

On March 2nd 2024 at 13:47:11, I received 10000 ABC tokens on Mode Network from their airdrop, encountering a 0.001 ETH fee to claim;

Add Liquidity Example

On March 2nd 2024 at 14:07:23, I added 2 parts 0.5 ETH & 1500 USDC into the XYZ ETH/USDC Liquidity Pool encountering a 0.001 ETH fee, and obtained 0.0856 ETH/USDC LP Receipt Token;


Save as a CSV File

Once you've completed your file, save it in .csv (Comma-Separated Values) format to ensure compatibility.



Step 2: Importing the Custom CSV File

1. Navigate to the Accounts page and click '+ Add accounts'

2. You can import the Custom CSV for either a new unsupported exchange/wallet or add to an existing exchange/wallet for missing transactions;

Expand here if you are importing for a new unsupported exchange/chain/wallet.


Navigate to + Add accounts, then in the search field, type in the name of the unsupported exchange/wallet. After, click 'Import CTC Templated CSV (highlighted in green). We're always taking on feedback and looking for ways to improve, so please don't hesitate to click on 'Request an Integration' (highlighted in yellow);


Once clicked, drag and drop/upload the completed Custom CSV and click 'Import';

Expand here if you are adding missing transactions to an existing account.


Navigate to the exchange/wallet already imported found on your Accounts Page, then select 'Add Additional' (in this example, we will assume that we're adding some missing transactions for Bybit Exchange);


Now click on 'Upload File' and drag and drop/upload the completed Custom CSV;



3. Once imported, you will see a green tick showing that it has been successfully uploaded;


Valid Transaction Types

Use only the transaction types listed below in your Custom CSV.

  • Purchase of cryptocurrency, which increases the balance remaining and effects cost basis.

  • A sale of cryptocurrency, which decreases the balance remaining and triggers a capital gain event.

  • A deposit of your local currency into the exchange. Note that if you deposit a currency other than your local currency, you need to have a corresponding buy transaction of that currency. (e.g. if your country setting is AU, there should be AUD->USD transactions imported as USD is foreign currency for AU.)

  • Use this if you cashed out from an exchange into your bank account.

  • Use this if you have disposed of cryptocurrency to cover fee transactions generated as a result of other transactions, e.g., gas fees paid during on-chain Ethereum swaps. If using this category, don't include this fee amount in the fee column.

  • You approved the use of a smart contract. This is taxed the same way as a Fee, a disposal event. This category is listed in the Miscellaneous Expense Report.

  • A transfer of cryptocurrency to a wallet or exchange. Increases the balance remaining on the receiving address and decreases the balance remaining on the from address. Does not increase your overall balance remaining. Does not trigger a capital gain event.

  • A transfer of cryptocurrency from a wallet or exchange. Increases the balance remaining on the receiving address and decreases the balance remaining on the from address. Does not decrease your overall balance remaining. Does not trigger a capital gain event.

  • Use this if you acquired a new cryptocurrency as a result of a chain split (such as Bitcoin Cash being received by Bitcoin holders).

  • This acts similar to a Sell. You can use this if you want to categorize an outgoing transaction as an expense (e.g. business paying out a salary). This category is listed in the Miscellaneous Expense
    Report.

  • Triggers a capital loss event with the sale price being zero.

  • Use this if you have lost crypto. It triggers a capital loss event similar to the stolen category.

  • Use this if you have sent your crypto / NFT to a burner address. It triggers a capital loss event similar to the stolen category.

  • Triggers an income tax event based on the market value at the time of receipt. Increase the balance remaining, and is used for future cost basis calculations.

  • Similar to income but used for interest-bearing activities which don't suit other categories.

  • Use this if you received mining rewards (as a hobby).

  • Use this if you received a free token airdrop.

  • Use this if you earned interest from staking.

  • You deposited these coins into a staking pool. This acts similar to a withdrawal.

  • You have withdrawn these coins from the staking pool. This acts similar to a deposit.

  • Use this if you acquired a fee refund from trading and/or cryptocurrency as a cash-back (e.g., credit card payment).

  • Use this if you have received payments from secondary sales (e.g., being an NFT creator).

  • Use this if you spent crypto on personal use and you want to ignore this transaction for tax purposes. Warning - this is only valid in very specific individual circumstances. Check with your tax professional before using this option.

  • Use this if you have acquired cryptocurrency as a gift. If you have given a gift to someone else, use the sell category.

  • Use this If you have given a gift to someone else. This is similar to a sell.

  • Use this if you have received (acquired) a cryptocurrency or cash as a loan.

  • Use this if you have repaid a loan.

  • Use this if the lending platform you used has liquidated your collateral.

  • Used to transfer the cost basis from one blockchain to another.

    Note: A "bridge-in" must match a "bridge-out".

  • This acts similar to a 'buy'. A common use case is when a user is minting NFTs.

  • You have withdrawn these coins from a borrowing/lending platform. This acts similar to a deposit into your account.

  • You have set these coins aside as collateral for a loan. This acts as a withdrawal from your account.

  • You have added these coins into a liquidity pool

  • You have received tokens for adding coins into a liquidity pool.

  • You have removed these coins from a liquidity pool.

  • You have returned tokens for removing coins from a liquidity pool.

  • A failed transaction. This will be ignored from tax and balance calculations. Note - Any fees incurred from creating the transaction will be accounted for.

  • Mark the transactions as spam and ignore them from tax and balance calculations.

  • To account for a non-taxable transaction where one asset is traded for another. It works by assigning the cost basis and purchase date of the original asset to the new one.

  • You received crypto on a blockchain from a trade initiated on a different blockchain. This is the incoming side of a cross-chain trade.

  • You traded crypto on one blockchain and sent it to another blockchain via a bridge. This is the outgoing side of a cross-chain trade.

Derivative Categories

  • Use this if you have performed margin, futures, derivates, etc. type trades and realized a profit from your trading activity.

  • Use this if you have performed margin, futures, derivates, etc., type trades, and realized a loss of your trading activity.

  • Use this if you have paid fees associated with realized-profit or realized-loss trades.

  • You opened or increased a position by investing crypto from your account (for derivatives).

  • You closed or reduced a position and received returns into your account (for derivatives).

  • You opened or increased a position and received a position token (for derivatives).

  • You closed or reduced a position by returning the position token (for derivatives).


What is the Reference Price?

The Reference Price Per Unit is the price per unit of the Base Currency. For example, if the Base Currency is 'ETH', and you purchased it for 100 AUD instead of the market price, you should fill in the columns as below:

  • Reference Price Per Unit: 100

  • Reference Price Currency: AUD

If you only fill in the following;

  • Reference Price Per Unit: 100

  • Reference Price Currency: (blank)

The ETH price will be calculated as 100 USD.

The Reference Price Currency needs to be local currencies. Cryptocurrencies (including stablecoins) in this column will be ignored. If the Reference Price Currency is not defined, then we default to "USD". The value will be converted to your local currency in CTC once the CSV is imported. For more details about the foreign currency rates, please check this guide.

How to Import Trades

You can import trades using the Advanced Custom CSV Template by assigning the correct buy or sell transaction type.

Example: ETH/USDT Trade

You swapped 1 ETH ⇄ 2000 USDT.

  • If you sold 1 ETH for 2000 USDT:

    • Type: Sell

    • Base Currency: ETH

    • Base Amount: 1

    • Quote Currency: USDT

    • Quote Amount: 2000

  • If you sold 2000 USDT for 1 ETH:

    • Type: Buy

    • Base Currency: ETH

    • Base Amount: 1

    • Quote Currency: USDT

    • Quote Amount: 2000

📌 Important: Fees should be recorded in the Fee Currency and Fee Amount columns. The Base Amount and Quote Amount should not include fees.


Advanced Options

The advanced options drop-down menu allows you to manually assign currencies and select custom date formats for your CSV;

Manually Assign Currencies

You can select the tickers that appear on your CSV that you would like to assign to a specific currency. Any tickers not specified will be assigned by their market cap ranking where possible;


Manually Select Date Format

You can select the date format which appears on your CSV. If left unspecified, the date we recognized will default to YYYY-MM-DD HH:MM:ss;


Frequently Asked Questions (FAQs)

Q1: My CSV fails to import. What's wrong with it?

There are a number of reasons why your CSV fails to import.

Issue

What to do?

Deleted columns

It is important to keep all columns, even if some are optional and not filled in. Deleting any column could cause the import to fail.

Incorrect timestamp format

Double-check your timestamp and ensure that it follows our supported timestamp format. Check all supported timestamp formats here.

Invalid transaction type

Review the transaction types you used and ensure you use only valid ones. The data will not be imported if you use an invalid transaction type. Click here for the list of valid transaction types.

Required columns are not filled in

The custom CSV import requires the first four columns to be filled in: Timestamp (UTC), Type, Base Currency, and Base Amount. The data won't be imported if any of these columns are missing.

Q2: Can I use any timestamp format?

The default format is set as YYYY-MM-DD HH:mm:ss. You can also select different time formats by clicking "Advanced Options" when importing. Click here to see the list of other supported timestamp formats.


​Q3: The timestamp on my CSV is on my local time or a different time zone. Is it okay to use that?

The Advanced Custom CSV should be in Universal Time Coordinated (UTC). After importing your file, the timestamp will automatically adjust to your CTC account's local time setting. If your CSV is in a different time zone, please adjust your timestamp to UTC to ensure your data will have the correct local time once imported.

Q4: Do I need to fill in all of the columns?

Some columns are optional; you will see the word 'optional' on their headers. These columns are not mandatory to be filled in.

  • For non-trade transactions, you must fill in the first four columns:

    • Timestamp (UTC)

    • Type

    • Base Currency

    • Base Amount.

  • For trade (buy and sell) transactions that you want to be grouped as a 'Trade', you must fill in the first six columns.

    • Timestamp (UTC)

    • Type

    • Base Currency

    • Base Amount

    • Quote Currency

    • Quote Amount.

Note: If you record the 'Buy' and 'Sell' transactions as separate rows, they will be treated as two separate transactions and can not be grouped as a single 'Trade'. Follow the example in this section to ensure your 'Buy' and 'Sell' transactions are grouped as a 'Trade'.

Q5: Fee columns are optional. Should I include the fees?

The Fee Currency and Fee Amount columns are optional, as not all transactions include a fee. However, filling out the fee columns is important if your transactions have a fee. This ensures that your fees are accounted for accurately, which is essential in determining your balances and gains/losses.

​Q6: My transactions should show as 'Trade', but it's not working.

If you record the 'Buy' and 'Sell' transactions as separate rows in the Custom CSV, they will be processed as two separate transactions and can not be grouped as a single 'Trade'. To ensure your transaction is correctly imported as a 'Trade', follow the guide in the How to Import Trades section.

Q7. I don't want to import my CSV file as a custom/manual/new source. Can I import it to an existing account?

Absolutely! You can import the custom CSV into an existing account, and the Advanced Custom CSV can be used in any of our existing integrations.

Q8: How do I record the price I paid for my asset?

When you import your transactions using a custom CSV file, CTC automatically applies the market price if a price feed for that asset is available. However, if you want to record the actual price you paid, you can override the market price by entering the price details in the following columns:

  • Reference Price Per Unit: Enter the price you paid per unit.

  • Reference Price Currency: Specify the local currency used for the transaction.

For example, if you purchased 2 ETH for 100 AUD each, you would enter 100 in the Reference Price Per Unit field and AUD in the Reference Price Currency field. Note that if you leave the Reference Price Currency blank, it will default to USD.


Still Need Further Support?

If you have any questions or need help, we're here for you! Feel free to reach out to us via the in-app chat in the bottom-right corner or send your inquiries to [email protected]

Did this answer your question?