Skip to main content

How to Find, Map, and Review Internal Crypto Transfers

R
Written by Richard Pasquin

Use this guide when crypto moves between wallets or exchange accounts owned by the same entity. Find the related records, mark the movement as an internal transfer, and check that its cost basis carries across.

An internal transfer moves an asset you already own. It does not create a new purchase or sale. Cryptoworth treats a correctly mapped internal transfer as non-taxable. Network fees remain separate and follow your fee accounting settings.

For example, you bought 50 USDC for $45, then moved the 50 USDC to another wallet you own. The transfer carries the $45 cost basis. It does not reset the cost basis to the asset's current market value.

How automatic detection works

Cryptoworth can identify transfers during a connection sync or by matching records across connections afterward. Both sides should belong to the same entity and be in the same portfolio.

The matching engine compares the asset, amount, timestamp, transaction reference, and send/receive direction. Wallet-to-wallet matching also uses the from and to addresses. Exchange records may lack reliable addresses, so exchange matching can use the other details.

The internal-transfer marker, classification, and calculation result serve different purposes. The marker identifies the movement. The classification controls its accounting treatment. The calculation shows the cost basis carried between the records. Check all three when you review the result.

1. Enable detection and check the imported history

Open the setting

Click Settings, then choose Internal Transfers in Entity Settings.

Enable automatic marking

Select Auto-mark internal transfers. Detected transfer movements receive an internal-transfer tag; fee transactions are excluded from this tagging.

Save the setting

Click Save under Auto-mark internal transfers.

Check both connections

Go to Subledger > Reconciliation. Use Sync & Reconcile to update the records, then wait for the work to finish. Review both connections in Data Sanity Check. A balance-only connection does not provide the full transaction history needed for matching.

Connect or import any missing wallet or exchange history before matching a transfer. A Synced status alone does not mean that all reconciliation gaps are resolved.

2. Find records marked as internal transfers

Open Transactions

Open Transactions and stay on Crypto Transactions.

Open the filter

Click All Filters.

Choose the field

Click Select field, search for Internal transfer, and choose Internal Transfer.

Set the value

Set the operator to Is and the value to True. Click Apply in the value picker to keep that choice.

Apply the filter

Click Apply at the bottom of the Filters window.

Review the result

Review the returned records. If the table says No transactions match your filters, it means this view found no marked records. It does not prove that no transfers took place.

The sample entity has no marked records in this view. The next section explains what to check when an expected transfer is missing.

3. Fix a missing match

Compare the source records before changing a tag.

What to check

What to do

Ownership and scope

Confirm that both accounts belong to the same entity and both sides are in the same portfolio.

Missing history

Import or sync the missing send or receive. Resolve duplicates before matching.

Asset and quantity

Compare the asset and amounts. Account for fees without changing a correct source amount to force a match.

Time

Check the timestamps and the detection time-gap setting. Correct an imported timestamp only when the source record supports the change.

Addresses and references

Check wallet addresses and the transaction hash or exchange withdrawal/deposit reference. A similar amount alone is not enough.

If a swap, bridge, or wrapped asset makes the movement unclear, confirm its treatment with your accounting team before marking it as an internal transfer.

Review the time gap when needed

In Settings > Internal Transfers, select Enable internal transfer detection time gap if you need to set the allowed gap.

Enter the approved number of minutes. The screen shows a default of 5 minutes. Use a gap that fits the source records; a wider gap can make unrelated records look similar.

Click Save below the time-gap setting.

Remove the review filter

Return to Transactions. Click Clear all filters in the empty result, or Clear all beside the filter chips, so you can find the unmarked records.

Use the asset, date, and connection filters to narrow the table to the movement you need to review.

4. Map a transfer manually

Use Map internal transfer after you have confirmed ownership and the related records.

Movement in the ledger

Select

One send and one receive

The outgoing record and its incoming record.

One send and several receives

The outgoing record and all related incoming records. Their total must match the outgoing amount.

If the receives already exist as separate records, use the one-to-many mapping. You do not need to split the outgoing record just to select those receives.

Select the records

Use the row checkboxes to select the outgoing record and its related incoming record or records. The screenshot illustrates a two-record selection.

Open the mapping

In the selection toolbar, open Bulk Action, then choose Map internal transfer.

Check the proposed mapping

Review the asset, amounts, dates, transaction references, and From → To addresses. Compare Incoming total with Outgoing. A green Match confirms the quantity total; it does not confirm common ownership or prove that the records belong together.

The sample screen illustrates the review controls. Confirm the source evidence for your own records before proceeding. Do not map unrelated records because their quantities happen to match.

Acknowledge the change

When the mapping is correct, select I understand the implications of this change and I accept to make this change.

Confirm the mapping

Click Map internal transfer. The dialog states that mapping marks these records as an internal transfer and not taxable. Return to the records and verify their marker and behaviour, then review a new calculation in section 6.

Other pairing options: Pair as Internal Transfer is the two-record cost-basis pairing option. Use a non-taxable transfer classification for that workflow. Pair as Swap serves a different purpose: regular pairing uses outgoing proceeds as incoming cost.

For more detail, see How to Pair Transactions.

5. Split a record when its parts need different treatment

Split a record when one imported line combines amounts that need separate review or classifications. For example, a 2,000-token batch might contain 1,200 tokens sent to your own wallet and 800 tokens paid to a supplier. Only the owned-wallet portion is an internal transfer.

Use the allocation in your source records. The amounts below illustrate the form; they are not an approved allocation for the sample transaction.

Select one original record

Clear the earlier selection and select only the original record you need to split.

Open Split Transaction

Open More in the selection toolbar, then choose Split Transaction.

Choose the number and method

Set Split Into to the number of parts. Under Split By, choose Amount to enter exact token quantities. You can use Percentage when your source allocation is in percentages.

Enter the first part

Enter the first part's quantity. In this form example, entering 1,200 leaves 800 of the original 2,000.

Fill the remainder

Click Add Remainder to put the remaining quantity in the last part.

Check the total

Confirm that the parts add to Original Amount and Remaining Amount is 0. For a percentage split, the parts must add to 100%.

Keep the fee

Leave Fees as Separate Transaction selected when the original record has a fee that must be retained. The form states that disabling this option ignores the fee.

Classify each part

Open each part's Unclassified menu and choose its approved classification. Use a non-taxable internal-transfer classification for the owned-wallet part. Use the correct expense, payment, or other classification for an external part.

Classification names depend on your entity. If the app says no classifications are mapped to the crypto ledger, complete the setup described under If classifications are unavailable before continuing.

Confirm the split

After checking the quantities, classifications, and fee option, click Split Transaction. Review the resulting parts, then map only the internal part to its matching receive using section 4.

Do not create another manual send or receive for a movement already represented by the split records. Keep the source reference with the parts so the allocation can be checked later.

6. Recalculate and check the carried cost basis

Open the calculation form

Clear investigation filters and select the intended calculation scope, including the records needed to trace the transfer. Click Calculate in Transactions.

Check the method and inventory pool

Confirm Calculation Mode and Cost Basis Flow against your reporting policy. Per Asset pools inventory by asset across connections. Per Connection keeps separate inventory pools, so the transfer link is important when tracing the receiving wallet's cost.

Keep the run available for review

Leave Publish the Result unchecked. Leave Use only filtered transactions as inventory unchecked unless you intend to exclude earlier acquisitions outside the filters.

Run the calculation

Click Calculate in the form and wait for the run to finish. Open that completed run in Subledger > Calculation.

Review Checks

Open Checks. Review any missing inventory, cost-basis mismatch, or other relevant exception before approving the result. Correct the source problem and recalculate when needed.

The sample run has unresolved exceptions. It illustrates where to review them, not a completed transfer correction.

Review Internal Transfers

Open Result > Internal Transfers in the same run. Search by transaction ID or hash when needed. Review Outgoing, Incoming, Amount, Basis Removed, Basis Carried, Status, and Evidence.

Confirm that the expected records are included and that the carried basis reflects the source inventory. Review fees separately. The transfer itself should not create a taxable gain or loss.

The sample view contains no internal-transfer events. If you see this after making a correction, confirm that you opened a new run that includes the corrected records. Use the new run to verify the cost-basis effect of your correction.

Keep the run ID, source transaction references, any split allocation, and your review notes together. Publishing transaction values and running GL Sync are separate steps after approval.

If classifications are unavailable

If the app says You have not mapped any classifications to the crypto ledger, close the notice. Ask your entity administrator to complete the crypto-ledger classification mappings, then reopen the classification menu.

See How to Map Cryptoworth's Native General Ledger for the setup workflow. Confirm that the classification you use for internal transfers has Non-taxable behaviour.

Related guides

Did this answer your question?