Post-Purchase Offers

I led the design of PayByPhone’s first third-party ad product, the human layer on a machine-learning offer engine built with Rokt. The challenge was monetizing the post-purchase moment without disrupting the fast parking flow. By keeping offers embedded and validating the action layout in live traffic, we protected the task while improving revenue impact.

Role

· Product Design Lead

Team

· 1 PM, 3 Devs, 1 Financial Analyst

Duration

· 6 months

Year

· 2024

49%

higher revenue from the winning placement

$1M+

annual revenue

0→1

PayByPhone's first third-party ad product, built from scratch

Challenge

An algorithm picks the offer. Design makes it welcome.

PayByPhone wanted to unlock a new revenue stream from the most engaged moment in the app: right after someone finishes paying for parking.

The opportunity was to surface partner offers, chosen in real time by a third-party ML engine, at a high-intent moment. The difficulty was doing it without eroding trust in the app's primary job. Anything that felt like an ad blocking the parking task would undermine the utility people rely on, so the feature had to stay optional, well timed, and easy to ignore.

How might we

…design a seamless, optional way to present offers without disrupting the parking experience for users?

Constraints

Designing within three fixed constraints

None of these were mine to change. Good constraint design isn't about fighting the limits; it's about making the experience feel intentional inside them.

Constraint 01

Built on Rokt's components

Rokt implemented the offer surface with only their existing component library for v1. I designed the strongest experience from those building blocks, adapted to the PayByPhone design system with targeted UI tweaks.

Constraint 02

A trackable decline

Rokt uses a user's "No thanks" as a training signal for the engine, so the decline stayed fixed. I couldn't change it, so I designed around it, using context to keep it honest.

Constraint 03

Forward-only offers

The engine can't return to a seen offer, so the experience had to reflect that honestly: a forward-only set, no swiping back.

Explorations

One decision, validated before launch

I tested one decision before launch: should the offer interrupt the flow or stay embedded in it?

PLACEMENT TEST

Overlay

Not chosen

Interrupted the task.

Embedded

Chosen

Participants preferred the embedded offer because parking felt complete before the offer appeared.

How I tested it

120 participants tested the overlay as the control. I measured time on task, task success, single-ease rating, and system usability.

The overlay added friction. Both designs still cleared the usability bar.

Decision: ship the embedded layout

Success metrics, set before launch

So a live launch could be judged honestly. Exact targets are withheld under NDA.

App Store reviews

Comparable to similar features in the app.

Support requests

Request-to-transaction ratio on par with parking.

RPM

Revenue per 1,000 impressions, at or above target.

Positive engagement rate

At or above target.

A/B test

The final V1 layout came from live behavior

Before shipping V1, I tested stacked and side-by-side actions in live traffic to learn which layout led to stronger conversion.

The question

Would a stacked layout make the offer easier to act on than side-by-side buttons?

The approach

I ran one focused A/B test with live traffic, then used the winning layout as the final V1 design.

LIVE A/B TEST: ACTION LAYOUT

Stacked vs side-by-side

Hypothesis: Giving each action its own row would make the offer faster to scan and easier to choose.

Winner: Stacked actions

Variant: Side-by-side

49%

higher revenue impact from the stacked layout

v1 · what shipped

An embedded offer that respects the flow

What shipped: an embedded post-purchase offer built from Rokt’s existing components and tuned to the PayByPhone flow. The walkthrough below shows the moment it appears after payment, without blocking the task.

Relevance & AI

Designing for an ML offer engine

I shaped the human layer around the offer engine. “No thanks” suppresses poor-fit offers, keeping future recommendations relevant and optional.

Adapts to your engagement

Engagement teaches the engine what to show. If ignored, the format escalates once, then goes quiet.

Surfaces what you like

Past engagement steers the slot toward relevant offers, not random inventory.

Stays on-brand

Category guardrails keep partner offers aligned with the app’s trust.

34%

Restraint beat exposure

Dismissals and frequency caps feed suppression. One offer a day raised revenue per impression.

Results and celebrations

Monetization that earned its place in the flow

The embedded placement, stacked CTA, and progress tracker delivered verifiable success across business and user metrics, proving that high-impact monetization can layer into a core utility flow.

$1M+

in actual annual revenue, within the first year

49%

revenue lift from the winning placement

Met

reached the Rokt engagement benchmark in North America

When monthly offer revenue crossed C$100K for the first time, the whole team got together to celebrate. A few moments from that day:

v2 · AI concepts

Three directions for a smarter offer

What I'd push for next

Three concepts for more relevant, restrained offers.

A · Smarter "No thanks"

Decline reasons that teach the model what to suppress.

B · Suppressed state

When nothing clears the quality bar, the slot stays quiet.

C · Cold start

A "what are you into?" picker to bootstrap a new user.

V3 · future concept

A future concept, shaped by release feedback

Proposed for a future release. V3 keeps the embedded pattern that worked in V1, while making relevance, choice, and next steps clearer.

AFTER RELEASE

People assumed “No thanks” would close the offer, not reveal another one. They also skimmed the description, so the value, why it was relevant, and what came next needed to be clear at a glance.

V1 · shipped baseline

V3 · future concept

Offer context is immediate

The Venmo label and “Offer 1 of 3” marker make the source and sequence clear before someone acts.

The benefit leads

“Get $10 from Venmo” gives the reward a clear, scannable headline instead of burying it in a longer message.

The choice feels deliberate

A single primary action is paired with “No thanks, see next offer,” so people can accept or keep moving without friction.

Progress stays visible

The offer counter and next-offer language set an expectation that this is a curated sequence, not a dead end.

The partner earns its place

Venmo branding, the benefit, and the explanatory copy work together so the promotion reads as a relevant parking perk.

The task remains in control

The offer stays visually contained within the activity feed, preserving the Park experience rather than interrupting it.

Reflection

What I carry forward

Monetization can live inside a core utility flow when it stays optional, lands at a high-intent moment, and is validated with both lab and live data. Designing for a machine-learning system meant designing its guardrails and feedback loop, the human judgment around the algorithm, not just the surface it shows. And strong work inside a third-party's constraints is still design leadership: I shipped a validated MVP within Rokt's components, learned from live data, and evolved the design deliberately. Comfort in testing never guaranteed conversion; only live data told the full story.

Let’s make something incredible together

Reach out to connect, share ideas, or explore exciting opportunities. I’d love to hear from you.

Chandni © all rights reserved

Let’s make something incredible together

Reach out to connect, share ideas, or explore exciting opportunities. I’d love to hear from you.

Chandni © all rights reserved