How we turn OLX classifieds behaviour into a shared language that powers buyer feeds, seller leads, similar ads, and two-sided matchmaking.
Same embedding space powering buyer and seller matchmaking.

Left: listings for a buyer. Right: buyers for a listing. Same vector space, both directions.
Introduction
OLX is a classifieds marketplace where sellers post one-off ads, and buyers discover them through search, browse, or recommendations.
Two-sided discovery
Buyers need relevant listings.
Sellers need relevant buyers.
Today, these are mostly solved separately, creating duplicate infrastructure and inconsistent matches. A good buyer↔listing match should work both ways.
Core Idea: One Shared Embedding Space
Think of an embedding as a GPS coordinate for meaning.
Every listing and every user becomes a point in the same map. Close points mean “these belong together.” Far points mean “not related.”
Because buyers and listings live in the same space, one vector index can answer all of these:
| Question | Use Case |
|---|---|
| Which listings match this user? | Personalised feed/buyer leads |
| Which users match this listing? | Seller matchmaking |
| Which listings are similar to this one? | Similar ads/discovery |
| What should appear in this user’s feed? | For You / recommendations |
Use cases we unlock
Personalised feed (“For You”)
Imagine looking for a place to rent and seeing nearby homes that fit you—not the most viewed flats, but the ones you’re most likely to enquire about — the feed that can follow your real intent.

Buyer → listing matchmaking
Imagine shopping for a car after chatting and calling sellers. Instead of popular ads, you get high-match owner listings you can view and call next.

Seller → buyer matchmaking
Imagine listing a TV cabinet and instantly seeing high-match buyers already close to that ad—so you reach the right people, not whoever wanders in.

Traction
For You: Drives 2× higher buyer engagement, resulting in thousands of incremental conversations each day.
Matchmaking: Converts engagement into revenue, with ~200 paid packages sold daily.
Creating Listing Embeddings
Each listing becomes a vector through four steps:
Start from the listing
Use listing signals such as vehicle attributes, price, location, and seller details.

Convert attributes into semantic text
The enriched text captures:
- Item → make, model, category
- Constraints → price, year, fuel, location
- Context → title and description
Encode with an embedding model
Use an embedding model to convert the listing text into a higher-dimensional vector.
Store for retrieval
Store vectors in a vector database. Nearest-neighbour search then supports similar listings, personalised feeds, and two-sided matching.
User Embeddings: Turning Behaviour into a Vector
A user embedding updates after every interaction. It uses action strength, recency, and profile confidence.
Build a session embedding
Group interactions in a T-window into a session (current intent).
Session Embedding = weighted average of listing embeddings
Session Strength (S) = sum of interaction weights
Stronger actions (chats, offers, calls) pull the session harder than views.
Weight actions by intent and recency
| Interaction | Intent Weight |
|---|---|
| View Listing | X |
| First Chat | 3X |
| Make Offer | 5X |
| Call Seller | 10X |
Recent interactions count more (time decay):
Interaction Weight = Intent Weight × exp(−λ × t)
λ = ln(2) / 90
where t is time since the interaction. Session strength:
S = Σ Interaction Weight
A simple example
Suppose a user interacts with three car listings in a session (recency ignored for clarity):
| Listing | Embedding | Action | Weight |
|---|---|---|---|
| Maruti Brezza | (0.9, 0.1) | View | X |
| Hyundai Creta | (0.8, 0.2) | View | X |
| Honda City | (0.2, 0.9) | First Chat | 3X |
Session Embedding Calculation
Session Embedding = Σ (Interaction Weight × Listing Embedding) / Σ Interaction Weights
= [X × (0.9,0.1) + X × (0.8,0.2) + 3X × (0.2,0.9)] / 17
= (4.7,13.8) / 17
≈ (0.28,0.81)
Session Strength Calculation
S = 1 + 1 + 15 = 17
The single First Chat pulls the session toward Honda City even though the user viewed two SUVs
Key takeaway: strong intent can outweigh several weak signals.
Blend short-term and long-term preferences
A session is “what they want now.” The profile is “what we have learned.”
We use a confidence-aware adaptive blend so casual browsing does not overwrite history, but strong new intent can still move the profile.
Profile Strength (P) — accumulated evidence mass (decayed sum of past session strengths). It grows with strong sessions and shrinks with inactivity:
P_decay = P × exp(−λ × d)
P_new = P_decay + S
λ = ln(2) / 90
where d is days since the last profile update, and S is new session strength.
Example:
- Day 0: P = 0, S = 17 → P = 17
- Day 10: 17 × 0.926 ≈ 15.7; add S = 2 → P ≈ 17.7
- Day 100: 17.7 × 0.5 = 8.85; add S = 20 → P ≈ 28.85
Intuition: frequent strong sessions make the profile stable; long inactivity lowers confidence so the profile can adapt faster later.
Adaptive blend:
α = max(α_min, S / (S + P))
New User Embedding = (1 − α) × Previous User Embedding + α × Session Embedding
| Situation | Profile behaviour |
|---|---|
| New user | Follows current activity |
| Casual browsing | Changes very little |
| Strong intent | Adapts noticeably |
| Strong history | Stays stable |
| Long inactivity | Confidence fades; adapts faster |
Starting point: α_min ≈ 0.05 and a 90-day confidence half-life. Normalise the updated embedding before storage.
How it works
- Understand listings — Convert every listing into a multilingual embedding using its text and attributes.
- Understand buyers — Build a dynamic embedding from user actions, giving more weight to strong and recent intent.
- Retrieve nearest matches — Use the buyer (or listing) embedding to perform a nearest neighbour search in the vector database and retrieve the most similar listings (or buyers).
- Serve recommendations — Apply business filters and ranking to deliver personalised recommendations, buyer leads, similar ads, or seller matchmaking.
Same representation, several products:
- Discovery for buyers
- Leads for sellers, and a path from engagement to paid matchmaking.
Conclusion
AI matchmaking creates one shared view of buyers and listings, updated from real-time behaviour. The same system powers feeds, similar ads, buyer leads, and seller matchmaking.
When buyers and listings are close in this space, both sides get better, more consistent matches.
Acknowledgements
- Backend: Jasvinder Singh, Yash Solanki, Parvez Hassan, Vinod Kumar
- Frontend: Virat Kumar, Samkit Jain, Anuj Garg, Ayush Garg, Prakhar Agarwal, Naina Prashar
- QA: Shreya Shukla, Sarthak Narang
- Data Science: Abhinav Bansal, Himanshu Jhamb
- Data Engineering: Akash Singh, Navdeep Gaur
- DevOps: Krishna Gupta
- Architect: Parvez Hassan
- Engineering Manager: Bharat Ghimire, Hitesh Kumar
