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.