Test Scenarios
Simulate all payment cases (success, failures, timeouts) with Mobile Money test numbers and dedicated bank cards.
Wajub provides test numbers and cards that trigger predictable behaviors. You can thus validate every branch of your code with certainty.
Mobile Money test numbers
Test numbers are built by combining an operator prefix and a 6-digit suffix that determines the outcome.
number = operator_prefix + outcome_suffixOutcome suffixes
| Suffix | Outcome | Description |
|---|---|---|
000000 | Success | Payment confirmed |
000001 | Insufficient funds | Insufficient balance on the customer's side |
000002 | Failure | Payment declined by the operator |
000003 | Timeout | The operator does not respond |
000004 | Canceled | The customer declines confirmation |
000009 | Success (refund fails) | Payment successful, refund always declined |
Prefixes by country and operator
| Country | Operator | Prefix |
|---|---|---|
| 🇨🇲 Cameroon | MTN MoMo | +23767 |
| 🇨🇲 Cameroon | Orange Money | +23769 |
| 🇨🇮 Ivory Coast | MTN MoMo | +22505 |
| 🇨🇮 Ivory Coast | Orange Money | +22507 |
| 🇨🇮 Ivory Coast | Moov | +22501 |
| 🇨🇮 Ivory Coast | Wave | +22503 |
| 🇳🇬 Nigeria | MTN | +2348 |
| 🇸🇳 Senegal | Orange Money | +22177 |
| 🇸🇳 Senegal | Free | +22176 |
| 🇬🇭 Ghana | MTN MoMo | +23324 |
| 🇬🇭 Ghana | Vodafone | +23320 |
| 🇬🇭 Ghana | AirtelTigo | +23327 |
| 🇰🇪 Kenya | M-Pesa | +25470 |
| 🇬🇦 Gabon | Airtel | +2410 |
| 🇧🇯 Benin | MTN | +22990 |
| 🇧🇫 Burkina Faso | Orange | +22670 |
| 🇺🇬 Uganda | MTN | +25677 |
| 🇷🇼 Rwanda | MTN | +25078 |
| 🇨🇩 DRC | Airtel | +24399 |
| 🇨🇩 DRC | Orange | +24389 |
| 🇹🇿 Tanzania | Airtel | +25567 |
Complete number examples
| Scenario | MTN Cameroon | Orange CI | M-Pesa Kenya |
|---|---|---|---|
| Success | +237670000000 | +225070000000 | +254700000000 |
| Insufficient funds | +237670000001 | +225070000001 | +254700000001 |
| Failure | +237670000002 | +225070000002 | +254700000002 |
| Timeout | +237670000003 | +225070000003 | +254700000003 |
| Canceled | +237670000004 | +225070000004 | +254700000004 |
Build any scenario
Combine any prefix from the table above with the suffix corresponding to the desired
outcome. For example, to simulate a timeout on Orange Senegal: +22177 + 000003 = +221770000003.
Bank card test numbers
Use any future date as expiration and 123 as CVV (unless otherwise stated).
Direct success (without 3DS)
| Card number | Network | Scenario |
|---|---|---|
4242 4242 4242 4242 | Visa | Payment successful |
5555 5555 5555 4444 | Mastercard | Payment successful |
4000 0000 0000 5423 | Visa | Payment successful — refund always declined |
3D Secure — successful authentication
| Card number | Scenario |
|---|---|
4000 0565 6566 5556 | 3DS required → success |
4000 0025 0000 3155 | 3DS required → success |
4000 0027 6000 3184 | 3DS required → success |
3D Secure — failed authentication
| Card number | Scenario |
|---|---|
4000 0025 0000 3063 | 3DS required → authentication failure (wrong code) |
3D Secure — card declined during 3DS
| Card number | Scenario |
|---|---|
4000 0025 0000 3018 | 3DS required → card declined by issuer |
3D Secure — canceled by customer
| Card number | Scenario |
|---|---|
4000 0025 0000 3034 | 3DS required → customer abandons |
3D Secure — timeout
| Card number | Scenario |
|---|---|
4000 0025 0000 3050 | 3DS required → authentication timeout |
One canonical number per outcome
Earlier revisions of this table listed a second "alias" card number per 3DS outcome
(…3089, …3026, …3042, …3097). Those extra numbers could not be verified against the
platform's sandbox test-data reference and have been removed — use the numbers above.
Direct failures (without 3DS)
| Card number | Scenario |
|---|---|
4000 0000 0000 9995 | Insufficient funds |
4000 0000 0000 0002 | Card declined |
4000 0000 0000 0069 | Expired card |
4000 0000 0000 0127 | Card declined — incorrect CVC |
Fewer numbers than before
Earlier revisions of this table listed additional numbers (…9987, …9979, …0119,
4242 4242 4242 4241, …6975, …0341) that could not be verified against the platform's
sandbox test-data reference and have been removed. The four numbers above are confirmed.
CVV and expiration date
In sandbox, CVV and expiration date are not validated — use any future
date (e.g. 12/28) and 3-digit CVV (e.g. 123). The card number determines
the outcome.
Bank account test numbers
For payments via bank transfer, use an account number or IBAN ending with the suffix corresponding to the desired outcome.
| Suffix (last digits) | Outcome |
|---|---|
00 | Success |
01 | Insufficient funds |
02 | Failure |
03 | Timeout |
04 | Canceled |
Example: an IBAN ending with …0002 will trigger a failure.
Crypto test
For cryptocurrency payments, control the outcome via the sandbox_crypto_result field
or via the payer's wallet address suffix.
Via the sandbox_crypto_result field
Pass this field in the /payments request body:
{
"sandbox_crypto_result": "success"
}Accepted values: success, insufficient_funds, failure, timeout, canceled.
Via the wallet address suffix
| Address suffix | Outcome |
|---|---|
_success | Success |
_insufficient | Insufficient funds |
_failure | Failure |
_timeout | Timeout |
_canceled | Canceled |
Example: 0xabcdef...1234_failure will trigger a failure.
Outgoing transfer scenarios
For outgoing transfers (/transfers API), behavior is probabilistic in sandbox
(80% success by default) except for the Mobile Money test numbers above.
| Scenario | How to trigger? | Outcome |
|---|---|---|
| Transfer successful | Number ending with 000000 | status: complete |
| Insufficient funds | Number ending with 000001 | status: failed, code insufficient_funds |
| Operator failure | Number ending with 000002 | status: failed, code failure |
| Timeout | Number ending with 000003 | status: failed, code network_error |
| Canceled | Number ending with 000004 | status: failed, code canceled |
Example: simulate a payment failure
https://api.wajub.com/paymentscurl https://api.wajub.com/payments \
-H "Authorization: pk_test.8f2b91c4d7e6a0f3" \
-H "Content-Type: application/json" \
-d '{
"amount": 15000,
"currency": "XAF",
"customer": { "phone": "+237670000001" },
"description": "Test insufficient funds"
}'{
"status": "Created",
"code": 201,
"transaction": {
"id": "trx_01JXXXXXXXXXXXXX",
"status": "pending",
"amount": 15000,
"currency": "XAF",
"sandbox": true
},
"authorization_url": "https://pay.wajub.com/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}Webhook scenarios
| Scenario | How to trigger? | Event emitted |
|---|---|---|
| Payment completed | Suffix 000000 or card 4242…4242 | payment.succeeded |
| Payment failed | Suffix 000002 or card 4000…0002 | payment.failed |
| Insufficient funds | Suffix 000001 or card 4000…9995 | payment.failed |
| Refund succeeded | POST /refunds | refund.succeeded |
| Refund declined | Suffix 000009 or card 4000…5423 | refund_failed |
| Transfer succeeded | Suffix 000000 | transfer.succeeded |
| Transfer failed | Suffix 000002 | transfer.failed |
See the event catalog for the full, exact list of event names — several
use an underscore rather than a dot (refund_failed, not refund.failed).
Inspect from Konsole
Every delivery attempt for events emitted in the sandbox is recorded in Konsole → Webhooks. You can retry a failed delivery there — it resends the original payload, unmodified, with a freshly-signed header.
Related pages