How Grab finds customers who look like an advertiser's best ones
In 2023 Grab rebuilt its lookalike audiences for advertisers on shared user embeddings. New audiences went live within 15 minutes instead of two working days, and Grab reports a 98% drop in the cost of making them.

Every advertiser wants more customers like the ones it already has. A lookalike audience is the machine version of that wish: start from a seed list of good customers, then find other users who behave like them. In September 2023 William Wu of Grab described how the company rebuilt this for the advertisers on its app. The old way took days and cost too much. The new one is a short chain of simple steps on top of something Grab already had: one learned vector per user.
The problem: slow, stale and expensive
Grab's first version worked, but it did not scale with the number of merchants buying ads. "Earlier, the platform stored results on Segmentation Platform (SegP) and it took two working days to generate a lookalike audience list. This is because inserting a single audience into SegP took three times longer than generating the audience." Updates ran weekly, so audiences went stale, and "The cost of producing one segment can add up quickly for advertisers who need to generate multiple audiences."
For a self-serve ad product that is a bad combination. A small merchant who sets up a campaign today does not want to wait until the day after tomorrow for the targeting to exist.
How they built it
Reuse the user vectors. Grab already trains an embedding for every user, a list of numbers learned from "billions of user actions" in the app. Other teams use the same vectors, which keeps the cost shared: "To minimise costs, we leverage the passenger embeddings that are also utilised by other projects within Grab, beyond advertising, thus sharing the cost."
One vector per audience. When an advertiser creates a campaign with a seed audience, a scheduled job builds the lookalike. "The Audience Creation Job retrieves the audience metadata from the online audience service, pulls the passenger embeddings, and then averages these embeddings to generate the audience embedding." The average of the seed users' vectors becomes the audience's vector.
A score and a cut-off. Membership is a similarity test. "We use the cosine score of a user and the audience embedding to identify the audiences the user belongs to. Hence, it's sufficient to store only the audience embedding and score threshold." The threshold comes from ranking: Grab's flowchart sets it at the score of the user ranked at a chosen top percentage, which Grab does not disclose.

Answer at ad time, from memory. When the app is about to show an ad, the backend asks which audiences the user belongs to, and the click-through model picks among the ads that target them. To be fast enough, all vectors live in memory, and that raised a size problem: "the embeddings of all users are approximately 20 GB, which could affect model loading."
Shrink the vectors with a hash. Grab's fix borrows the idea behind Bloom filters. "We utilise hash functions to obtain the hash64 value of the paxID, which is then segmented into four 16-bit values. Each 16-bit value corresponds to a 16-dimensional embedding block, and the compressed embedding is the concatenation of these four 16-dimensional embeddings." The small blocks are trained to reproduce the original vectors as closely as possible. The text says this cut memory "by around 90%"; a diagram in the same post shows 20 GB becoming under 100 MB, which would be far more.

What it delivered
Grab reports three results. "Users can see advertisements targeting a new audience within 15 mins after the advertiser creates a campaign." "Costs for generating lookalike audiences decreased by 98%." And an A/B test against the old system "doubled the impressions and clicks, while also improving the CTR, conversion rate, and return on investment."
Read those carefully. The 15 minutes matches the job's schedule in Grab's diagram, so it is probably how often the job runs, not a measured wait. The 98% has no stated baseline. The A/B test comes with no length, traffic split or sample size. And because the old system was slow and stale, the doubling may reflect fresher, more available audiences as much as better matching. The post gives no measure of how good the lookalikes themselves are.
What has changed since
Grab has not written about lookalikes again, but the pieces around them moved. In September 2025 it described a user foundation model, one transformer whose embeddings feed "advertisement optimisation, dual app prediction, fraud detection, and churn probability, among others." That is the natural successor to the vectors this post relies on. In December 2025 its customer data platform post listed "external platforms, including Facebook, Google Ads, and TikTok" among the places audiences go. The business grew too: in the second quarter of 2025, "Advertising revenue grew 45% YoY to an annualized run-rate of $236 million during the quarter."
The big platforms changed direction. Google stopped generating "similar audiences" in May 2023 and removed them in August. Its replacement, lookalike segments for Demand Gen campaigns, offers reach settings of 2.5, 5 and 10% of users, the same top-slice idea Grab uses. In 2026 Google began turning those segments into suggestions: "Your seed list will act as a signal for Google's models, and the system may reach highly qualified customers outside of similarity thresholds to help you reach your campaign goals." Meta's Advantage+ lookalike works the same way. The trend is from a hard cut-off you control to a hint the platform's AI may go beyond.
Why it matters for your business
Grab and GrabAds operate across Indonesia, and Indonesian advertisers increasingly build their own audiences from first-party data. Lookalikes are profiling at scale, so UU 27/2022 on personal data protection applies. Under Article 20, every processing needs a legal basis, such as explicit consent for a stated purpose, and Article 24 asks you to be able to show that consent. Article 34 requires a data protection impact assessment for high-risk processing, and its list includes large-scale processing, systematic scoring of people, and matching or combining data sets. A lookalike pipeline does all three. Article 56 sets conditions for sending personal data abroad, which matters the moment a seed list is uploaded to a foreign ad platform. Article 10 gives people a right to object to decisions based only on automated processing, profiling included, when they have a significant effect. Whether showing an ad counts is a question for counsel. The implementing regulation, PP 33/2026, was signed in July 2026 and takes effect in January 2027, according to law-firm summaries. We are engineers, not lawyers: check the details with yours.
How we would build it today
- Start with a rules audience. Repeat buyers in one category and one city over the last 90 days. Measure it; any lookalike has to beat it.
- Use consented, first-party seeds only. Record the purpose and legal basis per audience, drop people who withdrew consent on every refresh, and leave out minors and sensitive data such as health or personal finance.
- Keep the model small. Learn user vectors from orders or clicks, average the seed vectors, score by cosine similarity, and cut at the top 2.5, 5 or 10%. Most mid-size apps can keep every vector in memory without Grab's hash trick.
- Set thresholds per city. Behaviour in Jakarta and in Makassar differs; one national cut-off will drift.
- Measure with a hold-out. Keep a random control group that gets no targeting change, as Grab's own 2024 campaign-measurement post does, and judge on extra conversions and cost per conversion, not clicks.
- Test against the platforms. Run your audience, the platform's lookalike and a broad AI-targeted campaign side by side with a hold-out, since the platforms now treat lookalikes as suggestions.
- Write the consent in plain Bahasa Indonesia, separate from other terms, with easy withdrawal, and do the impact assessment before launch.