# Funding Methods

Your VPay virtual accounts may be funded via Bank Transfer, USSD or Bank/Debit Card. Once successful, each option will notify your web hook endpoint with the previously specified success payload format.&#x20;

However, card and USSD notification payloads will not include the [`session_id`](#user-content-fn-1)[^1] property and may exclude other properties as well.

It is advised that you carefully study the payloads sent for each option and adjust your business logic accordingly.

<table><thead><tr><th width="163">Option</th><th width="349">Integration/Usage Steps</th><th>ETA For Webhook</th></tr></thead><tbody><tr><td>Bank Transfer</td><td>1) Provide or display VPay virtual account number (NUBAN) to paying customer.<br><br>2) To pay, a user is expected to visit her mobile or web banking app, input the NUBAN as beneficiary, then send desired amount to beneficiary.</td><td>10 to 120 seconds</td></tr><tr><td>USSD Short Code</td><td>1) Provide or display the USSD code format  in #2 below to the paying user.<br><br>2) To pay, user is expected to dial <strong>*User'sBankCode*000*5037+VPayNUBAN+Amount#</strong><br><br>For instance, a user wishing to fund virtual account with 200 Naira from GTBank would dial *737*000*5037+VPayNUBAN+200#<br><br><mark style="color:red;">Take note of all symbols (* and + and #)</mark></td><td>5 to 10 seconds</td></tr><tr><td>Bank/Debit Card</td><td>1) Display a button or link or QR code to the following URL:<br><br><a href="https://topup.vpay.africa/VPayNUBAN">https://topup.vpay.africa/VPayNUBAN</a><br> <br><mark style="color:red;">Ensure to replace VPayNUBAN with the actual virtual account NUBAN</mark><br><br>2) A payment form will be presented to the user to enter card details and authorise payment with OTP or PIN. <strong>Mastercard, VIsa and Verve cards are supported.</strong></td><td>&#x3C; 5 seconds</td></tr></tbody></table>

{% hint style="info" %}
Web hook notifications will be sent repeatedly (up to 10 times) at regular intervals until a successful response is received from your pre-registered web hook endpoint.
{% endhint %}

{% hint style="danger" %}
In the event of multiple notifications, to prevent duplicate updates to your  ledger, ALWAYs store and enforce a check on **session\_id** for new **bank transfer** notifications. **session\_id** is unique per transfer transaction and so a notification payload with an existing **session\_id** should be disregarded.
{% endhint %}

[^1]:
