Skip to main content

Test instruments

In sandbox, these produce the same outcome every time — so you can build and test your error handling for failures that are hard to trigger on purpose.

Cards​

NumberOutcome
4111 1111 1111 1111Succeeds
5555 5555 5555 4444Succeeds (Mastercard)
6011 0000 0000 0004Succeeds (RuPay)
4000 0000 0000 0002Declined by bank
4000 0000 0000 9995Insufficient funds
4000 0000 0000 0069Expired card
4000 0000 0000 0127Incorrect CVV
4000 0000 0000 0119Gateway timeout

Any future expiry and any CVV work.

UPI​

UPI IDOutcome
success@pgtestPending, then succeeds after ~5 seconds
failure@pgtestCustomer declines
timeout@pgtestNever approved — tests your timeout handling
invalid@pgtestUPI ID does not exist

success@pgtest deliberately spends time in PENDING. Real UPI does the same, and it is the state most integrations get wrong.

Net banking and wallets​

Canara Bank and MobiKwik are seeded as down, so you can test the BANK_UNAVAILABLE path. Everything else succeeds.

Error codes​

CodeRetry with
INSUFFICIENT_FUNDSA different method
CARD_DECLINEDA different method
INCORRECT_CVVThe same card
UPI_TIMEOUTThe same method
BANK_UNAVAILABLEA different method
GATEWAY_TIMEOUTThe same method

Show the customer something they can act on. "Payment failed" with no detail is where conversion goes to die — someone told insufficient balance tries another card, someone told nothing leaves.