Search understands you. It just doesn't rank you right.
"We want to build a search experience that allows users to discover new offers and merchants with ease, making the most common experience in our app pleasant and fast."The brief
Search is the most common thing people do in the app, so it's the highest-leverage place to fix. Here's what's broken today, why, and what I changed, with the real working prototype embedded below.
1. What's broken
I ran four searches in the real app: "pizza near me," "pi," "amusement park" and "hotel in marina." That's not a guess. Every problem below is visible on screen, and none depends on where I happened to be standing.
Type "pi," get PIMS, Pickl, a burger spot
Not pizza. It's matching letters, not what you meant.
A spa and a wellness retreat outrank actual pizza
Two right results, then a spa and a restaurant that isn't pizza, ranked right alongside them. Nothing here got cut for not matching.
"Amusement park" suggests business parks and a donut shop
Dubai Investment Park and Dubai Knowledge Park lead the chips. It matched the word "park" and dropped "amusement."
102 results. One attraction, then donuts, groceries and coffee
Krispy Kreme, a grocery and Tim Hortons rank above and between real attractions. A restaurant with "Park" in its name makes the list.
"Hotel in marina" returns restaurants and salons
Every visible result sits at an address containing "Hotel" or "Marina," such as a salon in Jannah Marina Hotel Apartments. The search matched address text, not what the merchant is.
Half search tools, half browsing
Recents, locations and trending terms help you start a search. "What's Around You" is a row of venue tiles, including placeholder entries like "TEST Outlet…".
If I search "pizza near me," why am I getting a spa?That question is what started this project.
The pattern repeats across categories. The words get parsed, but the ranking doesn't use what they mean. "Pizza" matches a spa, "amusement park" matches a donut shop, and "hotel" matches a restaurant in a hotel.
(I tested this from India, so I'm leaving distance out of it. Every result reads about 2,700 km away, which isn't a fair test of "near me." None of the problems above depend on that: a donut shop outranking an amusement park isn't about proximity.)
2. What search is for
Most ENTERTAINER offers work like this: show a PIN at the table, done. No booking, no checkout. So search isn't selling anything. It just needs to get someone from "I want sushi nearby" to a place they trust, without wrong turns.
The brief limits this to search: "not personalization or organic discovery. It's for when users are usually looking for something specific." So everything here starts from a typed word or a tapped search term. Nothing is a feed, a recommendation or a browse surface.
Not just what the words happen to contain.
A result you can't reach isn't really a result.
Search should tell members what they can do next: redeem, call ahead, or check availability where that's supported.
3. Before / after
The same real searches from the real app, run through the redesign. The differences are about matching and about what the start screen offers, not location. Nothing here depends on where I was sitting when I tested it.
A prefix match isn't the same as a meant match
Why "before" is wrong: every one of PIMS, Pickl, Pizza Pie Factory and Pizzolo starts with "pi," so the real app treats that as equally good evidence for all five. The actual pizza match has no edge over a drink called PIMS.
Why "after" is better: "pi" resolves to the Pizza category first, because it's a prefix of the word, not just a substring that happens to appear somewhere. A venue that merely starts with the same two letters doesn't get a seat next to it.
A non-match ranked beside a real match isn't ranking
Why "before" is wrong: Niyama Spa and Sfumato aren't pizza, Italian, or even the same category of venue. They're in the list for "pizza" because nothing cut them, not because anything connected them to pizza.
Why "after" is better: "near me" is parsed and used to rank by proximity instead of being silently discarded, and anything that isn't actually a pizza match gets dropped from the list entirely. Not ranked lower. Removed. What's left is ranked by rating and proximity, signals that only matter once relevance is already settled.
Words need to mean something together
Why "before" is wrong: "Amusement park" is read as two loose words. "Park" matches business parks in autocomplete and a restaurant called Culinary Park in the results, and "amusement" is ignored. Krispy Kreme and Tim Hortons make the list with no visible link to either word.
Why "after" is better: "Amusement park" resolves to one attraction type, with a count, in autocomplete. The results hold only places tagged that way. With "near me," the one nearby match leads and the farther one sits in a collapsed "Further away" group instead of vanishing.
A category word is a requirement, not a hint
Why "before" is wrong: "Hotel in marina" returns restaurants and salons. Each one sits at an address that contains "Hotel" or "Marina," so the text matched, but none of them is a hotel. The search treats "hotel" as a string to find, not a category to honour.
Why "after" is better: "Hotel" sets the category and "marina" sets the place, before any matching runs. Only hotels in the Marina area remain, and the Dining and Attractions tabs show zero. Not ranked lower. Removed.
A zero state should start searches, not host browsing
Why "before" is wrong: "What's Around You" is a row of venue tiles. That's a browse surface, not a search tool, and the brief rules it out. It also leaks test data ("TEST Outlet…", "Practice Usi…") into the first screen people see.
Why "after" is better: Three small things, and every one fills the search box. Recents stay, capped at three, because repeat lookups are the one history worth keeping. Category chips put Dining, Hotels and Attractions one tap away. Three example searches show the kind of sentence the search now understands. The venue tiles, location row and trending row are gone: typing a place already suggests it, and a short screen is faster to scan.
4. What it looks like
Five screens, not a walkthrough. Every one of these is live in the prototype linked below, not a static mock.
Search starts by teaching the search
Three recents, three categories and three example searches. Every tap fills the search box, so the first screen helps you say what you want, not wander.
One card, everything on it
A swipeable photo gallery, the offer, the save amount and the rating, all above the fold. No shared outer card, just the photo and the facts.
One merchant, every branch
Branches fold under the merchant instead of repeating it. Tapping "more outlets" opens all of them in a sheet; picking one updates the card without reshuffling the list under you.
Full offer detail, one tap away
Every offer, every location, how much it saves and how to redeem it.
Same results, on the map
Every price pinned to where it actually is, with the same cards scrollable underneath.
5. How ranking works
No AI model here. Just rules I can point to and explain.
Pull out the cuisine, the place, "near you," from the words instead of quietly dropping them, then rank on what they mean.
How: the query is parsed into those parts before any matching runs, not after. A result is scored against what "pizza near me" means, not against the literal five characters.
Once something really matches, anything that only sort of matches gets cut. Not buried lower. Cut.
How: every result gets a relevance score. Anything under the cutoff is removed from the list outright, not ranked to the bottom. A spa never gets to row three.
Closer never beats more relevant. Distance only breaks a tie between two good matches.
How: distance only enters the sort after the relevance cutoff has already run. It breaks ties among survivors; it never decides who survives.
Three branches of the same place aren't three rows. The nearest one shows, the rest fold underneath.
How: outlets are grouped by merchant before ranking, not after. The nearest in-scope outlet represents the card; the rest collapse into "N more outlets."
"Hotel" means hotels. A restaurant that happens to sit inside one doesn't qualify.
How: when the query names a category, results from other categories are removed before ranking, so the other tabs read zero instead of padding the list.
6. The hard cases
These all came up while building this. The call I made on each, and whether it's actually running in the prototype.
Defaults to your city. Only asks for location when you type "near me."
Same fallback, same explainer banner. It just isn't wired to a real GPS in a prototype.
Shows 3, then "See all on map." Search "coffee" in the prototype. Common Grounds has nine.
"Pizza Hut" is a brand. "Pizza" is a cuisine. The search shows both. Try "pi" in the prototype.
Typos, yes. Try "hurricans gril" in the prototype. Arabic spelling needs a native speaker to get right, not a guess from me.
Still shows, just ranked lower, with a renewal date instead of a live offer.
Never a blank screen. It says what's missing, then widens the search.
Rare enough to flag, not redesign around. That one branch just says so.
The address says "Hotel," the merchant isn't one. Category comes from the merchant, never from address text. Try "hotel in marina" in the prototype.
7. Measuring it
There's no real data behind a take-home project. Here's what I'd watch once this actually shipped, and the targets I'd set going in. Every target is an assumption.
Target: +10% relative (assumption).
How: a PIN redemption within 24 hours of a search counts toward that search. It's slow to move, so the next two metrics tell us sooner.
Top-3 result tapped. Target: ≥60% (assumption).
How: a tap followed by backing out within 10 seconds counts as a miss, not a success.
Target: −20% (assumption).
How: only a reformulation of the same intent counts. Narrowing "hotel" to "hotel in marina" is healthy and doesn't.
Target: <3% (assumption). Time-to-first-tap must not regress.
Why: weak matches are dropped instead of buried, so empty results could rise, and fewer results must never make people slower.
Opening "more outlets," then picking a different merchant entirely. It tests whether folding branches under one card works.
Every metric is split by query type (near-me, named place, category), because the redesign handles each differently.
8. The working prototype
Not a link out. This is the actual prototype, running right here, same as every screenshot above. Search "pizza near me," "hotel in marina" or "amusement park near me," or click a Try button on the left and watch it resolve.