Simulate Bank Transfers
The simulator works only in the test environment. No real money is moved, and it cannot be used with live (production) account numbers.
When you integrate Paga Engine, your customers pay you by sending a bank transfer to an account number you generated for them. In the test environment there is no real bank behind those account numbers, so you can't make a real transfer to test your integration.
The Bank Transfer Simulator solves this. It lets you pretend to be a customer sending money to a test account number, so you can see exactly what your system receives when a real payment comes in.
When to use it
Use the simulator to test any Paga Engine flow where a customer pays by bank transfer, for example:
- Persistent Payment Accounts – a dedicated account number assigned to a customer that they can pay into any time.
- Payment Requests – a one-time account number generated for a specific payment or invoice.
- Checkout Gateway Transfer – a one-time account number generated for a specific payment on Paga Checkout Gateway
It's especially useful for checking that:
- your webhook / callback URL receives payment notifications correctly,
- your system credits the right customer with the right amount,
- you handle underpayments, overpayments, and duplicate payments the way you expect.
Before you start
Make sure you have:
- A test (sandbox) account on the Paga Developer Portal. - beta-business.paga.com
- Your test API credentials (public key, secret key, and hash key).
- A test account number generated through the Paga Engine API — for example, by calling Register Persistent Payment Account or Request Payment in the test environment.
- A callback URL configured for your test business, so you can receive the payment notification.
Tip: If you're testing locally, use a tunnelling tool (such as ngrok) to expose your local server so Paga can reach your callback URL.
How to simulate a bank transfer
Step 1: Generate a test account number
Use the Paga Engine API in the test environment to create an account number. Save the accountNumber returned in the response — this is what your "customer" will pay into.
Step 2: Open the simulator
Go to
Step 3: Fill in the transfer details
| Field | What to enter |
|---|---|
| Recipient Paga account number | The test account number from Step 1. |
| Amount | The amount the customer is "sending", in Naira (e.g. 5000). |
| Currency | NGN |
| Sender bank | Select Access Bank |
| Narration (optional) | A short description, e.g. Invoice 1023. |
Step 4: Submit
Click Trigger Deposit. The simulator behaves as though a real bank transfer just arrived in that account.
Step 5: Check your integration
Within a few seconds you should see:
- A payment notification sent to your callback URL.
- The transaction showing in your test dashboard / transaction history.
- Your own system updating the customer's balance, order, or invoice (if your integration handles this).
Test scenarios worth trying
| Scenario | How to simulate it | What to check |
|---|---|---|
| Exact payment | Send the exact amount requested. | Payment is marked as complete. |
| Underpayment | Send less than the requested amount. | Your system handles partial payment correctly. |
| Overpayment | Send more than the requested amount. | Extra amount is handled as you intend. |
| Repeat payment | Send twice to the same persistent account. | Both payments are credited; no duplicates are lost. |
| Duplicate notification | Re-trigger or replay the same callback. | Your system doesn't credit the customer twice (use the transaction reference to de-duplicate). |
| Invalid account | Enter an account number that doesn't exist. | The simulator shows an error; nothing is sent to your callback. |
Troubleshooting
I didn't receive a callback.
- Check that your callback URL is set correctly for your test business.
- Make sure the URL is publicly reachable (not
localhostwithout a tunnel). - Confirm your server returns an HTTP
200response quickly.
The simulator says the account number is invalid.
- Make sure the account number was generated in the test environment, not live.
- Check it was created with the same business/credentials you're testing with.
The amount in my system is wrong.
- Confirm you're reading the
amountfield from the notification and not a value stored from the original request.
Going live
Once everything works with the simulator:
- Switch to your live API credentials and base URL.
- Update your callback URL for the live environment.
- Make a small real transfer to confirm everything works end to end.
Need help? Contact the Paga integrations team.
Updated about 1 hour ago
