Format reference

Solana Transaction CSV Format

The file uses the 12-column Koinly universal CSV format. Here is exactly what each column contains, what the data looks like, and how a tax tool reads it.

Last updated 6 October 2026

The 12 columns, in order

Date,Sent Amount,Sent Currency,Received Amount,Received Currency,Fee Amount,Fee Currency,Net Worth Amount,Net Worth Currency,Label,Description,TxHash
01

Date

Timestamp

Confirmation time in UTC, formatted YYYY-MM-DD HH:MM:SS. Determines the tax year and holding period.

Example: 2026-09-03 11:33:30

02

Sent Amount

Decimal

Quantity that left the wallet, in the asset's own units. Empty on a pure deposit.

Example: 19999.000000000

03

Sent Currency

String

Ticker for well-known assets, otherwise Koinly's three-part SYMBOL:MINT:SOL form so unrelated tokens never merge.

Example: SKR:SKRbvo6G...:SOL

04

Received Amount

Decimal

Quantity that entered the wallet. Empty on a pure withdrawal.

Example: 4.005403686

05

Received Currency

String

Same format as Sent Currency.

Example: SOL

06

Fee Amount

Decimal

Network fee, charged only when your wallet actually paid it. Appears once on a swap row. One-sided and fee-only activity gets its own cost row instead.

Example: 0.000005002

07

Fee Currency

String

Always SOL on Solana.

Example: SOL

08

Net Worth Amount

Decimal

Deliberately left empty. Your tax tool applies its own historical price for the date, which is more accurate than a value baked into the file.

Example: (empty)

09

Net Worth Currency

String

Left empty for the same reason.

Example: (empty)

10

Label

String

Koinly tag inferred from the transaction type, where one applies: stake, reward, airdrop, cost, lost. Empty means no equivalent tag, not an error. Review these before filing.

Example: stake

11

Description

String

The transaction type or source as reported on-chain. Context only, no effect on the import.

Example: SWAP, TRANSFER, STAKE_SOL

12

TxHash

String (base58)

The transaction signature. Verify any row on Solana Explorer or Solscan. Tax tools also use it to deduplicate.

Example: 2fBUMUPP5U6q...

Sample output

A swap, a plain deposit, and a stake, as they appear in a real file:

Date,Sent Amount,Sent Currency,Received Amount,Received Currency,Fee Amount,Fee Currency,Net Worth Amount,Net Worth Currency,Label,Description,TxHash
2026-09-03 11:33:30,19999.000000000,SKR:SKRbvo6G...:SOL,4.005403686,SOL,0.000005002,SOL,,,,SWAP,2fBUMUPP5U6q...
2026-07-23 08:12:35,,,118560.912610,BONK,,,,,,TRANSFER,2eFMbaDrxTu3...
2025-09-22 07:29:15,10.002282880,SOL,,,,,,,stake,STAKE_SOL,3bUx2JtVcczC...

Note the third row. Moving SOL into a stake account is not a sale, so it carries the stake label. Without it, a tax tool reads a one-sided row as a disposal.

Tax tool compatibility

Koinly - imports as-is

The file is written to Koinly's universal CSV specification. Use the Custom CSV import, and the default column mapping matches. See the Koinly import guide.

CoinTracker and CoinLedger - conversion required

Both use their own column names, order and date handling. Do not upload this file unchanged. The CoinTracker conversion guide covers the mapping.

Excel and Google Sheets - opens directly

Standard comma-separated UTF-8 with a header row. Fields containing commas or quotes are quoted and escaped.

Frequently asked questions

Why does one swap produce a single row but some transactions produce several?

A simple swap has both a sent and a received asset, so it fits on one row. A transaction that moves several different assets at once needs one row per pairing, and same-asset movements within a transaction are netted first so the file never contains a swap of an asset for itself.

Why are the Net Worth columns empty?

On purpose. Koinly and similar tools apply their own historical price for each date, which is more reliable than a figure fixed at export time. Leaving the fields blank lets the importing tool value the transaction.

What does an empty Label mean?

That the transaction type has no matching Koinly tag, which is normal for ordinary transfers and swaps. Labels are only set where there is a clear equivalent, such as stake, reward, airdrop, cost or lost. Every label is an inference and should be reviewed before you file.

Why is a currency shown as a long three-part string?

Lesser-known SPL tokens are written as SYMBOL:MINT:SOL. The mint address in the middle keeps each asset unique, so two different tokens sharing a ticker cannot collapse into one another in your tax tool. Look the mint up on Solscan to identify it.

Can I upload this file straight to CoinTracker or CoinLedger?

No. The file uses Koinly's universal CSV column names and order. CoinTracker and CoinLedger need their own templates, so the columns must be converted first. Koinly's Custom CSV import accepts the file as it is.

Free. No signup required.

Download your Solana transaction CSV

Preview your transactions free, then download the file described above. No login required.

Export Solana Transactions

Works with Phantom, Solflare, Backpack, and any Solana wallet.