# Transfer types explanation

In our system, after a user creates an order, he must pay funds to the specified recipient. We support several types of fund transfer types:

* <mark style="color:yellow;">**manual**</mark> – user manually makes a transfer with provided instructions
* <mark style="color:yellow;">**redirect**</mark> – user is redirected to a third-party payment page to complete payment
* <mark style="color:yellow;">**stk\_push**</mark> – user receives a push on their phone to approve the payment. If user didn't receive the push notification, you can [Trigger order intermediate action](https://docs.fonbnk.com/server-to-server/api-endpoints/trigger-order-intermediate-action)  to retry it.
* <mark style="color:yellow;">**otp\_stk\_push**</mark> – same as <mark style="color:yellow;">**stk\_push**</mark> but before initiating a push user must verify their phone number by providing the otp code received via SMS or WhatsApp to the [Trigger order intermediate action](https://docs.fonbnk.com/server-to-server/api-endpoints/trigger-order-intermediate-action) endpoint. If user didn't receive the push notification, you can [Trigger order intermediate action](https://docs.fonbnk.com/server-to-server/api-endpoints/trigger-order-intermediate-action)  again to retry it.

Different transfer types contain different data:

* <mark style="color:yellow;">**manual**</mark> – includes transferDetails for making the transfer
* <mark style="color:yellow;">**redirect**</mark> – includes paymentUrl to redirect the user
* <mark style="color:yellow;">**stk\_push**</mark> – includes intermediate action metadata:
  * intermediateActionMaxAttempts
  * intermediateActionAttempts
  * intermediateActionNextAttemptAvailableAt
  * intermediateActionTimeoutMs
* <mark style="color:yellow;">**otp\_stk\_push**</mark> – same as stk\_push plus fieldsForIntermediateAction (e.g., otpCode)

### Example of the manual transfer

Let's imagine you've created a fiat (bank) -> crypto order using the [create order](https://docs.fonbnk.com/server-to-server/api-endpoints/create-order) endpoint.

The <mark style="color:yellow;">order.deposit.transferInstructions</mark> could be like the next:

{% code overflow="wrap" %}

```json
{
  "type": "manual",
  "instructionsText": "Transfer the NGN to the agent's bank account.",
  "warningText": "Important: Only transfer funds from a bank account you specified previously. Send the exact NGN amount. Use the displayed account for this transaction only.",
  "transferDetails": [
    {
      "id": "recipientBankName",
      "label": "Bank name",
      "value": "PROVIDUS BANK"
    },
    {
      "id": "recipientBankAccountNumber",
      "label": "Bank account number",
      "value": "9670555843"
    },
    {
      "id": "recipientBankAccountName",
      "label": "Bank account name",
      "value": "Start Button Limited(Checkout)"
    },
    {
      "id": "bankTransferNarration",
      "label": "Bank transfer narration",
      "description": "TRANSFER WITHOUT NARRATION WILL BE IGNORED BY THE SYSTEM.",
      "value": "shc-pshr4upg8s"
    },
    {
      "id": "amountToSend",
      "label": "Amount to send",
      "value": "14800"
    }
  ],
  "fieldsToConfirmOrder": []
}
```

{% endcode %}

The above data says the following:

* The transfer type is <mark style="color:yellow;">manual</mark>, so the user must initiate and complete the fund transfer independently.
* The user must pay ”<mark style="color:yellow;">14800</mark>” of his local currency to the “9670555843” bank account number and set “<mark style="color:yellow;">shc-pshr4upg8s</mark>” as a transfer narration.

### Example of the stk\_push transfer

Let's imagine you've created an fiat (mobile money) -> crypto order using the [create order](https://docs.fonbnk.com/server-to-server/api-endpoints/create-order) endpoint.

The <mark style="color:yellow;">order.deposit.transferInstructions</mark> could be like the next:

```json
{
  "type": "stk_push",
  "instructionsText": "You’ll be prompted with a USSD dialog to proceed the transfer. If the transfer is unsuccessful or you don’t receive the USSD dialog, please retry the transfer",
  "warningText": "",
  "intermediateActionButtonText": "Retry USSD prompt initialization",
  "intermediateActionMaxAttempts": 3,
  "intermediateActionAttempts": 1,
  "intermediateActionNextAttemptAvailableAt": "2025-12-01T11:54:49.260Z",
  "intermediateActionTimeoutMs": 60000,
  "isIntermediateActionAvailable": true,
  "transferDetails": [
    {
      "id": "amountToSend",
      "label": "Amount to send",
      "value": "635"
    }
  ],
  "fieldsToConfirmOrder": []
}
```

The above data says the following:

* The transfer type is <mark style="color:yellow;">stk\_push</mark>, so the user should receive the push notification to send their funds.
* If the user didn't receive the push notification, you can initiate a new one after "<mark style="color:yellow;">2025-12-01T11:54:49.260Z</mark>". There are 3 attempts to initiate intermediate action, and you can do 2 more. You must call [Trigger order intermediate action](https://docs.fonbnk.com/server-to-server/api-endpoints/trigger-order-intermediate-action)  to retry it.

### Example of the otp\_stk\_push transfer

Let's imagine you've created an fiat (mobile money) -> crypto order using the [create order](https://docs.fonbnk.com/server-to-server/api-endpoints/create-order) endpoint.

The <mark style="color:yellow;">order.deposit.transferInstructions</mark> could be like the next:

{% code overflow="wrap" %}

```json
{
  "type": "otp_stk_push",
  "instructionsText": "Enter the OTP code received via WhatsApp to initiate the transaction and you’ll be prompted with a USSD dialog to proceed the transfer. If the transfer is unsuccessful or you don’t receive the USSD dialog, please retry the transfer",
  "warningText": "",
  "intermediateActionButtonText": "Verify OTP code",
  "intermediateActionMaxAttempts": 3,
  "intermediateActionAttempts": 1,
  "intermediateActionNextAttemptAvailableAt": "1970-01-01T00:00:00.000Z",
  "intermediateActionTimeoutMs": 30000,
  "isIntermediateActionAvailable": true,
  "transferDetails": [
    {
      "id": "amountToSend",
      "label": "Amount to send",
      "value": "310000"
    }
  ],
  "fieldsToConfirmOrder": [],
  "fieldsForIntermediateAction": [
    {
      "key": "otpCode",
      "label": "OTP code",
      "type": "number",
      "required": true
    }
  ],
  "intermediateActionRequired": true,
  "intermediateActionExecuted": false,
  "otpChannel": "whatsapp"
}
```

{% endcode %}

The above data says the following:

* The transfer type is <mark style="color:yellow;">otp\_stk\_push</mark>, so the user should confirm their phone number via OTP and thereafter, they'll receive the push notification to pay for the order.
* System sent the OTP code to user using "<mark style="color:yellow;">whatsapp</mark>" and the [Trigger order intermediate action](https://docs.fonbnk.com/server-to-server/api-endpoints/trigger-order-intermediate-action) must be called with "<mark style="color:yellow;">otpCode</mark>" field to initiate the transfer.
