Revenue, stated correctly.
$ 84.6K in attributed revenue
in 23 days, on 25% of the eligible base.
The original ask was a better substitution screen. I found that the picking stage was missing from the order journey entirely. The real need was transparency and prevention.
Live in production on August 31, 2026. This case covers the first 30 days.
Background
About 70% of online grocery orders had at least one item out of stock during picking. Store staff solved this by contacting customers through their personal messaging apps: no audit trail, no measurement, and customers often mistook the messages for fraud.
Reframing the problem
Industry research on retail loss showed that aggressive substitution increases churn. [CONFIRM: cite the research source] The order status flow had no picking stage: an order jumped from “approved” to “on its way,” making the moment where stock-outs happen invisible to the product.
Mapping the service
I built a service blueprint covering customers, store pickers, operations, back-end and payments, with the future state clearly marked as a hypothesis.
Cataloguing the edge cases
I mapped 22 scenarios, including multiple missing items, no eligible substitute and no response from the customer, and wrote them as user stories with acceptance criteria.

A single CTA slot, not two buttons
The footer holds one slot that changes state. With nothing selected it reads "Not this time". The moment an item is added it becomes "Continue".
The customer is never offered "buy" and "leave" side by side. Both states move toward checkout — one with extra items, one without. An upsell placed in a purchase flow earns its place by not competing with the purchase.
One decision, made upfront
At checkout, the customer chooses one of two rules: the store picks a similar item, or the customer chooses. It’s mandatory, because a silent default is what created the messaging-app workaround.
Refund at the moment it matters
Refunding isn’t asked upfront. It’s an action on each missing item, when the customer can see what’s actually missing.
Rules enforced by the system
The 150% cap is applied by the substitution engine before anything reaches the picker or the customer, so no one ever sees an invalid option.
A clear deadline
The decision screen shows a countdown to the cutoff, and the preference is locked once picking starts.
Feedback that trains the engine
After delivery, the customer rates each substitute. Accept or reject on a named item is a clean signal back to the similarity engine.
First 23 days, on 25% of the eligible base
2,827 orders containing an item added from the shelf
R$ 84.574 in attributed revenue (≈ US$ 16.7K)
5,845 cart additions — 2.07 items per order

