Ofir Kedmi's original personalization engine concept—the five-tier data model, six-step pipeline, and four design decisions that shaped Sprint 2's implementation.

Data Map
Pipeline
Design Decisions
Walkthrough
EDGE · PERSONALIZATION ENGINE

How Edge decides what to recommend.

A tiered data model and a matching engine that turns user profile + query into the best flight and hotel recommendations — and knows when to ask for more.

The Model

Five tiers of data, ranked by impact.

Not all preferences matter equally. The engine sorts every data point by how much it changes the answer — from "can't book without it" to "cosmetic." This is what lets Edge ask the right questions and skip the wrong ones.

Tier 0
Required
Can't return any result without these. Always asked if missing.
Tier 1
High signal
Radically reshape what's shown. Asked if missing and we have a question slot.
Tier 2
Strong
Re-rank within results. Surfaced as refinement filters after first results.
Tier 3
Tie-breakers
Filter the long tail. Available as filters but not pushed.
Tier 4
Trivia
Cosmetic. Captured silently in profile, never blocks a search.
The Data Map

Every parameter that goes into a recommendation.

Mapped by tier for both hotels and flights. The chips below each tier are the actual data points the engine reads from the user profile, the query, or asks for as a follow-up.

TIER 0 · REQUIRED
Without these, no search.
If a Tier 0 value is missing from both profile and query, the engine must ask. These are not negotiable.
Destination city or area
Check-in date
Check-out date
Number of guests
Number of rooms
TIER 1 · HIGH SIGNAL
Radically reshapes results.
If missing, the engine fills its remaining question slots with these — ranked by impact. Most live in the profile after onboarding.
Budget cap per night
Loyalty programs & status
Trip purpose
Location anchor (meeting, office, venue)
Chain vs boutique preference
Star rating floor
TIER 2 · STRONG
Re-ranks within results.
Not worth asking up front. Surfaced as refinement chips after first results: "Closer to centro," "Higher rated," "Flexible cancellation."
Neighborhood preference
Walking distance to anchor
Bed type (king, twin)
Room category (standard, suite)
Breakfast included
Cancellation policy
Lounge / executive floor access
Quiet vs central
TIER 3 · TIE-BREAKERS
Filter the long tail.
Available as filters but not surfaced unless the user asks. Captured passively as preferences when mentioned.
Gym / fitness center
Pool
Spa
Pet-friendly
Restaurant on-site
Parking
Airport shuttle
Business center
Wifi quality
TIER 4 · TRIVIA
Captured, never blocking.
Stored silently in the profile and used to break ties at the bottom of ranking. Never delays a search by asking.
View preference (city, water)
High floor request
Pillow type
Specific bathroom amenities
White vs colored linens
Robes & slippers
TIER 0 · REQUIRED
Without these, no search.
If any of these are missing from profile + query, the engine must ask before it can show anything.
Origin
Destination
Departure date
Return date (if round trip)
One-way or round-trip
Number of passengers
TIER 1 · HIGH SIGNAL
Radically reshapes results.
The most ranking-relevant inputs. Pulled from profile when possible; asked when not, up to the question budget.
Cabin class
Direct vs allow stops
Budget / max price
Loyalty programs & status
Time of day preference
Red-eye tolerance
Trip purpose / deadline
TIER 2 · STRONG
Re-ranks within results.
Surfaced as refinement chips after first results: "Earlier arrival," "Refundable only," "United only."
Specific airline preference
Alliance preference
Seat type (window, aisle, extra legroom)
Max layover duration
Refundability / flexibility
Specific airport (JFK vs LGA)
Carry-on vs checked bag
TIER 3 · TIE-BREAKERS
Filter the long tail.
Used to break ties when several flights are otherwise equivalent. Captured passively from chat mentions.
Onboard wifi
Power outlets
Meal preferences
Lounge access at departure
Aircraft type
Boarding group
TIER 4 · TRIVIA
Captured, never blocking.
Stored in the profile for the rare tie-break or for future "remembered" choices, but never asked about.
Specific row preference
Forward vs rear cabin
Engine side
Specific seat numbers
The Engine

What happens between query and result.

Every user query runs through this six-step pipeline. The total question budget is capped at 2–3 — every step is designed to use it sparingly.

Six steps from query to recommendation

1
Parse query
Extract every data point the user just said. Map each to its tier.
2
Pull profile
Load known preferences, loyalty, patterns, dealbreakers.
3
Merge & check gaps
Combine the two. Identify which Tier 0 and Tier 1 values are still missing.
4
Ask (up to 3)
Tier 0 gaps first. Fill remaining slots with highest-impact Tier 1 gaps. Never more than 3.
5
Rank & return
Score inventory against Tier 0–2 data. Return top 5–10 with reasoning.
6
Refine inline
Surface Tier 2/3 as one-tap refinement chips. Each tap re-ranks live.
3

Hard cap on questions

Never ask more than 2–3 questions before showing results. Every additional question is a tax on trust.

T0

Required before high-signal

Tier 0 gaps always come before Tier 1. Don't ask about cabin class if you don't know the destination.

Refine, don't re-ask

Tier 2 and 3 surface as chips after results, not as questions before. Showing results first builds momentum.

Walkthrough

Same query, two users.

How the engine behaves differently when the profile is rich vs thin. Same user query, very different number of follow-up questions.

User says: "I need a hotel in Lisbon next week for 3 nights."

Scenario A — Rich profile (Gmail connected)

Edge already knows a lot about this user from onboarding + Gmail scan.
"I need a hotel in Lisbon next week for 3 nights."
Combined Knowledge
Destination: Lisbon
Duration: 3 nights (dates need confirming)
Loyalty: Hilton Gold, Marriott Gold
Hotel type: chain preference
Trip purpose: client meetings (from profile)
Budget: business policy cap
Specific check-in date
Location anchor (where in Lisbon)
Edge asks (2 of 3 budget) Got it. Quick two:
• Check-in Monday June 16, or a different day?
• Anywhere specific — near a meeting, or general area?
"Monday is right. Near Avenida da Liberdade."
Engine All Tier 0 + Tier 1 resolved. Ranking 47 properties.
Top result: Tivoli Avenida Liberdade · Hilton Gold rate · 0.4mi from anchor.
Refinement chips ready: closer · higher rated · with gym · executive floor.

Scenario B — Thin profile (no Gmail)

Edge has only what was given in onboarding chat. Same query, more gaps.
"I need a hotel in Lisbon next week for 3 nights."
Combined Knowledge
Destination: Lisbon
Duration: 3 nights
Trip purpose: client meetings (from profile)
· Loyalty: unknown
· Hotel type preference: unknown
Specific check-in date
Location anchor
Budget cap
Edge asks (3 of 3 budget) A few quick things:
• Check-in date?
• Anywhere specific in Lisbon — near a meeting, or general area?
• Rough budget per night?
"Monday. Avenida da Liberdade. Around €250."
Engine Tier 0 + most of Tier 1 resolved. Loyalty unknown — defaulting to best total value.
Returns 5 properties. Quietly captures €250/night as profile pref for future trips.
Refinement chips also include: chain hotel · use loyalty (connect Gmail).
After Results

Refinement chips, not more questions.

Once results are on screen, additional preferences become one-tap filters. Each chip is generated from Tier 2/3 data points that weren't resolved up front. Tapping a chip re-ranks instantly.

Example refinement row — after Lisbon hotel results

Generated dynamically from the Tier 2/3 data points that are still unresolved. The user taps any; the engine re-ranks without a chat turn.

+ Closer to Avenida
+ 5-star only
+ With gym
+ Breakfast included
+ Free cancellation
+ Executive floor
+ King bed
+ Quiet room
Design Decisions

Four open questions, answered.

Once the tier model and engine flow are agreed, these four questions decide how the system actually behaves at the edges. Each has a recommended approach — the rest of the product is built on top of these choices.

DECISION 01
How does the engine score a property against the merged knowledge?
Once Tier 0 filters are applied, every remaining property needs a ranking score. The formula determines what shows up at the top, and how Edge explains its choices.
Recommendation
Hybrid: hard filter at Tier 0, weighted additive score for Tier 1–3, with a loyalty stack bonus.

Tier 0 acts as a binary gate — no match, no result. Tier 1–3 contribute to an additive score, weighted by tier. Loyalty status with the property's brand adds a separate stack bonus because using existing rewards is the highest-value match.

  • Tier 1 match: +10 · Tier 1 conflict: −5
  • Tier 2 match: +3
  • Tier 3 match: +1
  • Loyalty stack: +15 if user has status with the brand
  • Normalize to 0–100% match score · always show "why" reasoning with each result
Example score breakdown
Tivoli Avenida Liberdade87% match
Avenida da Liberdade (anchor)+10
Hilton brand (loyalty stack)+25
5-star · matches floor+3
Breakfast included+3
Pool · no preference set 0
DECISION 02
When a Tier 1 value is unknown, what does the engine assume?
The user has 2–3 questions of patience. The engine can't ask about every gap. For unasked unknowns, it needs explicit defaults — conservative ones that minimize the cost of being wrong.
Recommendation
Per-parameter conservative defaults that bias toward "best total value," not toward a brand or chain.

Defaults are bias-free by design. If the engine guesses wrong, the cost should be a less-personalized result — never a recommendation that violates an implicit preference.

UnknownDefault behavior
BudgetCompany travel policy cap; mid-tier if no policy
LoyaltyBest total value · no brand bias · surface "connect Gmail" chip
Trip purposeBusiness (Edge default for the whole product)
Location anchorCity center / business district
Hotel typeMixed — no chain or boutique bias
Cabin classEconomy short-haul (<4hr) · policy-based long-haul
Direct preferenceShow both, rank by total travel time
Time of dayMid-day (lowest variance, fewest dealbreaker conflicts)
DECISION 03
When the query contradicts the profile, who wins?
User says "cheapest hotel," but their profile says "always Hilton Gold." Edge has to choose what to surface — and how transparent to be about the conflict.
Recommendation
Query always wins for this trip. Profile is disclosed, not overridden. Don't update profile from one-off queries.

The user is here, talking, in this moment. Their query is the strongest signal. But Edge surfaces what's being ignored — quietly, with a one-tap recovery.

  • Explicit query overrides profile preference, but only for this trip
  • Profile is updated only on repeat behavior or explicit confirmation, never from one-off queries
  • Edge shows a small note disclosing the conflict, plus a chip to reverse
  • Dealbreakers still apply unless explicitly waived (see Decision 04)
User"Cheapest hotel in Lisbon."
EdgeRanks by price. Returns top 5.
NoteGoing by price. Your Hilton Gold benefits aren't being used here.
ChipUse my Hilton status anyway →
DECISION 04
Are dealbreakers hard filters or soft penalties?
User said "no red-eyes." Should the engine filter red-eye flights out entirely, or show them but rank them last? The answer determines whether a single bad result destroys trust.
Recommendation
Hard filter by default. When the filter empties results, ask before showing — never silently include filtered options.

A user who said "no red-eyes" and sees a red-eye in their results loses trust instantly. Dealbreakers are absolute by definition. But edge cases need a path that respects the user's autonomy.

Three rules
1. Hard filter

Dealbreaker matches are excluded from results entirely. Never shown, never ranked low.

2. Empty-set escape

If filtering would return zero results, Edge stops and asks: "No non-red-eye options for that day. Want me to show red-eyes anyway, or look at different dates?"

3. Explicit override only

The only way a dealbreaker is crossed is by the user choosing to cross it — never by Edge deciding to ignore it.

Why these four

These decisions are load-bearing for the entire experience.

Scoring determines what users see first. Defaults determine what they see when Edge doesn't know much. Conflict handling determines whether Edge feels like an EA or a paternalistic system. Dealbreakers determine whether trust survives the first bad result. Get these four right and the product feels coherent. Get any one wrong and users will notice.

Key ideas

Three things this design is built around.

2–3

The question budget

Every follow-up costs trust. The engine treats questions as scarce, not free. If the profile is rich, the user gets results in zero questions. If thin, three is the maximum before something is shown.

Tiered

Not all data is equal

A budget cap moves results more than a gym preference. The engine ranks every parameter by impact and asks in order. The bottom three tiers fill in over time without anyone noticing.

Refine

Filters > questions

After results show, additional preferences become one-tap chips. The user filters by tapping, not by answering. Every tap also teaches the profile for next time.

Quiet

Learn by use

Tier 4 and most of Tier 3 are captured silently when the user mentions them, taps refinement chips, or makes a booking. The profile gets richer every session without surveys.