LCBO — multi-promo-code checkout for a high-volume mobile catalog.
Lead UI/UX on a focused six-week project: design a promo-code feature for LCBO's iOS app that handles multiple stackable codes and rebates without breaking guest checkout or Apple Pay.
Snapshot
What I shipped
Problem
LCBO needed users to apply multiple promo codes prior to checkout. Stacked codes can conflict. Guest checkout doesn't have an address until late. Apple Pay restricts how much detail can precede payment.
What I did
Mapped every conflict path (rebates needing shipping data, mutually-exclusive promos, guest vs. auth divergence) as UX flows. Designed a code-stacking UI that surfaces conflicts inline. Extended LCBO's design system for new states.
Tradeoff
Apple Pay's pre-payment data restrictions forced front-loading the checkout form. The design narrows that pain with clear progress signaling, but it remains a known UX tax for rebates that require shipping info.
The hard problems.
Authenticated vs. guest paths diverge.
An authenticated user has a profile, payment history, and address on file — perfect for applying rebates that need shipping data. A guest doesn't. The challenge wasn't picking one path; it was designing both without making the guest path feel punitive while still gating the rebate logic until the data exists.
Stacked-code conflict surfacing.
Two valid codes can be individually applicable but mutually exclusive — or the second can supersede the first. Surfacing this in real-time, without modal-jacking the user, meant designing an inline conflict state on the code-stack itself. Codes show as applied, suppressed, or pending, with a clear reason chip.