← All work
Product / UX Design Subscriptions · Lifecycle FanCode · Payments
53% of mandates died in month one

We turned expiring
passes into recurring revenue

A personalised, lifecycle-aware renewal system for India's biggest multi-sport streaming app — reaching the right user, on the right surface, at the right moment, with the right offer.

+47%
Renewal-rate uplift (17% → 25%)
~20%
Higher ARPU · ₹99 cohort
15-day
Renewal window engineered

From one-time passes to a recurring relationship

FanCode is India's multi-sport streaming platform, where fans buy passes to watch live tournaments. As the business shifted toward auto-renewing monthly & yearly subscriptions (via Juspay mandates), a structural problem surfaced: more than half of fresh mandates were being cancelled, and users weren't being informed about their utilisation, validity, or how to renew. Renewal isn't a screen — it's a personalised lifecycle that plays out across many surfaces and many moments.

My Role
Product / UX Designer
Scope
Lifecycle mapping → UX flows → Final UI → CMS & handoff
Platform (Phase 1)
Android App only
Target Audience
All FanCode subscribers via Juspay
Experimentation
No DRS A/B in Phase 1 — weekly cohort reads
Files
FC-Renewals (UX) → Recurring Subs Renewal (UI) + Renewal CMS

Mandates were being bought — then abandoned

The PRD framed the problem from two angles: a user who is left in the dark about their subscription, and a business bleeding recurring revenue through cancellation and one-time behaviour.

👤
User

No visibility into value or validity

Users aren't informed about their subscription utilisation or pass validity — both before and after expiry — so they can't see what they'd lose by letting it lapse.

📉
Business

Cancellation, one-time bias & no post-expiry nudge

Users cancel or pause mandates mid-validity, many opt for one-time passes over recurring, and there was nothing nudging them to renew once a pass expired.

The numbers that scoped the work

53%

of 45k fresh mandates bought in Nov '24 were revoked or paused.

70%

of users who revoke their mandate do so in Month 1.

31%

cancel right after the pre-debit notification (24h before debit).

85%

of revokes happen on the PSP app, not on FanCode — a visibility blind spot.

Hypothesis

+5% increase in users opting into recurring mandates, and a +10% increase in the M1 renewal rate for recurring subscribers — by informing users of their value and nudging renewal across the full lifecycle.

Designing the system behind the screens

Before any visual polish, the entire problem space was explored in the FC-Renewals file — the lifecycle window, the personalisation logic, every payment type, surface and edge case. The hard part wasn't the screens; it was the rules that decide which screen, which offer, and which words each user sees.

01

The renewal window & nudge logic

I mapped a single 15-day window — 5 days before expiry → day of expiry → 10 days post expiry — and defined exactly how each surface behaves within it. Home nudges show once per day (auto-dismiss at session end, one session/day, cached 24h); the MDP CTA persists until the user's next purchase; post-expiry escalates to a full-page interstitial every alternate day. A cancellation after the pre-debit notification simply drops the user into the post-expiry flow.

5 days before
Home nudge
Once/day + MDP CTA change · land on Renew Page
Day of expiry
Once / entitlement
Nudge + MDP CTA · land on Renew Page
0–10 days post
FPI · alt. days
Full-page interstitial + MDP CTA till next purchase
Recurring
Mandate-aware
Paused/revoked treated like one-time (fresh mandate needed)
02

A personalisation engine: MRETL & bucketing

Every offer is driven by the Master Renewal ETL (MRETL) — it pulls each user's last subscription, computes their matches, tours, watch-time and amount saved, then sorts them into a bucket that maps to a discount flow. The Audience Engine decides who sees a nudge on each home-page load; MRETL decides what they're offered. No discount is hard-coded — all three flows are CMS-configurable per cycle.

H
Deep discount (up to 50%)

High-intent / first cycle or value < ₹199 — push hardest to convert.

M
Light discount (~25%)

Second cycle onwards with healthy value — a nudge, not a giveaway.

L
No discount

Already availed a multi-cycle discount — protect margin.

03

Lifecycle × payment-type nudge matrix

A nudge is only useful if it matches where the user is. Pre-expiry nudges were mapped along two axes — lifecycle stage and payment type (one-time vs recurring mandate) — with dedicated handling for recurring users whose mandate is paused, revoked or cancelled: they're treated like one-time users because they need to register a fresh mandate.

Pre-expiry nudge exploration matrix
UX exploration — pre-expiry nudges split by One-Time vs Recurring payment, including mandate-failure states (account balance / bank / technical issues).
04

A value-led renewal page with dynamic copy

The new Renew Page opens with a consumption recap generated from MRETL, before any price. The headline copy adapts to what the user actually did last month — surfacing savings, matches and tours when the data is strong, and a category benchmark when it isn't. It carries at most two CMS-configured subscriptions, defaulting to the user's last-purchased type.

saved > ₹99 AND matches > 10
"Last month, you saved ₹X and watched Y matches!"
watched > Z tours AND matches > Y
"Last month, you watched Y matches across Z tours!"
else (no strong signal)
"Fans save an average of ₹299 monthly with a subscription!"
Value-led renewal page concept
UX · Renew Page concept
05

Post-expiry escalation

Once a pass lapses, urgency rises — but so does the risk of being annoying. The post-expiry system steps up gradually with a full-page interstitial on alternate days, always anchored to live, relevant matches, and only for the 10-day grace window before the user is fully lapsed.

Post-expiry nudge escalation exploration
UX exploration — post-expiry escalation across homepage interstitial, offer PL and MDP for the 10-day grace window.

From flows to shipped screens

The resolved, production-ready UI was consolidated in the Recurring Subs Renewal file. Built on shared, CMS-driven components — so the Renew Flow Configurator can change discount %, cycles and copy across Renew Page, PL and Profile without a new release.

The home nudge ladder

The final home nudge steps through the lifecycle, escalating tone as expiry approaches — and crucially holding the discount back until the post-expiry window, so we never train users to wait for a deal. The discount shown (NA / 25% / 50%) is resolved live from the user's MRETL bucket.

  • 5 days before — "Don't lose access! Expires in 5 days"
  • Day of expiry — "Last chance to renew!"
  • Post expiry — "Restart your FanCode subscription"
  • Post expiry + discount — "Offer for you: 25% OFF"
Final home nudge ladder
Final UI · Home nudge ladder

Meeting intent on the Match Detail Page

The highest-intent moment is when a user is actively trying to watch a live match. So the renewal CTA lives right inside the Match Detail Page — its copy changing with expiry status & discount — and persists from 5 days before expiry until the user's next purchase. This became the single largest renewal-driving surface.

Final MDP renewal banner
Final UI — MDP renewal CTA with in-context countdown and a bucket-driven discounted CTA, on the live match surface where purchase intent is highest.

Renew Page & repeat-monthly cases

The shipped Renew Page carries the consumption-recap concept through to pixel-level, with DreamCoins & coupon popups (no upfront coupons), transparent savings, and full payment success / error states for repeat monthly subscribers — all populated by MRETL.

Final renewal product listing cases
Final UI — Renew Page / PL with payment states (success & error) for repeat monthly-pass users.

Multi-cycle discounting: lengthening the renewal window

A single-cycle discount buys one more month. A discount spread across two or more billing cycles changes the math — it defers the next "should I renew?" decision, gives the streaming habit longer to form, and smooths users across the gaps between tournaments. This required new backend capability (multi-cycle discounting) and dedicated UDF copy.

"₹99 for the next 2 months; ₹199 after"

The pricing copy itself flexes: a single-month discount reads "₹X only for the 1st month — renew at ₹Y after", while a multi-cycle offer reads "₹X for the next N months; ₹Y after." By committing a hesitating user across multiple cycles at a low-risk price, the offer extends time-on-subscription rather than just deferring churn by a month — by the time it ends, they've usually watched enough sport for the full price to feel justified.

Each user's discount depth is set by their MRETL bucket and configured per surface in the Renew Flow Configurator (Monthly / Yearly tabs × High / Medium / Low sections, each with a % and a cycle count):

Bucket H
Deep · up to 50% × 2 cycles
Strongest pull for high-intent & first-cycle users
Bucket M
Light · ~25%
A nudge for established users with healthy value
Bucket L
No discount
Already discounted — protect margin

Baseline → hypothesis → what shipped moved

Against a Nov '24 baseline of 53% mandate cancellation and 47–53% M1 renewal, post-launch reads (weekly cohort averages from production & Juspay funnels; no A/B in Phase 1) showed the renewal system working.

25%
▲ from 17% · +47% rel.
Renewal rate of inactive / failed / cancelled monthly users
~20%
▲ vs own history
Higher ARPU from the ₹99 Monthly cohort
63%
▲ from 58%
Repeat purchase of Monthly-after-Monthly
~50%
nudge reach
Of lapsed users now see the renewal nudge

The renewal funnel

Eligible → nudge seen → renewal page → renewed · week of 02 Jun 2025
Eligible for nudge
14,337
Saw the nudge
7,910 55%
Reached renewal page
2,237 28% of nudged
Renewed
1,206 54% of page

Weekly renewal conversion

% of eligible lapsed users renewing (new monthly purchase)
30%20%10%0% 15%24%25% Mar 10Mar 31Apr 21May 12
Renewal conversion %
Month Home
Contrib / Renew
Match Detail
Contrib / Renew
Pass Details
Contrib / Renew
Profile
Contrib / Renew
2025-055% / 78%21% / 69%4% / 74%8% / 81%
2025-0613% / 80%57% / 69%7% / 75%14% / 80%
2025-0720% / 77%57% / 67%7% / 76%14% / 80%
2025-0817% / 75%61% / 61%8% / 69%14% / 76%
2025-0914% / 64%61% / 55%10% / 64%15% / 70%
2025-1012% / 67%57% / 55%12% / 62%19% / 69%

Contribution = share of total renewals originating on that surface; Renew% = of users who reached the renewal page from that surface, the share who renewed. The Match Detail Page grew from 21% → ~57–61% of renewal contribution as the in-context CTA scaled — validating the "meet intent where it's highest" bet.

Designed next, built next

With the core renewal engine live on Android, Phase 2 extends it to harder cases — most notably a Cancellation Prevention Flow that intervenes before the mandate is revoked, and a PL-upsell that pulls one-time buyers into recurring.

Phase 2 — cancellation prevention flow
Phase 2 design — Cancellation Prevention: loss list (1000+ matches · ad-free) → 2-month 50%-off win-back → "offer applied" confirmation → reason capture. Cancellations after the pre-debit notification feed back into the post-expiry renewal flow.
🛡️

Cancellation Prevention Flow

Intervene with a value reminder + multi-cycle win-back before the user revokes their mandate.

⬆️

PL-upsell to one-time buyers

Convert previous one-time subscription purchases into recurring at minimal incremental price.

📅

Yearly pass renewal

Extend the renewal system to yearly subscribers with their own value framing.

🌐

mWeb renewal page + comms

An mWeb version of the Renew Page and a WhatsApp journey revamp routing users to it.

What this project taught me

⚙️

The system is the design. The screens were the easy part — the real work was the window, bucketing and copy logic that decide which experience each user gets. A good rule-set scales further than a good screen.

🎯

Context beats frequency. The Match Detail Page — where intent is highest — became the biggest renewal driver. Meeting users mid-interest mattered far more than nudging more often.

🤝

Respectful retention compounds. Holding discounts until post-expiry and only deep-discounting where it pays off protected both trust and margin.

Lifecycle UX Subscription Design Personalisation Logic Pricing & Discounting CMS-Driven UI Nudge Systems Funnel Analytics Juspay Mandates