Skip to main content

How duplicate detection works in Koinly

Written by Jack

If Koinly identifies a transaction you're trying to import as a duplicate to an already imported transaction, it will not import it. It will skip it with reason "Duplicate".

Koinly considers only exactly the same transactions as duplicates:

  • Same date/time

  • Same currency and amount

  • Same transaction hash

  • etc.

☝️ Deleted transactions can still trigger a duplicate check

Deleted (crossed-out) transactions are still kept in Koinly and will prevent the same transaction from reimporting. If you want to import those transactions again, either just restore the deleted transaction or delete it permanently.

What can cause duplicates

Because Koinly's duplicate detection discards only exact duplicates, it's still possible for Koinly to import the same transaction twice to your account. This can happen if:

  • Mixing API and CSV data
    Transaction data from those two sources is often not exactly the same, so connecting the API and importing the CSV usually results in duplicates

  • Importing files in different formats that contain the same data
    E.g. both “trades” and “order” files were imported for the same exchange (these are not exact duplicates as one contains single fills from the order book, while the other - aggregated data)

  • Different amounts due to rounding
    If the amounts in the two files you import are not the same because they are rounded to a different position (0.12 and 0.1 are two different amounts for Koinly)

  • Different timestamps of transactions
    The files are in different timezones and the timestamps differ. Files should always be imported in UTC, or offset to UTC upon import. For more information, see How to import a CSV file using a different timezone

How to resolve duplicate entries

If some transactions passed our duplicate detection and were still imported, causing inaccuracies in your transaction history:

  1. Identify duplicates
    Browse your transaction history to identify duplicate transactions.

  2. Choose the transaction to delete
    If transactions are exactly the same it doesn't matter which one you delete. But if one of the transactions was already merged into a transfer with its counter-part in another wallet, then delete the "loose" deposit (or withdrawal) instead

  3. Delete the transaction
    You don't need to permanently delete those transactions - you can just delete them (cross-out) so they don't get re-imported

How to avoid importing duplicates

Avoiding duplicates is often easier than resolving them. Here are some tips:

  1. Stick to one import method per wallet
    Use either API or CSV for importing transactions to avoid overlaps, never both

  2. Import the same file formats
    E.g. If you used "Trades history" files to import your data previously, import the same file with up-to-date history now. Don't import a different file, like "Orders history"

  3. Import non-overlapping files
    If the file format from the exchange changed since your last import, it's sometimes best to just import a file that covers a period that wasn't yet imported.
    E.g. if you already imported data up to March 2025, then get a file from April 2025 forward - don't import a file covering the whole 2025.

  4. Avoid manual edits
    Don't edit transactions manually unless you're certain this is the best solution.
    A common reason for duplicates is editing a withdrawal from the wallet into a transfer, while the deposit to destination wallet already exists (and wasn't automatically matched into a transfer because of timestamp difference, for example).

  5. Review imports
    After importing, check the data for accuracy: check if the end balances match reality, if there are no transaction errors, etc.

  6. Delete transactions properly
    If you notice some duplicates still being imported, delete them (cross-out) so they don't remain in your account and don't get reimported again

Did this answer your question?