Payment investigation

Match a UTR with the correct website order

Use client_txn_id, gateway order ID, amount, time, and UTR as layered evidence instead of unsafe amount-only payment matching.

A UTR or provider reference is useful settlement evidence, but it should not be the only key in your application model. Your client_txn_id connects the checkout to your local order, while gateway order_id and verified amount confirm the payment session. UTR can then support investigation and settlement tracing when it is available from the provider record.

Support agents should never approve a screenshot alone. Start from authenticated server records, normalize the reference, constrain the search to the correct merchant tenant and time range, and compare amount and status. Mask references in customer-facing views and keep full values available only to authorized operators.

Design principles

The boundaries that keep this flow reliable

01

Server records beat screenshots

A screenshot can be edited or belong to another transaction. Use verified payment and provider records as the source of truth.

02

Layer the evidence

Require merchant tenant, client transaction ID or gateway order, exact amount, reasonable time window, and UTR/provider reference agreement.

03

Protect reference data

Mask full UTR and customer identifiers in normal UI, logs, analytics, and support messages unless the role requires them.

Implementation workflow

From request to a durable result

  1. 1

    Locate the local order

    Start with the customer's authenticated order or support reference, not a global search over all merchants.

  2. 2

    Load verified payment evidence

    Compare client_txn_id, gateway order_id, expected and paid amount, payment status, and event timestamps.

  3. 3

    Compare the provider reference

    Normalize whitespace/case if appropriate, then compare the stored UTR or provider reference exactly within the tenant.

  4. 4

    Record the conclusion

    Mark matched, not found, conflicting, duplicate, or escalated and preserve the evidence IDs and operator reason.

Tenant-scoped reference lookup

sql
SELECT
  o.id AS order_id,
  o.client_txn_id,
  o.expected_amount_paise,
  p.amount_paise,
  p.status,
  p.provider_reference
FROM orders o
JOIN verified_payments p
  ON p.tenant_id = o.tenant_id
 AND p.client_txn_id = o.client_txn_id
WHERE o.tenant_id = :authorized_tenant
  AND p.provider_reference = :normalized_reference
LIMIT 2;

Production checklist

Verify before going live

  • Lookup is tenant-scoped and role-authorized
  • Reference is compared with local and gateway order identifiers
  • Exact amount and verified status are checked
  • Ambiguous multiple results are never auto-approved
  • Search and manual decisions are audit logged

Failure recovery

Unsafe matching methods

Screenshot-only approval

Request a support reference, then verify the transaction in authenticated merchant records. Do not fulfil from an image.

Global UTR search

A support role could leak another merchant's data. Always enforce tenant scope before query execution.

Amount and time only

Popular prices create collisions. Require stable order references and verified provider evidence.

FAQ

Questions developers ask

Is UTR the same as client_txn_id?

No. client_txn_id is your merchant order reference. UTR or provider reference is payment-system evidence associated with the verified transaction.

Can a screenshot prove a UPI payment?

No. Use authenticated payment status and provider evidence; screenshots are customer-provided context only.

What if one UTR appears against multiple records?

Treat it as a data-integrity exception, stop automatic fulfilment, and escalate with tenant-scoped audit evidence.

Build the real flow

Move from guide to a verified ₹1 payment

The dashboard checklist takes you through merchant connection, payment verification, webhook testing, and go-live readiness.

Start setup