Printer Paper Three Weeks Later: Recommendation Timing
A shopper orders a pack of ink cartridges on a Monday. On Tuesday, a follow-up email arrives with a Recommendation slot: "You might also need printer paper." The suggestion was reasonable. The timing was not. The shopper had just restocked, the paper drawer was full, and the email went unopened. Across the whole campaign, these next-day suggestions earned few clicks, and a handful of shoppers unsubscribed from the emails altogether.
The fancy option
The obvious fix was a sequence model: a machine-learning model that reads each shopper's ordered purchase history and predicts the next item they will buy. It would also, in theory, learn when. But it needed a training pipeline, plenty of history per shopper, and a lot of care to keep running. Worst of all, nobody could answer the simplest question a colleague would ask: "Why did this person get this email today?"
The boring observation
Before building anything, the team looked at the raw orders. For every shopper who bought ink and later bought paper, they counted the days between the two orders. Plotted as a histogram, the counts formed a clear hill. Most paper orders landed around three weeks after the ink order, with a thin tail on either side. Other pairs had their own rhythm: a coffee machine followed by descaler, a pet bed followed by a chew toy. Every pair of items had a typical gap, and that gap was stable enough to rely on.
Timing instead of predicting
The technique is a small lookup table, rebuilt every night, with one row per pair of items (categories may also be used for solving the cold start problem). Each row holds the median gap, meaning the middle value when all the gaps are sorted, and the number of shoppers behind it. The median is used because a few shoppers who reorder months later would drag an average away from where most people actually are.
The day a suggestion goes out is computed like this:
$$\text{send_day}(A \to B) = \text{purchase_day}(A) + \text{median_gap}(A \to B) - \text{lead}$$
Here the lead is a short head start, so the suggestion arrives while the shopper is still thinking about running low, not after they have already bought elsewhere.
Three simple rules keep it honest:
- Pairs backed by too few shoppers are ignored, so the table never trusts a coincidence.
- If the shopper has already bought item B since buying A, the suggestion is dropped.
- Pairs whose gaps are scattered all over the place are left out too, because there is no typical moment to aim for. Anyone can read a row and understand why an email went out on a given day, which the sequence model could never offer.
The result
The paper suggestion now arrived about when the pile in the drawer was getting thin. It read less like an advertisement and more like a reminder from a shop that pays attention. Click-through on these suggestions rose clearly compared with the next-day version, and unsubscribes after them dropped. The change was checked against real reorder data, reviewed with the team before launch, and monitored after rollout.
Comments
Join the discussionNo comments yet. Be the first to comment.