UPI in depth: integration and operations. 6 chapters and a final quiz.
An engineering course on India's UPI rail for teams already running UPI volume. Learn to read the status triplet NPCI returns, instrument the loss specific to collect, validate a virtual address against the central mapper, and set up an AutoPay mandate that survives its execution windows. Then run an idempotent webhook consumer under the polling discipline imposed since 2025, reconcile 12 settlement cycles, and turn an NPCI decline code into a retry decision.
🇮🇳
Breaking the status of a UPI transaction into three separate fields (result, UPI error code, bank response code) and knowing which one is authoritative
Instrumenting the success gap between intent and collect from each mode's own decline codes, not from a hunch about the checkout flow
Validating a virtual address against the central mapper, interpreting mapping codes, and handling mobile number recycling
Wiring up UPI AutoPay around the authentication threshold built into the protocol, the off-peak execution windows, and the attempt quota
Chapter 1. Intent, collect, QR: measuring the loss instead of guessing at it.
The final status of a UPI transaction is spread across three separate fields, set by three different parties. The first carries the verdict, the second the cause as NPCI sees it, and the third the cause as the payer's bank sees it. Breaking out these three fields is the benchmark of a mature integration, more than watching the checkout flow. Merging them into a single metric produces misleading dashboards. If you store only the verdict, you can't tell a loss caused by the merchant's flow from a loss caused by a struggling bank.
Three fields, three sources
Scope
Set by
Values
What it tells you
Result
UPI
SUCCESS, FAILURE, DEEMED
The verdict. DEEMED flags a credit of unknown status: neither succeeded nor failed, to be resolved later through UDIR or the back office
ErrorCode
The UPI service layer
Codes U01 to U99, M16, S93…
The cause as the central switch sees it: duplicate, limit, expiry, member bank unavailable
RespCode
The bank or PSP on the response leg
Two-character codes: Z9, ZM, B3, XH…
The cause as the bank sees it: balance, PIN, account type, court-ordered freeze
What a final RespPay message carries, per NPCI's error and response code specification (version 2.9)
Next to each code, the NPCI specification publishes a classification: BD for a business decline and TD for a technical decline. That label determines what the merchant is allowed to try next. A business decline comes from the payer or their account, and retrying it unchanged returns the same code. A technical decline comes from an outage, so a second attempt makes sense. NPCI has given its members targets of under 1% for technical declines and under 5% for business declines.
Mode
Mode-specific decline codes
What you don't control
Instrumentation to build
Intent (upi://pay)
No code of its own: the loss happens before the rail, when the app fails to open or the customer drops off
Whether a UPI app is installed on the device, and the switch between apps
Count links issued, returns from the app, and authorizations requested: the gap is your real drop-off
Dynamic QR
X6 invalid merchant (acquirer), PQ tampered QR on the e-RUPI rail
Scan quality, how old the displayed QR is, how fresh the reference it carries is
Timestamp QR generation and expiry; a QR that stays live too long collects a stale amount
Collect
U69 COLLECT EXPIRED, classified BD, a loss category that doesn't exist in intent
Notification delivery, the payer's attention, the expiry time you set
Track the expiry rate by time bucket: it's the only lever you have
The three collection modes and the loss specific to each. The useful comparison is between codes, not screen counts
⚠️
You don't optimize collect, you retire it
U69 COLLECT EXPIRED means the payer did not approve a payment request before it expired. The code is classified as a business decline: the rail worked and the payer didn't respond. No API optimization lowers that rate, because the variable is payer behavior. Collect also carried the most common fraud on the market, a payment request disguised as money the victim was about to receive, and NPCI discontinued person-to-person collect on October 1, 2025. Keeping collect at checkout therefore exposes the merchant to a loss no technical fix can reduce, on a mode whose person-to-person side NPCI has already shut down. Collect still has one narrow use: requesting an unpaid amount from an address that is already known and validated.
< 1 % / < 5 %
targets communicated to UPI members for technical and business declines
NPCI, UPI circular OC No. 149 (2022) and addendum OC No. 149A of June 15, 2022
monthly
how often NPCI publishes business declines, technical declines, and uptime, bank by bank
NPCI, “Declined (BD/TD) & Uptime” page
22,716.07M
UPI transactions in June 2026 alone, the scale that makes fine-grained measurement worthwhile
NPCI, UPI product statistics, June 2026
The instrumentation that follows from this stores, for every attempt, the three status fields, the BD or TD classification, the payer's bank identifier, and the initiation mode. Without the payer's bank identifier, the merchant can't match its failures against NPCI's monthly publication. A single bank's degradation then looks like a regression in the merchant's app. Teams that manage their authorization rate in India compare their own breakdown with the market's every month.
🎯 Quick question
Your dashboard shows UPI failures rising. Which field do you check first to find out whether the cause is on your side?
Chapter 2. VPAs: the central mapper, validation, and number recycling.
A virtual payment address, or VPA, is a directory entry that stands in for payment details. It is not an account. NPCI's central mapper links each identifier to the app provider that holds it. That identifier can be a name@bank address, a mobile number, or a numeric ID. Directory entries change over time, so every payment starts with resolution. Treating the VPA as stable data leads to debiting the wrong person, or losing track of the customer.
Resolving an address before payment
Your server
Sends the address the customer entered to the aggregator
Normalize first: strip spaces, convert to lowercase, check that the separator is present
➜
Payee's PSP / bank
Queries NPCI's central mapper
The mapper indicates which app provider holds the identifier
➜
Central mapper
Responds, or returns a mapping code
`MM2` MAPPING_DOES_NOT_EXIST, `MM3` MAPPING_BLOCKED, `MM4` MAPPING_INACTIVE, depending on the entry's state
➜
Payer’s bank
Returns the account holder's name as it has it on file
This is the string you show the customer, never the name they typed in themselves
➜
Your server
Has the customer confirm the name, and only then initiates payment
On an instant rail, paying the wrong recipient can't be undone automatically
Mapper codes, and what they require
Code
Meaning
What your system must do
MM2 MAPPING_DOES_NOT_EXIST
The identifier isn't linked to any app provider
Reject the input on screen, without creating a database record or a payment attempt
MM3 MAPPING_BLOCKED / MM4 MAPPING_INACTIVE
The entry exists but is blocked or inactive
Treat it as a dead address: trigger an update flow, not a payment retry
MM5 VPA_MAPPED_TO_ANOTHER_MOBILE
The address is linked to a different number from the one presented
Stop. This is a sign of identifier takeover: escalate it to risk
MM10 COOLING_PERIOD_NOT_OVER
A cooling-off period applies after a registration change
Don't retry in a loop. Schedule a delayed recheck
MM18 ID_MAPPED_TO_DIFFERENT_VPA
The identifier now points to a different address
Invalidate the stored address and revalidate before any debit
ZH INVALID VIRTUAL ADDRESS / U29 ADDRESS RESOLUTION IS FAILED
Invalid address, or resolution failed at payment time
Log them separately: the first is a business decline, the second a resolution failure
NPCI central mapper codes seen in production, and the expected merchant response
⚠️
Indian mobile numbers get recycled, and your database doesn't know it
India's Department of Telecommunications allows a number that has gone unused for 90 days to be reassigned, so a numeric UPI ID tied to that number can change hands without the merchant receiving any notice. Since April 1, 2025, NPCI has required banks and app providers to update their records weekly from the Mobile Number Revocation List. The deadline for the initial cleanup was March 31, 2025. A refund sent to a numeric ID stored two years ago can therefore credit a stranger, and the rail offers no card-style recourse to get the money back.
Virtual address handling: five rules to code once
1. NORMALIZE ON WRITE
trim, lowercase, check for a single '@' separator
'Ravi@okhdfcbank' and 'ravi@okhdfcbank' = ONE database row
2. NEVER KEY THE CUSTOMER ON THE ADDRESS
primary key = your customer ID
the address is a DATED ATTRIBUTE, with a history
useful columns: value, validation date, returned name, status
3. REVALIDATE BEFORE ANY DEFERRED DEBIT
an address validated six months ago is not a valid address
revalidate before: refund, payout, mandate reactivation
4. DISPLAY THE NAME RETURNED BY THE BANK, NOT THE ONE ENTERED
and require explicit confirmation from the customer
5. LOG FAILURES SEPARATELY
resolution failed -> the address was not found
payment declined -> the address exists, the debit was declined
Mixing them makes the failure rate meaningless.
Mapping code source: NPCI, UPI Error and Response Codes v2.9,
Central Mapper section.
🎯 Quick question
You're preparing a refund to a UPI address that was validated at purchase, 14 months ago. What do you do?
Chapter 3. UPI AutoPay: UMN, protocol thresholds, and execution windows.
UPI AutoPay rests on an object separate from the payment: the mandate, identified by a UMN, the unique mandate number. The mandate has its own life cycle, from creation through repeated execution, amendment, pause, and revocation to expiry. Each stage has its own codes. Reading a mandate execution the way you'd read an ordinary payment therefore ignores half the available information. Mandate codes tell you why a subscription can no longer be collected, and which flow the merchant needs to trigger.
The authentication threshold is written into the protocol
Regulation requires strong authentication on a mandate's first installment, then waives it below ₹15,000. Two response codes in the NPCI specification encode that threshold. V3 flags a missing PIN block on a transaction above ₹15,000. V4 flags the same gap on a transaction below ₹15,000 whose sequence number is 1. The rule is therefore hard-wired into the messages as well as written in regulation, and merchant integrations run into it as a decline code. A price increase that crosses the threshold produces V3 in production, inside the payment flow itself.
Code
Meaning
Type
Flow to trigger
V3 / V4
PIN block missing: above ₹15,000, or on the first installment
BD
Bring the customer back into the flow. No automatic retry is possible
QC / VA MANDATE HAS BEEN REVOKED
The payer revoked the mandate
BD
The subscription has ended. Don't retry; hand off to retention
QD / VU MANDATE HAS EXPIRED
The mandate's end date has passed
BD
Re-enrollment. Send the alert before the end date, not after the decline
VT MANDATE IS PAUSED
The payer has paused the mandate
BD
Neither retry the payment nor cancel: wait, and keep the customer informed
VE MANDATE IS ALREADY HONOURED
The installment has already been paid
BD
A sign that you triggered it twice. Fix the scheduler
VK
The number of mandates on the account exceeds the issuer's limit
BD
Offer another account or another rail. The constraint is at the payer's bank
VS DUPLICATE MANDATE REQUEST FOR SAME ITEM
Duplicate mandate request for the same item
BD
Look up the existing mandate before creating a second one: the duplicate is yours
MM MANDATE REQUEST IS DECLINED BY MERCHANT
The payee declined the mandate request
BD
Check your own acceptance rules: the decline came from your side
The NPCI mandate codes most often seen in subscription operations, and the flow each one triggers
A recurring mandate carries purpose code 14. The specification then requires the block-funds flag to be N, and codes Q3 and V5 reject the opposite.
The same purpose code requires a revocable mandate, except for merchant category code 7322, where either value is accepted. Codes Q4 and V6 flag any mismatch.
The sequence number identifies the installment within the mandate. It carries the first-execution logic and is the natural idempotency key for the scheduler.
A mandate executes through its own pair of messages, distinct from a one-off payment. Your logs therefore need to group events by UMN, not just by transaction ID.
A mandate's expiry date is known in advance: it's written into the mandate itself. A team that discovers VU in production missed an alert it could have set up weeks earlier.
⚠️
You no longer choose when your billing runs
Since August 1, 2025, NPCI has restricted UPI AutoPay mandate execution to off-peak periods, with peak hours defined as 10:00 a.m. to 1:00 p.m. and 5:00 p.m. to 9:30 p.m. Executions therefore run before 10 a.m., between 1 p.m. and 5 p.m., or after 9:30 p.m. The same framework limits attempts to one initial execution and up to three retries per sequence number, for a total of four. For a subscription business, this has two consequences. A billing calendar set to midnight, or to head-office time in another country, gets shifted by these windows. A retry policy that plans six attempts per installment schedules two that will never run.
Designing the billing calendar runs into a second constraint, separate from these time windows. The mandatory pre-debit notification puts the payer's decision before execution, not after a decline. An Indian subscription therefore runs on two clocks: notification, which belongs to the customer relationship, and execution, which belongs to the rail. The data model keeps them apart. A payer who opts out the day before and a bank that rejects the debit on the day have the same accounting effect but opposite causes. Merging them into a single metric leaves the retention team unable to tell a customer who is disengaging from a customer whose account declined the debit.
🎯 Quick question
Your subscription scheduler triggers every Indian direct debit at 11:00 a.m. local time and plans six attempts per installment. What do you fix?
Chapter 4. Webhooks, idempotency, and polling discipline.
The UPI specification provides three outcomes for a transaction, including an intermediate state called DEEMED. It describes a transaction whose credit status is unknown and whose outcome will be resolved later. On UPI, no response within the expected time falls into this state, not into failure. Translating a timeout into “payment declined” therefore invents information the rail never provided. What follows is a debited customer, a canceled order, a refund to process, and a dispute that will come anyway.
⚠️
Timeout codes don't all mean the same thing
U67 DEBIT TIMEOUT is classified TD: the debit didn't respond in time, and the outcome is still open. U30 DEBIT HAS BEEN FAILED is classified neither BD nor TD in the specification, because it describes a state of the flow rather than a decline reason. U09 REQAUTH TIME OUT FOR PAY, U28 REMITTER BANK NOT AVAILABLE, and U78 BENEFICIARY BANK OFFLINE are all technical and tell you nothing about the payer's account. Lumping these five codes into a single decline erases the difference between an outcome that is still open and an identified outage, even though each calls for a different response.
Status polling is a regulated resource
NPCI's circular of April 26, 2025, which sets the rules for using the status check API, puts the first call at 90 seconds after the original transaction is initiated. A later communication shortened that delay to 45–60 seconds.
The same circular caps status checks at three calls, preferably within two hours of initiation. After that, members consult the settlement files instead of the switch.
A defined list of codes means stop polling: receiving any of them requires treating the transaction as failed and ending the queries.
The status check API rejects any original transaction more than 90 days old: code X09 flags a date outside the window. Past that point, the truth is in the files, not in a query.
The Guidelines on the usage of UPI API of May 21, 2025 cap balance inquiries at 50 per app, per customer, per day, and restrict certain inventory APIs to off-peak hours. The compliance deadlines were July 31 and then August 31, 2025.
A minimal idempotent consumer that holds up in production in India
KEYS AND WHO OWNS THEM
order_ref -> YOU. Set when the order is written, sent in the request,
echoed back in every event.
txnId / RRN -> THE RAIL. Unknown until the transaction exists.
UMN -> THE RAIL. Identifies the mandate, not the installment.
seqNum -> THE INSTALLMENT within a mandate. The natural idempotency
key for a subscription scheduler.
RECEIVING AN EVENT
1. verify the signature BEFORE reading the body
2. uniqueness key = (order_ref, event_type, txnId)
already seen -> return 200 and EXIT, without replaying any business effect
3. acknowledge immediately; business processing is asynchronous
4. apply a state transition only if it is ALLOWED
PENDING -> SUCCEEDED | FAILED | UNKNOWN
UNKNOWN -> SUCCEEDED | FAILED
SUCCEEDED -> (none) <- a late event never downgrades it
FAILED -> SUCCEEDED <- allowed: the rail can confirm late
STATUS POLLING (NPCI limits, circular of 2025-04-26)
t = 90 s first call
then 2 more calls max, preferably within 2 hours
stop code received -> FAILED, stop querying
after that -> settlement files, no more per-transaction calls
transaction older than 90 days -> rejected (code X09)
DUPLICATES
U01 THE REQUEST IS DUPLICATE -> your request had already been sent
DF / DT DUPLICATE RRN FOUND -> RRN collision on the beneficiary side
or the remitter side
In both cases: DO NOT recreate the transaction. Query its status.
What you see
What it isn't
Decision
No response after 30 seconds
A failure
Wait. The first status check isn't allowed before 90 seconds
Result = DEEMED
A partial success to book
Unknown state: don't deliver or cancel. The outcome will come from the back office or UDIR
Success webhook received twice
Two payments
Idempotency on (order_ref, type, txnId): the second event is absorbed with no business effect
Three uncertain situations and the right decision
One last practice becomes unworkable in India: querying the payer's balance to anticipate a decline. The cap of 50 inquiries per app, per customer, per day makes that architecture untenable at scale, and NPCI has explicitly identified API overuse as a cause of rail outages. The merchant receives the information anyway, first through the execution event and then through the settlement file. The expected architecture therefore consumes those two inbound feeds instead of querying the rail transaction by transaction.
🎯 Quick question
Your UPI payment call has received no response after 20 seconds. Which sequence is compliant?
Chapter 5. UPI reconciliation: settlement cycles, UDIR flags, and disputes.
UPI reconciliation relies on daily settlement cycles, on the files produced at each cycle, and on a central clearing system that resolves discrepancies. The model differs from card networks, which separate authorization from capture, apply a presentment window, and send a monthly network statement. None of those three mechanisms exists on UPI. Reconciliation therefore runs at three levels, each with its own key.
September 20, 2019
Binding deadlines for failed transactions
RBI circular RBI/2019-20/67 DPSS.CO.PD No. 629/02.01.014/2019-20 requires, for UPI, a reversal no later than T+1 whenever an account has been debited without the beneficiary being credited. Beyond that deadline, the customer receives ₹100 per day of delay.
February 10, 2025
Disputes decided automatically
NPCI circular UPI OC No. 213, effective February 15, 2025, makes accepting or rejecting a dispute automatic. The decision follows the credit confirmation (TCC) or the return (RET) generated by the beneficiary's bank in the next settlement cycle. The scope covers bulk uploads and UDIR, not single-transaction interfaces.
April 26, 2025
Status check rules
NPCI limits use of the status check API and directs members to the settlement files after two hours. Reconciliation stops being a fallback and becomes the standard procedure.
November 3, 2025
Authorization and dispute cycles split
Cycles 1 to 10 now carry authorized transactions only. Disputes move into two dedicated cycles, 11 and 12, labeled DC1 and DC2 in the settlement files. Cut-off times and settlement deadlines are unchanged.
Reading UDIR flags
Flag
Meaning
Associated codes
DRC
Debit reversal confirmation
102, 103; 104 when the original transaction was not debited; 105 on timeout
TCC
Transaction credit confirmation: the beneficiary's bank confirms that the funds arrived
102, 103
RET
Return initiated by the beneficiary
114 to 120
RRC
Return reversal confirmation
501 on success, 502 on timeout
BUU / RUU / PUU
Unable to update: on the beneficiary side, on a return, or on a complaint response
Flags in the Unified Dispute and Issue Resolution (UDIR) interface and their associated codes, per the NPCI specification
The three levels of reconciliation, and the key for each
LEVEL 1 — ORDER <-> TRANSACTION
key: your order reference, sent at initiation
source: your events + the aggregator's report
typical gap: order with no transaction (abandonment), or transaction
with no order (double submission on the customer side)
LEVEL 2 — TRANSACTION <-> SETTLEMENT CYCLE
key: transaction ID and RRN
source: files produced at each cycle
since 2025-11-03: cycles 1-10 = authorizations,
cycles 11-12 = disputes (labels DC1, DC2)
typical gap: successful transaction not settled in the expected cycle
-> this is NOT a failure, it is a cycle shift
LEVEL 3 — SETTLEMENT <-> FUNDS IN THE BANK
key: the aggregator's payout reference
source: statement for the payout account
typical gap: net amount differs from the expected gross
-> fees, withholdings, dispute reversals
DESIGN RULE
Never reconcile on (amount, timestamp). On a rail that processes
more than 20 billion transactions a month, collisions are certain,
not just likely.
ℹ️
A dispute is won in the next cycle, or not at all
Since February 15, 2025, a UPI dispute filed in bulk or through UDIR is automatically accepted or rejected based on the credit confirmation or return generated in the next settlement cycle. The merchant's window to produce evidence is therefore measured in hours. The organizational consequence matters more than the technical one. Proof of fulfillment, whether a delivery, a service rendered, or an access log, must be available without human intervention and sent to the aggregator the same day. A dispute process that depends on a manual search in a back office produces its evidence after the automatic decision has already been made.
⚠️
Late refunds carry a fixed price tag
The RBI circular of September 20, 2019 harmonizes turnaround times for failed transactions. On UPI, an account debited without the beneficiary being credited must be reversed no later than T+1; otherwise, the customer receives ₹100 per day of delay. The compensation accrues per transaction and per day of delay. A batch of 10,000 transactions stuck for five days therefore costs ₹5 million, before any reputational damage. Automatic replay and refund processes thus hit the P&L, not just operational convenience.
🎯 Quick question
A UPI transaction marked successful in your system doesn't appear in any settlement file for the expected cycle. How do you interpret that?
Chapter 6. NPCI decline codes and limits: the decision table.
A decision table maps every decline code to the next step. It answers three questions: where the decline came from, whether another attempt is worthwhile, and whether to notify the customer. The NPCI specification already answers the first with the BD or TD classification, which separates business declines from technical declines. The other two are up to the table itself. The operations team keeps it up to date as the specification evolves.
Code
Description
BD / TD
Decision
Z9
Insufficient funds in the payer's account
BD
No automatic retry. Offer another payment method, or reschedule
ZM / Z6
Invalid PIN, then too many attempts
BD
The payer has to act. Z6 signals a block: don't retry the same day
ZA
Transaction declined by the customer
BD
An explicit refusal. Treating it as a technical failure damages the relationship
Z8 / Z7 / ZU
Per-transaction limit, frequency limit, payer's bank limit
BD
Split the payment or switch rails. The constraint is at the issuer, not with you
FL
First-transaction limit exceeded, for a user new to UPI
BD
New customer. Offer a smaller amount, or defer
U02 / U03
Amount limit exceeded, net debit limit exceeded
BD
Check the assigned merchant category and its limit
U16
Risk threshold exceeded
BD
Don't retry. Repeated retries worsen the payer's risk score and yours
B3
Transaction not permitted on this account: minor's account, business account, court proceedings
BD
The account is structurally ineligible. Ask for another account
XH / XI
Account does not exist, on the remitter or beneficiary side
BD
Check the addressing before any retry. On XI, the error may be yours
U28 / U78
Payer's bank unavailable, beneficiary's bank offline
TD
A legitimate delayed retry. Correlate with the monthly uptime publication
U69
Collect request expired
BD
The rail worked. The levers are the expiry time, or dropping collect mode
U77 / X6 / ZN
Merchant blocked, merchant invalid, function unavailable for the merchant at the acquiring bank
TD / BD
The problem is in your acceptance setup. Escalate to the aggregator; don't chase the customer
Common UPI decline codes in merchant payments, and the corresponding decision (source: NPCI, UPI Error and Response Codes v2.9)
Limits don't all come from the same place
A UPI limit comes from one of three sources, and the decline code tells you which one applied. NPCI sets a framework by category, while the payer's bank applies its own limits, flagged by ZU, Z8, and Z7. The UPI service layer adds its own amount and net debit limits, flagged by U02 and U03. Blaming every limit on NPCI leads you to request a pointless exemption when the limit you hit belongs to the customer's bank.
Category
Per transaction
24-hour total
Capital markets
₹5 lakh
₹10 lakh
Insurance
₹5 lakh
₹10 lakh
Loan and installment collections
₹5 lakh
₹10 lakh
Travel
₹5 lakh
₹10 lakh
Government procurement marketplace and payments to government
₹5 lakh
₹10 lakh
Credit card bill payments
₹5 lakh
₹6 lakh
Jewelry
₹2 lakh
₹6 lakh
Remote account opening, initial deposit
₹2 lakh
₹2 lakh
Person-to-person (P2P), unchanged
–
₹1 lakh
UPI limits by verified merchant category, effective September 15, 2025 (NPCI, circular of August 28, 2025, addendum to the circular of August 24, 2024)
🔑
A higher limit isn't requested, it's assigned
The higher limits in force since September 15, 2025 apply only to payments to a verified merchant as defined by NPCI rules, in an eligible category. Two checks concern the acceptance contract rather than the app configuration. The first is the merchant category code actually assigned to the merchant's acceptance IDs. A generic code keeps the standard limit, whatever the merchant's real line of business. The second is the verification status itself, which determines eligibility. An average order value above the assigned limit produces U02 declines in bulk, and no change to the app's code will reduce that rate.
Sort your codes into three buckets: don't retry (ZA, Z9, B3, U16), retry later (U28, U78, U67), and fix before retrying (XH, U02, ZH).
Count declines by payer bank, not just in aggregate. A single bank's degradation gets lost in an overall rate.
Never chase a customer over a code that points to you: U77, X6, and ZN describe your acceptance setup.
Store the raw code, never a translated label. Declines get replayed months later, and the code table changes.
Every month, compare your BD and TD breakdown with NPCI's bank-by-bank publication: it's the only external benchmark available.
You can tell a mature UPI operation by what it does with each decline. Code by code and bank by bank, it knows what it can fix and what it has to accept. An overall failure rate lumps those two categories together, so it can't separate them. The choice of collection mode, the retry policy, and the design of the mandate calendar all follow from this table. Build it before ramping up volume, and maintain it with the same discipline as application code.
🎯 Quick question
A jeweler is hitting a wall of U02 declines on ₹3 lakh orders. What is the most likely cause?