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:

QuestionUse 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

InteractionIntent Weight
View ListingX
First Chat3X
Make Offer5X
Call Seller10X

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):

ListingEmbeddingActionWeight
Maruti Brezza(0.9, 0.1)ViewX
Hyundai Creta(0.8, 0.2)ViewX
Honda City(0.2, 0.9)First Chat3X

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

SituationProfile behaviour
New userFollows current activity
Casual browsingChanges very little
Strong intentAdapts noticeably
Strong historyStays stable
Long inactivityConfidence fades; adapts faster

Starting point: α_min ≈ 0.05 and a 90-day confidence half-life. Normalise the updated embedding before storage.

How it works

  1. Understand listings — Convert every listing into a multilingual embedding using its text and attributes.
  2. Understand buyers — Build a dynamic embedding from user actions, giving more weight to strong and recent intent.
  3. 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).
  4. Serve recommendations — Apply business filters and ranking to deliver personalised recommendations, buyer leads, similar ads, or seller matchmaking.

Same representation, several products:

  1. Discovery for buyers
  2. 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

Author