top of page

Watching Cricket,
Not Switching Apps

Designing CREX × FanCode Live Streaming — a two-year monetization bet on a 100M+ user cricket platform

Overview

Product Designer leading CREX's two-year integration of FanCode live streaming into a 100M+ user cricket app with no streaming rights of its own — a monetization bet that had to work without turning a live-scores product into a streaming one, coordinating closely with CREX's lead designer and other designers, and directly with FanCode's team (no PM on CREX's side of this project). Across two phases — placement first, then a free-trial-driven conversion push — the best-performing trigger placement converts at nearly 3× the others, and introducing a free trial nearly doubled purchase completion.

Screenshot_20261006-184455.png

Context — Why This Existed

CREX wasn't losing users to streaming apps. Its audience comes for a specific, narrow job: live scores, ball-by-ball commentary, and match data — not streaming. Streaming was not a retention fix; it was a new revenue experiment, proposed by the business team as a way to diversify beyond ads. CREX had no direct broadcast rights of its own, so the plan was to partner with a platform that did — a decision made by the business team. That partner was FanCode.

​

The commercial split was clean from day one: FanCode owned the content, the SDK, and the entire pass-purchase (PL) page, which opened as a webview inside CREX. CREX's job was narrower and, in a way, harder — decide how and where a feature that isn't core to the product gets introduced, without either under-promoting it (wasting the partnership) or over-promoting it (misrepresenting what CREX is). The one hard technical/product constraint from the start: the integration had to be seamless enough that it never disrupted CREX's core experience — live match updates, commentary, and scores.

​

​

The central design tension of this entire project: streaming had to live inside a product that isn't a streaming product, coexist with the actual reason people opened the app, and still convert.

Phase 1 — Earning the Right to Exist in the App

The obvious move — and the one I pushed back on — was to put a "Buy Pass" trigger on the Matches tab, CREX's default screen and its highest-traffic real estate. I didn't take that path, for two reasons that came directly from what CREX actually is: streaming wasn't our identity, and FanCode's rights only covered a limited set of series while CREX's own coverage was near-universal; we run almost every domestic and international match. Putting a streaming CTA on the one screen meant to represent every match in the app would have quietly promised something we couldn't deliver the first time someone tapped through to a match FanCode didn't carry.

So the entry points moved inside the match itself, only where streaming was already confirmed for that match.

The Trigger Set

What shipped wasn't one banner but a small system of context-aware entry points, each earning its placement:

 

Match Info -

A persistent card whose copy shifts with proximity to kickoff ("Starts In: 1h 32m" → "Live At: 7:30 PM" → "Live On: Tomorrow" → a full date). Info is the default tab until a match goes live, so it's the natural place to pitch streaming before the stream even starts — and showing the countdown makes the offer feel concrete and real rather than just a promise. A first-time coachmark spotlights this banner on first exposure, dimming the rest of the screen with a "Got it!" dismiss. Tapping it opens a bottom sheet that adapts to purchase status: if the user hasn't bought a pass yet, it always shows the "Buy a Pass" CTA with pass details; if they've already bought a pass for that upcoming match, it instead shows a countdown to when the stream starts, since there's nothing left to sell them.​

 

Live tab, static banner-

Placed below the live score, not above it, so the core scoring experience is never displaced. Live also has the highest time-on-tab of any screen during a live match, which is a big part of why this placement converts as well as it does.

​

Over-end banner-

Surfaces for a fixed 10 seconds every time an over ends, a moment CREX already treats as premium ad inventory. It's sized larger than the static trigger so it's easy to notice, and the whole card is clickable.

 

Wicket banner-

Designed during Phase 1 but deprioritized and shipped later. The insight: FanCode's stream runs roughly two balls behind CREX's live score, so a user who just watched a wicket fall on CREX can still catch that exact wicket live if they act immediately — converting curiosity into a purchase decision at the moment it peaks. Same fixed 10-second duration as over-end.

​

Fixed CTA-

A persistent, always-on element in the Live and Commentary tabs, simply because these are the two most-used tabs during a live match. Whichever tab a user spent the most time in before leaving a match becomes the default tab the next time they open one, so the app alternates which tab is "home base" based on habit.

 

One rule ties the set together: only one trigger is ever visible at a time. The fixed CTA is hidden the instant an over-end or wicket banner appears, so the feature never stacks multiple asks on screen at once — a small restraint that mattered more than any individual placement.

Match Info

Screenshot_20260927-181454.png

Live Tab Static Banner

Screenshot_20260927-181439.png

Over-End Banner

share_1853279820895527307.png

Wicket Banner

Screenshot_20260930-183315.png

Commentary Fixed CTA

Screenshot_20260927-181444.png

A Different Rule for Users Who've Already Said Yes

Everything above is deliberately conservative — and deliberately so only for users who haven't shown intent. CREX tracks its own purchase record (not pulled from FanCode): once a user buys a pass, their ID is marked active, and a second purchase makes them a repeat user. For these users, horizontal FanCode banners appear at the very top of both the Matches/Live and Matches/For You tabs, covering live and upcoming matches together, and are removed automatically once that pass's series ends. So new users get conservative, contextual triggers; proven, paying users get upfront treatment.

​

Tapping one opens the stream as a bottom sheet if the match is upcoming and live stream if the match is live, with a free trial. The rest of the flow works the same way; the user can buy the pass from here directly for upcoming and live streams.

No prominent fancode banners on Matches tab if user haven't bought a pass

Screenshot_20261003-151840.png
Screenshot_20261003-154804.png

Showing prominat streaming element to show live and upcoming streams at Live and For You tabs for users who already bought a Pass

Closing the Loop on Payment

The purchase bottom sheet handles three states explicitly: a failed payment offers a direct retry without losing the sheet; a pending payment shows a "Confirming your Payment" state the user can dismiss with "Got it!" and return to later; and success plays a short connecting animation (Lottie) between the FanCode and CREX marks before the sheet auto-closes — a small moment of reassurance that the two systems actually talked to each other. The stream starts automatically after the success bottom sheet if the match is Live. We show the time of stream in bottom sheet after the success screen if the stream is upcoming and not live yet.

SUCCESS

Screenshot_20261006-170827.png

IN PROCESS

Processing32.png

FAILED

Failed12.png

Phase 2 — Introducing the FREE TRIAL

FanCode already had a free trial live in their own app, but it wasn't yet exposed through the SDK CREX had integrated with — that alone kept it out of Phase 1. Separately, the team also wanted to first confirm real user intent for streaming inside CREX before layering a conversion mechanic onto a still-unproven placement. Once CREX was confident about taking the integration further, the team discussed introducing the trial with FanCode specifically, and FanCode enabled it in the SDK. Nearly every streaming platform lets people sample the product before paying, and this was the obvious next lever once both sides were ready to commit further.

​

The open question was length. Trial length started at 3 minutes internally, tested too short, and settled on 5 minutes for two independent reasons that happened to agree: it's roughly the length of one over of cricket — enough time to judge whether the broadcast is worth paying for — and it was also the maximum duration FanCode's platform could actually support. A user-research answer and a partner constraint converged on the same number.

Screenshot_20261006-184455.png

The Trial Flow

The "5 min Free" tag appears only on the live-match trigger — never on the upcoming-match version, since there's nothing to preview before a match starts. The tag/timer is removed automatically once a user has fully consumed their trial, and this behaves consistently everywhere it appears (in-match triggers and the Matches-tab discovery banner alike). Tapping the trigger drops the user straight into the stream with a countdown running top-right ("X:XX FREE / Buy for ₹25"). At 15 seconds remaining, a second, more urgent card slides in below the player with a live countdown and a "Buy a Pass" CTA — a warning, not a wall. It reminds the user that their free trial is about to be ended and they have to buy a pass to continue watching the stream.

​

When time runs out, the video freezes on a lock overlay ("Your free trial is over") and holds that state for a few seconds before the "Buy a Pass" button itself fills with a light color as a visual countdown to an automatic handoff to FanCode's pass page — the fill completing is the redirect. If the user returns without buying, the player reverts to the same "trial ended" state rather than looping back to nothing. For upcoming matches, this entire mechanic is absent — same Phase 1 design, unchanged, since there's nothing as free trial yet.

Holding the Line Against the Partner's Own Incentives

There was no CREX-side PM on this project — the design team coordinated with FanCode's team directly, so FanCode's commercial pressure landed directly on design decisions, with no PM layer to absorb it. FanCode's own PM pushed in review for more upfront, TOFU-maximizing placement, including a dedicated streaming section on the Matches tab, the exact move rejected in Phase 1. That was prototyped and rejected again for the same reason. We decided to still serve FanCode's discovery goal through an awareness bottom sheet introducing the CREX × FanCode partnership without giving streaming a dedicated section on the app's busiest screen, at least for now.

​

The same principle governs a separate, auto-opening video-preview nudge: a muted, auto-playing preview bottom sheet (mute/unmute toggle, "Got it!" CTA to dismiss it) that surfaces whenever a stream is live. It includes a video showing that we have streaming available for selected series as Fancode being our streaming partner. It appears on a decaying schedule (Day 1, 2, 4, 7, 11…) rather than every match, and stops resurfacing the moment a user clicks through even once.

Simplicity as a Reward for Loyalty

Pass-holders get a version of the live flow with everything stripped out that a first-time buyer needs. No "5 min free" tag, no countdown, no purchase decision — the banner simply reads "Watch Live on CREX" and tapping it opens the full broadcast immediately, no timer shown at all. There's no conversion moment left to manage for someone who has already paid, so the interface doesn't pretend there is one.

IMPACT ⎯

Did the Trial Work?

Comparing the full purchase funnel before and after the trial launched:

Overall conversion rose roughly 4.2× — but the more useful finding is in the shape of the funnel. Watch-CTA click rate roughly doubled (5.7% → 11.6%); reason: "watch free" is a lower-commitment ask than a bare "watch." What shifted was purchase completion — 3.55% → 7.12%, nearly doubling. The likely explanation: by the time someone reaches the buy decision, they've usually already sampled the stream, so the decision is no longer blind.

​

Buy-pass click rate barely moved (36.27% → 37.32%), which on its own would suggest the trial didn't create more purchase intent among people already considering it. But there's a nuance worth naming: this rate likely understates real intent rather than reflecting flat intent. In the post-trial live flow, a user is dropped straight into the stream with no upfront buy-pass CTA; the only in-stream CTA appears in the final 15 seconds, competing with the video itself for attention; and when the trial ends, the auto-redirect to FanCode's PL page isn't logged as a "buy-pass click" at all — the redirect itself doesn't count toward this number. That click only fires if a user bounces back from the PL page and then explicitly taps buy-pass — and by definition, someone who already passed on buying once at the redirect has lower intent to click "Buy Pass" again. So this rate isn't measuring the same thing pre- and post-trial: pre-trial, the click was the first purchase signal; post-trial, it's a second chance after a skipped, uncounted first one. Real purchase intent almost certainly rose by more than this flat number suggests.

 

Caveat, stated plainly: the pre-trial window is six months with no major tournament; the post-trial window is eighteen months and includes IPL 2025 and Asia Cup 2025. Some of the 4.2× lift is very likely tournament effect, not trial effect alone. The doubled purchase-completion rate is the more defensible, less volume-sensitive number of the two — a bigger tournament inflates raw counts, but not rates. More people showing up during IPL or Asia Cup would increase total purchases on its own, but it wouldn't by itself increase the percentage of people who complete a purchase once they've already reached the buy decision. That rate nearly doubling points to a real behavior change, not just a bigger audience — which is what the trial would be expected to cause.

Did Placement Matter?

Comparing tap rate (clicks ÷ tab-views, restricted to matches where streaming was actually available) across the three placements with measurable impressions:

The Live-tab trigger converts at roughly 3× the rate of the other two — and it also holds the longest average dwell time per visit. The likeliest explanation sits in the layout itself: on Live, the trigger appears directly after the score table, the tab's entire reason for existing, with nothing competing for the next moment of attention. On Commentary, the same trigger sits before the ball-by-ball feed the user actually came to read, competing with tweets, reactions, and an embedded video teaser. Position relative to the tab's real task, not the tab's content type, looks like the deciding factor. This is presented as an observed correlation, not a proven causal claim — no session-level data confirms causation.

​

Over-end and wicket triggers have no logged impression event, so no tap rate exists for them — only click volume: 3.93M and 1.29M unique clickers, respectively. Given the wicket banner fires far less often per match than over-end (roughly once every several overs vs. every over), its volume relative to how rarely it appears is arguably the more telling number, even without a clean rate to quote. Click volume by placement overall: Live-Bottom 7.83M, Live-Over End 3.93M, Info 2.41M, Commentary 1.59M, Wicket 1.29M, Matches-Live (repeat-user) 646.9K, Matches-For You (repeat-user) 499.1K, Home Poster 371.6K.

External Validation

CREX's own Product & Strategy team later published a partnership white paper covering business outcomes of this integration across IPL and Asia Cup 2025, independent of anything measured above: 153,000+ total transactors and 92.7K+ new transactors for Asia Cup 2025 alone, a +160% conversion improvement between April and September 2025, and a 25K-new/27K-repeat split on the tournament's final day — evidence the feature was generating genuine repeat purchase behavior, not one-time novelty clicks. Pass mix skewed heavily toward single-match purchases (Match Pass 77%, Tour Pass 19%, Monthly Pass 4%).​

​

Source: CREX × FanCode partnership white paper, published on Medium under CREX's account - Medium.com

Reflection

Knowing what the data now shows, a few things I'd genuinely reconsider — and a few I'd stand by.

The wicket banner is the clearest one. Over-end and the static Live trigger felt like enough to start with, so wicket sat designed but deprioritized while we got confident in the placement itself. I still think that sequencing was right — shipping fewer things well, and giving other teams' effort (dev, business, measurement) room to catch up, matters more than a designer's instinct to ship everything they've already conceived at once. But with the data now showing 1.29M clicks off a trigger that only fires a handful of times per match, I'd prioritize it higher in a rebuild — specifically, showing wicket ahead of over-end if both moments land at the same time, rather than treating them as interchangeable.

 

The Live-tab placement wasn't actually a bet, and I want to be honest about that rather than dress it up as a discovery. Live already had the most attention of any tab in the app — the same reason CREX runs its own native ad inventory there, across over-end, drinks breaks, innings breaks, and DRS reviews. Putting the FanCode trigger there followed the exact logic already used for everything else competing for a user's attention. The principle was already in place: live cricket first, Commentary second, Info for anything pre-match.

​

The trial-end auto-redirect is the one place I'd actually change something, not just narrate it better. Sending a user straight to FanCode's PL page the moment their trial ends is the right call while they're actually in the stream watching it happen — that pause and redirect is an honest continuation of something real, and the directive push matters because they don't yet know what buying a pass leads to. Where I'd change it is on a later, separate tap of the same trigger within that same match: instead of resurrecting the locked player just to show it's locked, I'd surface the same purchase decision as a bottom sheet — the pattern already used everywhere else in the product. The distinction isn't "first time vs. every time after"; it's whether the user is still inside that stream session (backgrounded briefly, checked another tab, came right back) or making a fresh entry into the match from outside (Matches tab, a notification, reopening a killed app). A quick resume should show the locked player they already left; a fresh entry should get the bottom sheet, since nothing was actually just interrupted for them. It's a more precise rule than a simple visit counter, and it removes the "this feels out of my control" problem without touching the part of the mechanic that's actually driving the business goal.

 

What I don't have a tidy answer for: the pre/post-trial funnel comparison spans two very different cricket calendars, so some of that lift is genuinely tournament effect, not trial effect — and over-end and wicket still can't be measured against a real tap rate, only raw volume. I'd rather leave both of those open than force a cleaner story than the data actually supports.

bottom of page