growth
How to Design UPI Payment Pending, Success and Failed Pages
Give customers an accurate payment status after UPI checkout with server-owned states, safe refresh behavior, late-payment recovery, and useful support references.
Payment result pages are part of your financial state machine, not decorative confirmation screens. Their job is to translate a server-owned order state into a clear customer action without creating duplicate payments or false success.
The most important rule is simple: the URL does not decide the status. A customer can reload, bookmark, edit, or directly open a return URL. Your page must fetch the order that belongs to the authenticated customer or signed guest session and render the state stored by your backend.
Use Server-Owned Payment States
A practical model separates at least these states:
| State | Meaning | Customer action |
|---|---|---|
payment_pending | Attempt exists; final evidence not recorded | Wait or refresh safely |
paid | Verified evidence matches the order | Continue to fulfilment |
failed | Attempt received a final failure outcome | Start a new attempt if allowed |
expired | Local checkout window ended without final success | Check status before trying again |
late_payment_review | Success arrived after expiry | Wait for merchant decision |
payment_review | Amount or reference mismatch | Contact support with order reference |
These names can differ in your application, but their meanings must not overlap. A stale response should never move paid back to failed.
Pending Page Content
“Pending” should reduce anxiety. Show:
- “We are checking your payment”
- The store order reference
- Expected amount
- Last checked time
- A refresh button with a short cooldown
- “Do not pay again yet” guidance
- A support path after a defined waiting period
The refresh action calls your backend. It must not place an API key in browser JavaScript. Your backend can return local state and, when appropriate, use the authenticated payment status verification flow.
Avoid a spinner with no explanation. Customers need to know whether they can close the page and how they will receive an update. If you send email or SMS, promise it only when that notification is actually configured.
Success Page Content
Render success only when the backend stores verified evidence. A useful success page includes:
- “Payment verified”
- Order reference and amount
- What the merchant will do next
- Receipt, invoice, or order link if available
- Support link tied to the order
Do not expose complete UTRs, payer UPI IDs, internal event payloads, API keys, or merchant-provider credentials. Support staff may need additional references, but the customer page should follow data minimization.
Success should be idempotent. Reloading the page must not send another fulfilment email, reduce inventory again, or activate a subscription twice. Those effects belong behind the duplicate webhook fulfilment pattern, not inside page rendering.
Failed and Expired Are Different
A final failed result means the attempt did not produce a verified payment. An expired state means your local checkout window ended. It does not prove that no later payment evidence can arrive.
For a failed attempt:
- Explain that no verified payment is attached to the order.
- Provide a new-attempt action only after reconciliation.
- Preserve the old attempt for audit and support.
For an expired attempt:
- Check whether the outcome is still unknown.
- Look for a late event or authenticated status result.
- Prevent simultaneous old and new attempts from both fulfilling.
- Route a late success to a defined honour-or-refund policy.
Read the late UPI payment recovery guide before implementing the expired screen.
Support and Accessibility Checklist
Every result page should pass this checklist:
- Status appears as text, not color alone.
- Heading states the outcome in plain language.
- Order reference can be copied without exposing secrets.
- Buttons have specific labels such as “Check payment again.”
- Focus moves to the status heading after an update.
- Refresh does not create a new payment attempt.
- Browser back does not change server state.
- Support receives the order reference and safe error category.
- Analytics excludes customer and payment credentials.
Measure time spent pending, refresh count, second-attempt rate, support contact rate, late successes, and verified-payment conversion by device. A good result page does not merely look reassuring—it guides the customer while preserving the exact state your finance and fulfilment systems can defend.
Direct answers
Frequently asked questions
- Why does a UPI order remain pending after the customer returns?
- The browser can return before your backend receives or verifies payment evidence. Keep the order pending and read its state from your server.
- Should a failed page immediately create another payment order?
- Not while the first outcome is unknown. First reconcile the existing reference, then offer a new attempt only when your state policy allows it.
- What should a UPI success page display?
- Display the verified order reference, amount, fulfilment next step, receipt or support path, and no unnecessary payer or bank information.
Build your payment flow
Explore the API and browser-only merchant tools.
Create UPI checkout orders, verify signed events, or test the free calculators and generators without exposing credentials.