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.

VE VyaparGateway Engineering Payments Product & Engineering 4 min read
How to Design UPI Payment Pending, Success and Failed Pages guide
UPI payment pending payment success page payment failed UX checkout recovery

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:

StateMeaningCustomer action
payment_pendingAttempt exists; final evidence not recordedWait or refresh safely
paidVerified evidence matches the orderContinue to fulfilment
failedAttempt received a final failure outcomeStart a new attempt if allowed
expiredLocal checkout window ended without final successCheck status before trying again
late_payment_reviewSuccess arrived after expiryWait for merchant decision
payment_reviewAmount or reference mismatchContact 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:

  1. Explain that no verified payment is attached to the order.
  2. Provide a new-attempt action only after reconciliation.
  3. Preserve the old attempt for audit and support.

For an expired attempt:

  1. Check whether the outcome is still unknown.
  2. Look for a late event or authenticated status result.
  3. Prevent simultaneous old and new attempts from both fulfilling.
  4. 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.