When a subscription renewal fails, establish what happened before changing the customer’s access or asking them to pay again. The first failed attempt might be followed by a gateway retry. A customer might need to update their payment method. Or the gateway may already show a successful payment while your application is still displaying the old status.
Those are different jobs. A single “payment failed” flag cannot tell support which job to do. It can also leave the customer paying twice, losing access after paying, or receiving a reminder that no longer makes sense.
This guide starts after billing is live. If you are still deciding which payment methods to support, begin with our recurring payments guide for India. Here the question is what to record, what the customer needs to see, and when you can safely say the renewal has recovered.
Which decision are you trying to make?
Separate three questions: can the provider attempt another charge, is the invoice for this period paid, and what access should the application allow today? A provider subscription status helps with the first question. An invoice and its associated payment help with the second. Your service policy decides the third.
Consider a fictional inventory application. A shop has already paid for the current month and the next renewal attempt fails. The application should know the end of the paid period before it changes access. If the team offers a grace period, that decision belongs in its own rules. It does not turn an unpaid invoice into a paid one.
Write those rules down before implementation. Support should be able to see the paid-through date, any temporary access allowance, and the evidence for both. If only an engineer can explain why an account still works, a routine renewal issue will turn into a custom investigation every time.
What should happen after the first failed attempt?
Find the provider subscription and the invoice for the intended billing period. Check whether the failure is final for this attempt and whether the provider plans another one. Do not start a separate charge just because your dashboard shows a red badge.
Razorpay’s retry documentation describes different handling for UPI, cards and e-mandates. Its subscription states explain that a subscription may be pending while retries continue, then become halted if the attempts are exhausted. Check the current guidance for your method and integration before deciding what your application should display or do. A schedule for one method is not a schedule for all methods.
Use a small set of operational cases:
| What you know | What the customer should see | What the team should verify |
|---|---|---|
| A renewal attempt failed and the provider is still handling it | The renewal has not completed; show the next confirmed step | Whether a retry or customer action is expected |
| Automatic attempts have stopped | A supported way to resolve the outstanding renewal | Which invoice is due and which recovery options are available |
| The subscription is active again but the old invoice is open | Future billing is available; the older balance still needs review | Whether the older invoice was paid, waived or remains due |
| The invoice is confirmed paid but the app still restricts access | A payment confirmation and a way to get help if access is delayed | The invoice-to-account mapping and whether the access update completed |
| The customer cancelled or withdrew authorisation | A clear status and any remaining service entitlement | The applicable cancellation rules and that obsolete reminders have stopped |
The last row matters even if your main goal is revenue recovery. A customer decision is not a transient processing error. Keep it out of a generic retry or reminder queue.
Why does an active subscription not prove the bill is paid?
Provider state and invoice state can diverge. Razorpay’s subscription webhook reference distinguishes a subscription becoming active from a successful charge. It also describes the limits on automatic collection of previously generated invoices when billing resumes. An activation message therefore should not clear every outstanding balance in your application.
Reconcile the specific invoice. Record the provider invoice identifier, its billing period and the corresponding payment reference where available. Compare the current provider record with the customer’s account and the amount due. Razorpay’s Node SDK subscription documentation documents fetching a subscription and listing its invoices. For a support team, the equivalent check can start in the provider dashboard.
Suppose a customer updates their payment method in December after missing the November renewal. It is possible for future billing to work while a November invoice still needs a decision. The team may have agreed to waive it, collect it through a supported flow or handle it manually. Record that decision explicitly. Otherwise the next person will have to infer it from a subscription badge that was never intended to answer the question.
What should a customer recovery message say?
Say which renewal needs attention, what is known about their access, and what to do next. If the gateway already sends an actionable notice, check whether another email adds useful information. A second message that sends the customer to a different payment route can create confusion and extra support work.
Use the provider’s supported recovery path when it fits. Razorpay’s payment retry guide describes a hosted option for updating a payment method, with availability depending on the current method and the proposed replacement. Confirm the available actions for your setup. Do not ask someone to send payment credentials or an OTP to support.
A useful message might say, “We could not complete your November renewal. You can review the invoice and available payment options in your account. Your current access remains available until the date shown there.” Only use that last sentence if your actual policy and account record support it. Do not promise a retry time if you cannot verify it.
Give support a way to close the reminder when the invoice is resolved. Otherwise a correct message sent yesterday can become an incorrect one tomorrow. Keep the invoice reference and last contact visible so two teams do not independently chase the same balance.
How should the application handle delayed or repeated updates?
Treat provider notifications as evidence to process, not as commands to blindly change the customer account. Razorpay’s webhook validation guidance covers signature verification, duplicate deliveries and the possibility that events arrive out of order. Verify notifications and make processing safe to repeat. A duplicate success should not extend the paid period twice.
If a delayed failure arrives after a successful payment, reconcile the current invoice and payment before allowing the failure to change access. In the same way, do not mark the renewal paid solely because someone reached a success screen. A customer-facing confirmation and a verified billing record serve different purposes.
Keep a list of exceptions that are still unresolved. A reasonable support view shows the invoice period, provider state, application state, last verified time and the next owner. That makes it possible to find cases where the invoice is paid but access did not update, or where the system has stopped chasing a balance without an explanation.
Do not make that list another source of truth. It should point people to the evidence, not let a casual checkbox change what the provider says happened. If a human grants temporary access while investigating, record it as an access decision with an expiry, not as a payment.
What should you test before relying on the process?
Start with the provider’s subscription testing guide and its supported test scenarios. In your own test environment, walk through a failed renewal that later succeeds, exhausted retries, customer action where supported, a duplicate notification and a delayed failure after success. Use fixtures for cases the provider’s test environment does not reproduce.
For each test, write down what you expect to change in the invoice, what access the customer should have, and which message should appear. Check the recovery from the support side as well as the engineering side. A test that passes because the webhook endpoint returned a success response has not proved that the customer can use the product again.
Finally, compare the provider records and your application after the test. Confirm the intended billing period was credited once, reminders stopped, and any exception disappeared only when it was resolved. Keep tests away from real customer accounts, live debit attempts and production contact lists.
When is a custom recovery workflow unnecessary?
If your provider already handles retries and customer action, and your team can reconcile occasional exceptions in its dashboard, start there. A new scheduler adds responsibility for every method, rule change and edge case. It is not a substitute for agreeing who owns a renewal problem or what access a customer should retain.
Build an integration when there is a demonstrated gap: support cannot connect invoices to accounts, access remains incorrect after payments, or manual follow-up has become difficult to track. Begin with reconciliation and a clear support view. Leave charge initiation to the supported provider flow unless you have a specific, verified reason to change it.
Our web application team can help assess that boundary. Tell us which part of renewal recovery is failing. The provider, affected billing step and a redacted example are enough to start; we do not need customer payment details.
Bharat Vasireddy
Founder & Digital Marketing Strategist8+ years of experience in performance marketing and web development. I help businesses scale through data-driven SEO, Google Ads, and high-performance websites.