Back to blog
AI Advertising10 min read17 September 2026

How AI Picks Your Ad Audience — And the Bug That Silently Breaks It

Adyft Guide

AI Advertising

Audience selection is the step where AI ad tools diverge most, and it is invisible on every feature list. Two tools can both say "AI-powered targeting", both launch successfully, and produce completely different campaigns — because one reads the platform live and the other ships a list somebody typed a year ago. Here is how it actually works, and the specific bug that breaks it silently.

What the platform actually offers

Meta exposes a targeting taxonomy through its Marketing API: interests, behaviours, demographics and life events, each with a numeric ID. The behaviours list currently runs to roughly 284 entries — things like recent purchase activity, device usage, travel patterns and spending signals.

💡 The fact that surprises almost everyone: Meta returns the same catalogue regardless of which country you ask about. There is no separate UAE list, US list or India list. The country-named entries — the ones describing buyer value in a specific market — all sit inside one shared catalogue. Ask for behaviours "for the UK" and you get the same 284 you would get asking for anywhere else.

This matters because it means a tool cannot shortcut the work by keeping a per-country list. It has to read the whole catalogue and choose intelligently from it.

The two implementations

Hardcoded list

The tool ships with a fixed set of interests and behaviours chosen by whoever built it. Fast, predictable, requires no API call — and silently wrong for any market the author was not thinking about.

Live taxonomy at build time

The tool queries Meta for the current catalogue, has a model select from it, and keeps the real IDs on the chosen entries. Slower to build, correct everywhere, and it stays correct as Meta changes the list.

The bug, and why nobody catches it

Worth describing concretely, because we shipped it ourselves and it took months to find.

The architecture was correct: a model was given the full fetched catalogue and asked to choose the behaviours that fitted the business. It chose 177 of them, sensibly. Then a later step looked up each chosen name in a hand-maintained list of fifteen behaviours to get its numeric ID — and anything not in that list of fifteen had no ID, so it was dropped.

161 of 177 selections were discarded. Every campaign still launched. No error appeared anywhere. The report showed the campaign as built.

💡 The detail that made it invisible for so long: the list of fifteen had been written for one market. So that market's campaigns kept their buyer-value behaviours and looked fine, while every foreign campaign ran without them. If you only check the market you built for, the bug does not exist.

The fix was small — merge the fetched entries into the ID lookup instead of relying on the hand-typed list — and the difference in what campaigns targeted afterwards was substantial.

How to test a vendor for this

  • 1Ask directly: is targeting fetched from the platform at build time, or included in the product? It is a factual question with a factual answer.
  • 2Build a campaign for a country the vendor is obviously not based in, and look at the audience it produces. If the interests are generic and none are specific to that market, the list is hardcoded.
  • 3Ask how many interests and behaviours the tool can choose from. A number under a hundred means a curated list, which is a design decision they should be able to defend.
  • 4Check the campaign in the platform's own interface after it is built. The targeting should be visible there, and you should recognise it as thoughtful rather than generic.

Flat lists versus layered segments

The second thing that separates implementations, and it affects what you learn rather than what you reach.

A flat audience — every interest in one ad set — averages your best-performing segment together with your worst and reports a single number. You cannot tell which part worked, so you cannot do anything useful with the result.

Layered segments put each audience group in its own ad set, so cost per result is reported separately. You find out that one segment costs half what another does, which is actionable. The cost is the platform minimum applying per ad set — a conversion objective sits at roughly three times the impression floor, so three segments means three funded ad sets.

The practical trade-off: if your budget cannot fund three properly, run one. Three starved segments teach you nothing and deliver worse than one funded one.

Two traps in audience building

AND instead of OR

Layering conditions narrows rather than broadens. A lookalike audience further narrowed by interests can collapse reach from 1.4 million to 23,500 — at which point the ad set cannot deliver regardless of budget.

Lookalikes from tiny seeds

A custom audience of twenty people does not produce a usable lookalike. The platform will build one anyway and tell you nothing about its quality.

And the thing worth leaving alone

Placements. Meta publishes guidance to let its system choose them rather than pinning by hand, and reports better cost per result for campaigns that do. Three legitimate reasons exist to pin — per-placement creative, brand fit, brand safety — and most small businesses meet none. A tool pinning placements by default is overriding the optimisation you are paying the platform for.

Targeting read from the platform, not shipped in the product

Adyft fetches Meta's live targeting catalogue at build time and builds layered segments you can actually compare. 14-day free trial, no card.

Start free — no card needed
A

Adyft Team

Published 17 September 2026

© 2026 Adyft Technologies Pvt. Ltd.