A founder launches an AI writing tool at Rs. 499 a month, puts a Pay button on the page, and then spends the next quarter chasing renewals by hand. People like the product. They just forget to pay on day 31.
Here's the short answer. UPI AutoPay lets a customer approve a recurring mandate once, and your gateway then debits the plan amount each cycle; it fits fixed-price plans under the per-debit cap, and it fits variable AI usage billing badly. The rest of this post covers what the gateways' own docs say about limits, notices and failures, how to design plans around them, and a small tested piece of code that turns subscription events into app access.
Everything about Razorpay and Cashfree below was checked on 2026-10-09 on their documentation or pricing pages (the Razorpay UPI FAQ I read as raw text; the other pages through a summarising fetch tool), so confirm exact wording and figures on the pages linked before you rely on them. Where I couldn't load a page, I say so. This is not legal, tax or compliance advice; recurring-payment rules are set by RBI and NPCI and change, so check with your gateway and a professional.
How does UPI AutoPay work for a subscription?
The flow, in plain terms:
- The customer picks a plan and approves a mandate in their UPI app, authenticating once. For a Rs. 15,000-or-below mandate that is the whole customer interaction.
- Before each debit, the customer is notified of the upcoming charge. Who sends the notice depends on the integration (more below).
- On the due date the gateway executes the debit against the mandate.
- You get webhooks for each outcome and update what the customer can access.
- The customer can cancel any time from their UPI app. Cashfree's FAQ gives the path as Mandates, Active Mandates, Pause/Cancel in the app.
Compared with a card standing instruction or a bank eMandate (eNACH), UPI AutoPay needs no card number and works for customers who live in their UPI app. The trade-offs are the cap and failure behaviour, which the next sections cover.
Razorpay also mentions a token authorisation payment: its Subscriptions FAQ says a Rs. 5 charge validates a customer's card or UPI ID and is refunded automatically. Tell customers, because "why did you charge me Rs. 5" is a support ticket waiting to happen.
What are the UPI AutoPay limits?
This is the number that decides your pricing, so here are the sources side by side.
| Item | Cashfree (payment-modes page, read 2026-10-09) | Razorpay |
|---|---|---|
| UPI AutoPay per debit, default | Rs. 15,000 without additional factor authentication (AFA) | Rs. 15,000 maximum for UPI recurring (UPI recurring FAQ, read 2026-10-09); debits above that need an additional authorisation from the customer |
| Higher tier | Rs. 1,00,000 with AFA; must be enabled for your account | The Rs. 1,00,000 for certain merchant category codes that a search summary gave me is not on the FAQ page I read; ask Razorpay |
| Indian cards | Rs. 15,000 without AFA, Rs. 1,00,00,000 with AFA | Visa, Mastercard and RuPay standing instructions listed; limits on a separate page |
| eNACH | Rs. 1,00,00,000 | Listed as a third option; limits not verified |
| AFA for UPI | Customer enters UPI PIN within 30 minutes | Not verified |
Cashfree's FAQ adds that "this cap is set by the payment ecosystem, not by Cashfree, so it cannot be changed at the gateway level." Razorpay's UPI FAQ says UPI mandates support INR payments only.
What this means for an AI SaaS: monthly plans at Rs. 499, Rs. 1,999 or Rs. 4,999 sit comfortably inside Rs. 15,000. An annual plan at Rs. 24,000 does not, so annual prepay should be a normal payment (UPI, card or netbanking) rather than an AutoPay mandate. If you sell team plans above the cap, ask about eNACH or the higher AFA tier instead of assuming UPI will carry them.
Can AutoPay handle usage-based billing for AI features?
Not cleanly, and this is the point most "just add subscriptions" tutorials skip. Two facts from the docs:
- Cashfree's FAQ: "The debit amount cannot change after the PDN is initiated." If the debit differs from the notified amount, the issuing bank declines it.
- Razorpay's FAQ: you can update a live subscription's amount, duration or quantity only if it was authorised with a card, not with UPI or eMandate.
So a mandate set up at Rs. 499 cannot quietly become Rs. 737 this month because the customer ran more tokens. Your realistic options:
| Model | How it works with AutoPay | Trade-off |
|---|---|---|
| Fixed plan with included usage | AutoPay debits the plan price; fair-use limits cap your cost | Heavy users hit limits and complain; light users subsidise them |
| Fixed plan plus top-up credits | AutoPay for the base plan; extra usage sold as one-time purchases | Two payment flows, but the debit never surprises the customer |
| Pure prepaid credits | No mandate at all; customers buy packs when they like | Simplest and safest for margin; no recurring revenue guarantee |
| Metered end-of-month invoice | Not a fit for UPI AutoPay amounts that cannot change after notice | You would need a different collection method |
For most small AI tools I'd pick the second row. Our credits model post walks through the margin arithmetic, and the wrapper SaaS playbook covers the business around it.
What do the gateways charge for recurring payments?
From Razorpay's pricing page (read 2026-10-09): subscriptions on cards (Visa, Mastercard, Amex, Diners) are listed at 0.9% plus platform fees per transaction, and UPI, NACH and e-mandate subscription pricing is "on request, not published". The page doesn't say how the 0.9% stacks with the 2% platform fee, so ask. GST at 18% applies on the fee.
From Cashfree's charges page (same date): UPI AutoPay is listed at Rs. 7.5 plus Rs. 5 for auto-debits under Rs. 1,000, and Rs. 7.5 plus Rs. 15 for Rs. 1,000 and above; cards, e-mandate and NACH at Rs. 7.5 plus Rs. 7.5 per mandate creation or presentation, with card platform fees on top. The page does not explicitly say whether GST applies on those subscription fees. It also lists a festive offer on platform fees that excludes subscriptions.
Worked example using only those listed figures (your negotiated rates may differ). If the Rs. 7.5 applies on every debit, a Rs. 499 UPI AutoPay charge costs Rs. 7.5 + Rs. 5 = Rs. 12.50 before any tax, about 2.5% of the plan price, while a Rs. 1,999 charge costs Rs. 7.5 + Rs. 15 = Rs. 22.50, about 1.1%. If the Rs. 7.5 applies once per mandate, the recurring cost drops to Rs. 5 or Rs. 15 per debit. The summary I read does not say which, so ask. Either way, flat per-debit fees weigh more on small plans than on large ones.
If you want the broader gateway comparison, see Cashfree vs Razorpay for developers.
Pre-debit notifications: who sends them and when?
Cashfree describes two integration styles on its FAQ page:
- Cashfree-controlled: one API call triggers both the pre-debit notification and the charge.
- Merchant-controlled: you call separate
notify-mandateandexecute-mandateAPIs. The FAQ says "a 25-hour window is required between a successful pre-debit notification and the execution of the charge", in sandbox and production.
If you pick the merchant-controlled route, your scheduler has to notify at least 25 hours ahead and handle the case where the notice fails. The amount you notify is the amount you must charge.
On the rule behind the notice, Razorpay's UPI docs (read 2026-10-09) say a regulatory requirement mandates notifying the customer at least 24 hours before each debit, and that subsequent UPI charges are initiated 25 hours after the notification. That is a vendor describing a regulation; I did not open the RBI or NPCI text. Check the current RBI and NPCI wording, and build your own customer email too. A short message three days ahead ("Rs. 499 for your Pro plan on 3 November, manage it here") cuts chargebacks and angry replies more reliably than hoping the UPI app's alert is read.
What happens when a debit fails?
Plan for it, because it will happen: low balance, bank downtime, a customer who revoked the mandate.
Razorpay's subscription states page (read 2026-10-09) defines the lifecycle as Created, Authenticated, Active, Pending, Halted, Cancelled, Paused, Expired and Completed. In Pending an auto-charge failed and Razorpay keeps retrying; in Halted all retries are used up, invoices keep generating but no auto-charges are attempted. The subscription returns to Active when a new card is charged or an older unpaid invoice is paid, and "missed charges are not retried after the subscription returns to Active". Caveat: the retry text on that page speaks about cards. Don't assume UPI retries follow the same schedule.
Cashfree's FAQ describes an On Hold status for NACH and card standing instructions, with up to 3 retries per billing cycle through the dashboard or the Manage Payment API. UPI is not mentioned in that passage.
Razorpay's subscription webhooks, from its webhook page, include subscription.authenticated, activated, charged, pending, halted, cancelled, paused, resumed, updated and completed. Cashfree's include SUBSCRIPTION_STATUS_CHANGED, SUBSCRIPTION_PAYMENT_SUCCESS, SUBSCRIPTION_PAYMENT_FAILED, SUBSCRIPTION_PAYMENT_NOTIFICATION_INITIATED and several others. Handle them with the same care as any payment webhook: verify signatures, dedupe, tolerate disorder. The Razorpay webhook handler post shows a tested pattern.
How should events map to access in your app?
Don't tie access to the gateway's status names; tie it to a paid_through date you control. Here is a small mapper I wrote and ran on 2026-10-09 with Razorpay's event names, a 3-day grace window and a 30-day period (my design choices, not Razorpay rules):
from dataclasses import dataclass
from datetime import date, timedelta
GRACE_DAYS = 3
@dataclass
class Access:
state: str # none | active | grace | suspended | ending
paid_through: date | None
def apply(prev: Access, event: str, today: date, period_days: int = 30) -> Access:
if event == "subscription.charged":
base = max(today, prev.paid_through or today)
return Access("active", base + timedelta(days=period_days))
if event == "subscription.pending":
return Access("grace", prev.paid_through)
if event == "subscription.halted":
return Access("suspended", prev.paid_through)
if event in ("subscription.cancelled", "subscription.completed"):
return Access("ending", prev.paid_through)
return prev
def can_use(a: Access, today: date) -> bool:
if a.state in ("active", "ending"):
return a.paid_through is not None and today <= a.paid_through
if a.state == "grace":
return a.paid_through is not None and today <= a.paid_through + timedelta(days=GRACE_DAYS)
return False
Output of a scripted lifecycle (authenticated, charged, two failed retries, halted, a late recharge, then cancel):
2026-10-01 subscription.authenticated -> state=none paid_through=None can_use_today=False
2026-10-01 subscription.charged -> state=active paid_through=2026-10-31 can_use_today=True
2026-10-31 subscription.pending -> state=grace paid_through=2026-10-31 can_use_today=True
2026-11-01 subscription.pending -> state=grace paid_through=2026-10-31 can_use_today=True
2026-11-04 subscription.halted -> state=suspended paid_through=2026-10-31 can_use_today=False
2026-11-10 subscription.charged -> state=active paid_through=2026-12-10 can_use_today=True
2026-11-15 subscription.cancelled -> state=ending paid_through=2026-12-10 can_use_today=True
after cancel, can use at paid_through: True
after cancel, can use paid_through+1: False
Three details to notice. Authentication alone grants nothing; money has to arrive first. The late recharge on 10 November starts a fresh 30 days from that date, not from the missed cycle, which matches the docs' statement that missed charges aren't retried. And cancellation keeps access until the paid period ends, which is both fair and the kind of thing that avoids refund requests.
Common mistakes with AutoPay on AI products
- Annual plans above the cap. A Rs. 24,000 mandate is over the Rs. 15,000 figure on both gateways' pages. Collect annual plans as ordinary payments.
- Promising "unlimited" on a fixed debit. The mandate fixes your revenue, not your cost. Put fair-use limits in the terms and in the product.
- Changing price on existing subscribers. For UPI the amount can't just be edited (per Razorpay's FAQ). Plan a migrate flow: cancel and create a new mandate with a clear customer message.
- No grace window. A one-day bank glitch should not lock a paying customer out mid-task.
- Trusting the browser. The checkout callback tells you the customer finished a screen. The webhook tells you money moved.
- Skipping test mode. Cashfree's FAQ says the 25-hour notice window applies in sandbox too, so test your scheduler with real timing, not by skipping ahead.
Which gateway should you pick for subscriptions?
Honest answer: it depends on your plan prices and support needs, and I haven't run a subscription through either one. On the pages I read, Cashfree publishes clearer flat fees for UPI AutoPay and documents its merchant-controlled flow in detail; Razorpay publishes card-subscription pricing and a fuller state and webhook model but keeps UPI and NACH subscription pricing on request. Both are fine. Get written answers to four questions before you commit: the UPI-specific retry schedule, the all-in fee at your plan price, who sends the pre-debit notice, and how plan changes work for UPI subscribers.
If you decide on Razorpay, you can sign up through this link. Some links on this page are affiliate links; they cost you nothing and I only link tools I'd mention anyway. Everything above applies the same if you go with Cashfree.



