Archana opened her WhatsApp on a Monday morning. Among her messages sat one from Meesho: a sale announcement with a single product image. A kitchen mixer. She scrolled past without clicking.
Here's what we didn't know: Archana had spent the previous week browsing ethnic wear. She had shared three kurtis with her sister, saved two salwar suits, and read reviews on a traditional lehenga. She was interested in fashion. But our system sent her a kitchen appliance recommendation because of one single interaction on the mixer product.
That Monday, Archana was one of millions of users receiving mismatched product recommendations. Some clicked. Most didn't. We were missing opportunities for engagement.
This is the story of how we fixed that problem. How we went from sending Archana a mixer to sending her the kurti she had been considering. And how that change, repeated across millions of users, delivered a 4x improvement in Click-Through Rate.
The Core Challenge

At Meesho, WhatsApp sale messages follow a simple format: one product image per message. Users either click or they don't.
This format created our challenge: Which product has the highest chance of getting each user to click?
Our CTR was stable but not optimized. We knew we could do better.
Where We Started
Our baseline system had simple logic. Users who recently added items to cart or created wishlists received messages showing those exact products. Everyone else got products from a list of popular items.
This approach worked reasonably well, but it had three operational hurdles.
- We only looked at add to carts and wishlists. Users share products with friends, take screenshots, and read reviews, but we initially ignored all of that. Without an add to cart, we treated them as uninterested.
- Recency only counted if you added to cart. A user who browsed yesterday but didn't add to cart got the same generic recommendations as someone who hadn't opened the app in months.
- Everyone got the same treatment. Power users and casual browsers both received identical logic, without adjustment for their different patterns.
Users showing interest without adding to cart received generic recommendations and clicked less. At our scale, small improvements in relevance create significant gains.
Experiment One: The Recency Mistake
We started routinely tracking more user actions: product shares, screenshots, review views, and detailed browsing.
Then we tried something simple: show users whichever product they had interacted with most recently. A screenshot from this morning counted the same as an add to cart from yesterday.
Results were mixed. Casual browsers who never added to cart responded well. CTR improved for them. But CTR dropped among our most active users.
The problem became clear when we looked at examples, a user adds a kurti to cart on Monday, on Tuesday morning they screenshot a different item while browsing. Our system sent them the item that they saved because it was more recent, even though the add to cart showed stronger purchase intent.
We learned that different actions mean different things. Adding to cart shows higher purchase intent than taking a screenshot. Timing matters, but the type of action matters more.
Experiment Two: Scoring Actions by Strength
We needed to give different weights to different actions. Think of it like evidence: some evidence is stronger than others. To do this, we designed a scoring system structured across four components:
- Frequency: A single product view might be accidental. Five views of similar items over three days shows real interest. We gave more weight to repeated actions.
- Individual comparison: A user with 10 interactions might be very engaged for them, while another 10 user's interactions might be low. We compared each user against their own typical behavior instead of using the same standard for everyone.
- Recency as a tiebreaker: When action types had similar strength, we picked the more recent one. But only after we knew what type of action it was.
- Purchase filter: We stopped recommending products users had already bought.
This approach worked better across all user types. But we still saw something odd: two users with nearly identical patterns would respond completely differently. One would click, the other wouldn't.
The Missing Piece: Shopping Preferences
We realized we were asking the wrong question. Instead of "What did this user recently do?" we should ask "What does this user actually care about?"
Look at two examples. User A browses ethnic wear every week: kurtis, salwar suits, traditional accessories. This pattern continues for months. User B only shops electronics: phones, headphones, chargers.
Our system sent User A a home appliance because they'd clicked a mixer once. It sent User B a trending fashion item because it was popular overall. Both users ignored the messages.
We were missing category preferences. People have shopping habits. A fashion shopper might click on electronics once, but they'll keep buying fashion. We needed to respect these long-term preferences.
The Final System

Our algorithm combined everything we learned:
- First - Identify which categories each user prefers based on their history. Which categories do they browse consistently? Where do they make purchases?
- Second - Within those preferred categories, rank products using our standard scoring system, basis interactions like click, ATC, Wishlist & Review Media Viewed
- Third - When multiple products have similar scores, pick the most recent one.
- Fourth - Exclude products they already bought.
The system stayed simple to understand. Every recommendation has clear reasoning. A user browses ethnic wear weekly. They wishlisted the kurti three days ago. They haven't bought it yet. It scored highest among their recent actions in their preferred categories.
This system delivered a factual 4x improvement. The gains were consistent across all user types.
High-intent shoppers clicked more because we routinely stopped replacing strong actions with weak ones. Casual browsers clicked more because we found patterns in their lighter engagement. Intermittent users clicked more because we remembered their category preferences.
Being able to explain every recommendation made debugging faster and iteration easier.
Key Lessons
- Different actions carry different weight: Cart adds show more purchase intent than screenshots. Your scoring should reflect this.
- Patterns beat single events: A user viewing similar products five times over a week shows more intent than one click this morning.
- Compare users to themselves: Instead of using the same standard for everyone, ask if this activity is unusual for this specific user.
- Long-term preferences matter: Category habits reduce noise from random clicks. A fashion shopper might click electronics once but will keep buying fashion.
- Keep it simple: If you can't explain why a recommendation was made, you can't improve it easily.
Remember Archana? The user who got a kitchen mixer when she'd been browsing ethnic wear all week?

Here's what happens now. The algorithm sees that Archana consistently browses ethnic wear. Within that category, it finds the kurti she wishlisted three days ago and shared with her sister. She hasn't bought it yet. The score combining her repeated actions, strong interest, and recency makes this kurti the clear choice.
Monday morning, Archana opens WhatsApp. This time, the message shows her that kurti. She clicks immediately.
One user, one message, one click. But across millions of users, this routine technical change from generic to personalized recommendations created a 4x improvement.
The system we built now influences existing recommendations, search ranking, and campaigns across Meesho.
One product image. One message. But now it's the right product for each user.

