# 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 involves 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 in 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](/api/international-wire/get-international-wire-tracking) 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 actual 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](/api/international-wire/international-wire-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](/api/international-wire/international-wire-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:

- Column sent `USD 519.74` to our correspondent bank `CHASUS33`.
- `CHASUS33` found the correspondent bank for `ARMIAM22` is `CITIUS33`. So the transfer request was forwarded to `CITIUS33`.
- `CITIUS33` charged `USD 10.00` as its processing fee, and forwarded `USD 509.74` to `ARMIAM22`.
- `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

```json
{
  "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

```json
{
  "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 is 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:

- `POALILIT` sent `USD 16,747.35` to its correspondent bank `CHASUS33`.
- 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.
- 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

```json
{
  "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

```json
{
  "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 is not what usually happens 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 statuses 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:

- Column sent `USD 15.00` to `CIBKCNBJ430` via our correspondent bank `CHASUS33XXX`
- `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`
- `CHASUS33XXX` sent the cover transfer to `CIBKCNBJ430`
- `CIBKCNBJXXX` reported on behalf of `CIBKCNBJ430` that the cover transfer has been received
- `CIBKCNBJXXX` reported on behalf of `CIBKCNBJ430` that the transfer has been completed and credited to the beneficiary account

```json
{
  "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"
}
```
