Skip to main content

How Koinly handles transfers between your own wallets

Written by Robin Singh

Once you added all your wallets, Koinly will try to find & match transfers between them automatically. Transfers between your own wallets are not taxed, so having them correctly identified can significantly lower your calculated taxable gains.

🔵 Example

Let's say you have 2 wallets: Coinbase and MetaMask.

  • You send out 1 ETH from Coinbase.

  • A few minutes later, you receive 1 ETH into your MetaMask wallet.

Here you would initially have 2 separate transactions - a withdrawal of 1 ETH from Coinbase and a deposit of 1 ETH to MetaMask:

image.png

But Koinly can see that you are just moving coins from one wallet into another so it automatically merges them into a single transfer transaction. The difference between the sending and receiving amount would be added as a transfer fee. The merged transaction will look like this:

image.png

Auto-matching rules

Koinly will automatically merge a deposit and a withdrawal into a transfer if the following rules are met:

  1. 👯‍♀️ Likeness check
    The deposit and withdrawal are for the same asset/currency

  2. ⏱️ Interval check
    Both transactions should be within 12 hours of each other

  3. 🗓️ Chronology check
    The withdrawal happens before the deposit.

  4. ⚖️ Amount check
    The deposited amount is equal to or smaller than the withdrawn amount

  5. 🧮 Difference check
    The deposit is not significantly smaller than the withdrawal - the maximum difference between the deposit and the withdrawal is 20%.
    Koinly will merge 0.10 BTC >> 0.08 BTC, but will not merge 0.15 ETH >> 0.05 ETH

  6. #️⃣ Hash check
    Transactions have the same transaction hash, or one of the transactions doesn't have a hash at all, or none of them do.

Can Koinly match bridging transactions?

The short answer is - it depends. If you bridge your asset from one blockchain to another, the asset you receive might be a slightly different token than the one you've sent.

  • If the token is the same (e.g. ETH on Ethereum and ETH on Polygon)

    • Bridging is no different than transferring assets between wallets and Koinly will merge them automatically (assuming all other checks are passed)

  • If the token is different (e.g.BTC on Bitcoin and WBTC on Ethereum)

    • Koinly will not merge it automatically as the transactions fail the likeness check.
      In such cases, if all the other checks are passed, you can still merge them manually - note that it will appear as an Exchange, not a transfer and gains will be calculated as if the asset was sold.

How can I create a Transfer manually?

Before making any manual changes, first ensure your data is accurate. Most issues with transfer matching come from incomplete or incorrect data:

  • Deposits and withdrawals files not imported from an exchange

  • CSV files imported in the wrong timezone

  • Inaccurate API data

  • Wrong currency imported on one of the legs of the transfers

  • etc.

See:

If your transaction history still needs manual amendments after importing, fixing a transfer depends on the scenario - see three possible situations below.

☝️ Adding incorrect data may skew your gains

Before making any manual changes, make sure that the data is really missing, not just slightly incorrect. If you edit a withdrawal into a transfer while the deposit was already there (e.g. with the wrong timestamp_) you are effectively corrupting (duplicating) your data

One of the transactions is missing

The transfer could not be automatically merged, because there is only a deposit to one of your wallets, without the corresponding withdrawal from the other wallet.

✅ How to add a transfer if one transaction is missing

Edit the leg of the transfer that was imported, change its type to "Transfer" and fill the fields for the other end of the transfer accordingly (the other wallet, amount, etc.)

Both the deposit and the withdrawal are missing

The imported data was incomplete and didn't contain any information about this particular transfer.

✅ How to add a transfer if both legs of the transfer are missing

Missing transaction needs to be added manually. Click "add transaction" and choose either the deposit or withdrawal. Then change the type to "Transfer" and fill all the necessary information.

The deposit and withdrawal are present but weren't merged automatically

This happens if the transactions failed on one of our checks described above.

✅ How to add a transfer if both legs are imported but not merged together

This issue is usually caused by wrong data import so it should be fixed at source (by reimporting your data, this time correctly). But if it's a single instance, then you can edit the transactions accordingly so that they pass the checks required to match them into a transfer (e.g. modify the amount on one of the legs. Then merge them manually.

Why is there a profit/loss on a transfer to my own wallet?

Koinly may show a gain/loss on a transfer if:

  • One leg of the transfer is missing

    • Either because not all data was imported yet, or some data is missing

  • The transactions are not merged into a transfer

    • Because one of the checks failed: likeness, chronology, interval, etc.

  • The profit is on the disposal of the transfer fee only

    • This is expected if you have "Treat transfer fees as disposals" set to ON

For details and possible fixes, see:

Did this answer your question?