International Wire Tracking

International wire transfers are notoriously difficult to track status updates. Unlike domestic wire transfers that are sent directly from originating banks to beneficiary banks, international wire routing usually involve one or multiple intermediary banks. Both intermediary banks and the beneficiary bank of an international wire transfer may delay transfer request processing due to their operation guidance, holiday schedules, etc.

In addition, intermediary banks or beneficiary banks may fail to process transfer requests and have to return funds back to originating banks, resulting further delays. Therefore, international wire transfers may take several days or even weeks for beneficiaries and originators to receive their funds. Also, intermediary banks and beneficiary banks may charge processing fees. As a result, funds received by beneficiaries may be less than funds sent by originators.

In order to better understand current statuses of international transfers, Column provides the Tracking API for you to get routing details, charges, and other information of international wires.

Note

TRCKCHZZXXX is the BIC of the Swift Tracking system, which will process and forward all tracking update messages. In addition, some financial institutions have not integrated with the Swift Tracking system directly, or may have integrated via some other message systems. In such cases, TRCKCHZZXXX will update tracking statuses on their behalf. Therefore, you may see tracking updates from TRCKCHZZXXX even though it is not involved in the actually routing of transfer messages.

In addition, some financial institutions may report tracking updates from BICs that are different from the BICs in transfer request messages. For example, CIBKCNBJXXX may report tracking updates on behalf of transfer requests to CIBKCNBJ430.

Internal status and tracking status

Each international wire transfer object has two statuses:

  • Internal status: this status is used inside the Column system, available as status in Transfer Object. It provides more granular transfer updates posted by the Column system until a transfer is sent to the correspondent bank. Once a transfer is settled between Column and the correspondent bank, it is marked as completed.
  • Tracking status: this status is used to track global routing status inside the Swift system, available as transfer_status in Tracking Object. If a beneficiary bank successfully processed a transfer request and credited to the beneficiary account, it is marked as completed. If the beneficiary bank rejected the transfer request, it is marked as rejected. Before that it is always marked as pending.

Outgoing transfer tracking

Suppose you sent USD 519.74 to a beneficiary account with ARMIAM22, and it was routed to the beneficiary bank as follows:

  1. Column sent USD 519.74 to our correspondent bank CHASUS33.
  2. CHASUS33 found the correspondent bank for ARMIAM22 is CITIUS33. So the transfer request was forwarded to CITIUS33.
  3. CITIUS33 charged USD 10.00 as its processing fee, and forwarded USD 509.74 to ARMIAM22.
  4. ARMIAM22 processed the transfer request successfully and credited USD 509.74 to the beneficiary account.

The details of the outgoing transfer object and tracking object will be as follows.

Outgoing transfer object

{
  ...
  "amount": 51974,
  "charge_bearer": "SHAR",
  "charges": [
    {
      "agent": "",
      "amount": 1000,
      "currency_code": "USD"
    }
  ],
  "instructed_amount": 51974,
  "instructed_currency_code": "USD",
  "intermediary_fis": [
    "CHASUS33",
    "CITIUS33"
  ],
  "settled_amount": 51974,
  "settled_currency_code": "USD",
  ...
}

Outgoing transfer tracking details

{
  ...
  "completed_at": "2023-08-23T14:08:00Z",
  "events": [
    {
      ...
      "instructed_amount": 51974,
      "instructed_currency_code": "USD",
      "settled_amount": 51974,
      "settled_currency_code": "USD",
      "transfer_status": "pending",
      "transfer_status_reason": "Credit transfer has been forwarded to the next bank that provides tracking service",
      "type": "transfer_initiated",
      "updated_at": "2023-08-23T14:02:35Z",
      "updated_by": "CLNOUS66XXX"
    },
    {
      ...
      "instructed_amount": null,
      "instructed_currency_code": null,
      "settled_amount": 51974,
      "settled_currency_code": "USD",
      "transfer_status": "pending",
      "transfer_status_reason": "Credit transfer has been forwarded to the next bank that provides tracking service",
      "type": "transfer_updated",
      "updated_at": "2023-08-23T14:04:00Z",
      "updated_by": "CHASUS33XXX"
    },
    {
      ...
      "charges": [
        {
          "agent": "",
          "amount": 1000,
          "currency_code": "USD"
        }
      ],
      "instructed_amount": 51974,
      "instructed_currency_code": "USD",
      "settled_amount": 50974,
      "settled_currency_code": "USD",
      "transfer_status": "pending",
      "transfer_status_reason": "Credit transfer has been forwarded to the next bank that provides tracking service",
      "type": "transfer_initiated",
      "updated_at": "2023-08-23T14:05:03Z",
      "updated_by": "CITIUS33XXX"
    },
    {
      ...
      "charges": [
        {
          "agent": "",
          "amount": 1000,
          "currency_code": "USD"
        },
        {
          "agent": "",
          "amount": 0,
          "currency_code": "USD"
        }
      ],
      "settled_amount": 50974,
      "settled_currency_code": "USD",
      "transfer_status": "completed",
      "transfer_status_reason": null,
      "type": "transfer_updated",
      "updated_at": "2023-08-23T14:13:33Z",
      "updated_by": "ARMIAM22XXX"
    }
  ],
  "transfer_status": "completed",
  ...
}

Incoming transfer tracking

Incoming transfer tracking are very similar to outgoing transfer tracking. Suppose POALILIT sent USD 16,747.35 to a beneficiary account in your platform, and it was routed to Column as follows:

  1. POALILIT sent USD 16,747.35 to its correspondent bank CHASUS33.
  2. Since CHASUS33 is our correspondent bank as well, so it can forward the transfer request to Column directly. However, it charged USD 30.00 as the processing fee, and sent USD 16,717.35 to Column.
  3. Column successfully processed the transfer request and credited USD 16,717.35 to the beneficiary account.

The details of the incoming transfer object and tracking object will be as follows.

Incoming transfer object

{
  ...
  "amount": 1671735,
  "charge_bearer": "SHAR",
  "charges": [
    {
      "agent": "CHASUS33XXX",
      "amount": 3000,
      "currency_code": "USD"
    }
  ],
  "instructed_amount": 1674735,
  "instructed_currency_code": "USD",
  "intermediary_fis": [
    "CHASUS33"
  ],
  "settled_amount": 1671735,
  "settled_currency_code": "USD",
  ...
}

Incoming transfer tracking object

{
  ...
  "completed_at": "2023-08-23T12:17:50Z",
  "events": [
    {
      ...
      "instructed_amount": 1674735,
      "instructed_currency_code": "USD",
      "transfer_status": "pending",
      "transfer_status_reason": "Credit transfer has been forwarded to the next bank that provides tracking service",
      "type": "transfer_initiated",
      "updated_at": "2023-08-22T12:56:03Z",
      "updated_by": "POALILITXXX"
    },
    {
      ...
      "charges": [
        {
          "agent": "CHASUS33XXX",
          "amount": 3000,
          "currency_code": "USD"
        }
      ],
      "instructed_amount": 1674735,
      "instructed_currency_code": "USD",
      "settled_amount": 1671735,
      "settled_currency_code": "USD",
      "transfer_status": "pending",
      "transfer_status_reason": "Credit transfer has been forwarded to the next bank that provides tracking service",
      "type": "transfer_initiated",
      "updated_at": "2023-08-23T00:38:48Z",
      "updated_by": "CHASUS33XXX"
    },
    {
      ...
      "settled_amount": 1671735,
      "settled_currency_code": "USD",
      "transfer_status": "completed",
      "transfer_status_reason": null,
      "type": "transfer_updated",
      "updated_at": "2023-08-23T12:20:18Z",
      "updated_by": "CLNOUS66"
    }
  ],
  "transfer_status": "completed",
  ...
}

Note

You can track incoming international wire transfers to Column even before we receive them by using their UETRs. This is very helpful if some incoming transfers are taking longer than expected because they are delayed or rejected by intermediary banks.

Cover transfers

Routing of an international wire transfer usually involves multiple hops from the originating bank to the beneficiary bank, and each hop involves two banks: the instructing bank and the instructed bank. Ideally, when the instructing bank forwards a transfer request message to the instructed bank, funds will be settled between them directly.

However, this will not be what usually happen in reality. Sometimes the instructing bank and the instructed bank do not have a direct correspondent relationship established, and thus they cannot settle funds directly. Instead, they must each involve their own correspondent banks in order to settle the funds. In such cases, after the instructing bank forwarded a customer transfer request to the instructed bank, it will send another cover transfer to its correspondent bank, which will really move the funds. The cover transfer says to its correspondent bank: "Please debit my account that you hold and credit the instructed bank's account with its correspondent."

Note that the correspondent banks of the instructing and instructed banks may be located in the same country or monetary zone. So this cover transfer may go through a local clearing system and not through the Swift network.

Our international wire tracking API provides update events of cover transfers in addition to update events of their corresponding customer transfers, and they are indicated with is_cover_transfer_event = true. Although cover transfer events will not impact statues of customer transfers directly, they provide more granular details. For example, sometimes the beneficiary bank of a customer transfer will report "Credit to the beneficiary's account is pending as status Originator is waiting for funds provided via a cover". Even after funds are settled via a cover transfer, the beneficiary bank may not update the transfer status because it may take them several days to process it due to holidays or internal policies. In such case, our tracking API will return a cover transfer event that shows the beneficiary bank has received the funds, but not credited to the beneficiary account yet.

The following is an example of outgoing transfers involving funds cover transfers:

  1. Column sent USD 15.00 to CIBKCNBJ430 via our correspondent bank CHASUS33XXX
  2. CIBKCNBJXXX reported on behalf of CIBKCNBJ430 that the transfer request has been received, but cannot be processed until funds are settled via a cover transfer because it has no direct corresponding relationship with CHASUS33XXX
  3. CHASUS33XXX sent the cover transfer to CIBKCNBJ430
  4. CIBKCNBJXXX reported on behalf of CIBKCNBJ430 that the cover transfer has been received
  5. CIBKCNBJXXX reported on behalf of CIBKCNBJ430 that the transfer has been completed and credited to the beneficiary account
{
  ...
  "completed_amount": 1500,
  "completed_at": "2023-08-29T01:54:00Z",
  "completed_currency_code": "USD",
  "events": [
    {
      ...
      "instructed_amount": 1500,
      "instructed_currency_code": "USD",
      "instructed_fi": "CHASUS33XXX",
      "is_cover_transfer_event": false,
      "settled_amount": 1500,
      "settled_currency_code": "USD",
      "transfer_status": "pending",
      "transfer_status_reason": "Credit transfer has been forwarded to the next bank that provides tracking service",
      "type": "transfer_initiated",
      "updated_at": "2023-08-22T04:01:03Z",
      "updated_by": "CLNOUS66XXX"
    },
    {
      ...
      "instructed_amount": 1500,
      "instructed_currency_code": "USD",
      "instructed_fi": "CIBKCNBJ430",
      "is_cover_transfer_event": false,
      "settled_amount": 1500,
      "settled_currency_code": "USD",
      "transfer_status": "pending",
      "transfer_status_reason": "Credit transfer has been forwarded to the next bank that provides tracking service",
      "type": "transfer_initiated",
      "updated_at": "2023-08-22T10:31:01Z",
      "updated_by": "CHASUS33XXX"
    },
    {
      ...,
      "is_cover_transfer_event": false,
      "transfer_status": "pending",
      "transfer_status_reason": "Credit to the beneficiary's account is pending as status Originator is waiting for funds provided via a cover",
      "type": "transfer_updated",
      "updated_at": "2023-08-22T10:31:21Z",
      "updated_by": "CIBKCNBJXXX"
    },
    {
      ...
      "instructed_amount": 1500,
      "instructed_currency_code": "USD",
      "instructed_fi": "CIBKCNBJXXX",
      "is_cover_transfer_event": true,
      "settled_amount": 1500,
      "settled_currency_code": "USD",
      "transfer_status": "pending",
      "transfer_status_reason": "Credit transfer has been forwarded to the next bank that provides tracking service",
      "type": "transfer_cover_initiated",
      "updated_at": "2023-08-22T10:31:33Z",
      "updated_by": "CHASUS33XXX"
    },
    {
      ...
      "is_cover_transfer_event": true,
      "settled_amount": 1500,
      "settled_currency_code": "USD",
      "transfer_status": "completed",
      "type": "transfer_cover_updated",
      "updated_at": "2023-08-22T10:31:21Z",
      "updated_by": "CIBKCNBJXXX"
    },
    {
      ...
      "is_cover_transfer_event": false,
      "settled_amount": 1500,
      "settled_currency_code": "USD",
      "transfer_status": "completed",
      "type": "transfer_updated",
      "updated_at": "2023-08-29T01:55:04Z",
      "updated_by": "CIBKCNBJXXX"
    }
  ],
  ...
  "transfer_status": "completed",
  "updated_at": "2023-08-29T01:55:04Z"
}