Every guide about AI creators is about building the persona. This is about the part after that — buying traffic for one, where creative is effectively free and the only thing left worth being good at is knowing which persona and which creative produced people who actually paid.
For a human creator, ad creative is rationed by shoots. You get what you got that day, cut it into fifteen variants, and build the campaign around scarcity of material. An AI persona removes that constraint completely. Two hundred variants is an afternoon.
What it does not remove is the other constraint. Budget caps how many conversions you can buy in a week, so spreading the same conversions across two hundred creatives instead of fifteen does not create information — it divides the information you already had into thinner slices. Meta’s own developer guidance is explicit about where the floor sits: learning happens at the ad set level, and the learning period stabilises at a minimum of fifty events over a seven-day period. Below that, the differences you are reading between creatives are mostly noise.
There is a second edge that catches creative volume specifically. Those fifty events are counted since the last significant edit, and changing an ad set’s creative is a significant edit. Rotating creative through a live ad set is therefore not free — it can restart the count you were trying to accumulate. Whether adding one more ad to an ad set already running twenty resets anything is not something Meta’s documentation settles, and practitioner reports go both ways. Treat that as unresolved rather than as a technique.
So the scarce resource stops being creative and becomes evidence per creative. The operator who wins is not the one generating the most variants. It is the one who can kill a hundred and ninety of them on conversion data rather than on how they look in the grid.
That requires the conversions to reach Meta at all. The payment happens on fanvue.com, on pages the advertiser does not own, so there is nowhere to place a browser pixel that fires at the moment money moves. Fanvue’s help centre documents tracking links as the native measurement — unlimited of them, across as many platforms and campaigns as you like — and describes no pixel integration alongside them. Without a server-side path back, the optimiser is left with clicks, and clicks are exactly the metric an attractive synthetic face is best at producing.
Running five personas is not running one campaign five times. Everything that was implicit for a single creator becomes a decision you have to make deliberately.
The join itself is per-creator by construction. Each creator authorises separately over Fanvue OAuth. EvlPixel mints a tracking link, and on a click records fbclid, fbc and fbp and issues a click id. That click id is written into the metadata of Fanvue’s own native tracking link, so when the fan later subscribes or tips, Fanvue’s webhook carries the click id back. The conversion is joined to the click deterministically, through Fanvue itself, rather than inferred from timing.
Two consequences of that are portfolio-specific, and only become visible once more than one creator is connected.
The first is that per-creator webhook subscriptions are not guaranteed. POST /webhooks/subscriptions can answer 400 with an empty error body for some apps, with nothing in the response to act on. A shared app-level endpoint is therefore a necessary fallback rather than a design preference — which means events for every persona in the portfolio can arrive at the same URL. They have to be separated by the creator identity inside the payload. Anything that infers the creator from which endpoint received the event will silently cross-attribute the moment that fallback engages.
The second is identity. Fanvue’s webhook payload has the purchaser’s email as null. There is no email to hash, so the Conversions API match rests on external_id, fbc, fbp, IP and user agent. Meta defines external_id loosely — any unique ID from the advertiser, such as loyalty membership IDs, user IDs or external cookie IDs — and treats hashing as recommended rather than required. The one firm instruction is about consistency: if the same external ID is also sent through another channel, it should be in the same format as when sent via the Conversions API. With one creator that is trivial. With five it is a namespace decision: if the same fan subscribes to two of your personas, whether Meta sees one person or two depends entirely on the identifier you picked, and it should be picked before the first event rather than after ten thousand.
| Setup | What it buys | What it costs |
|---|---|---|
| One dataset for the whole portfolio | A single event history behind modelling, audiences and reporting, and one set of credentials to keep alive | Per-persona signal arrives blended, and every report has to be unpicked by creator afterwards |
| One dataset per persona | Clean per-persona signal, and reporting you can act on without unpicking it | Each dataset builds its history from zero, and the external_id namespace has more places to go wrong |
One thing that does not belong on that list is the learning phase. It is counted per ad set, on that ad set’s own optimisation events, so splitting a portfolio across datasets does not by itself hold an ad set in learning for longer. What splitting divides is the accumulated history behind modelling, audiences and reporting. The deciding question is whether the personas genuinely attract different people — if two of them pull the same audience, splitting halves that history for nothing.
One connection per creator, one deterministic join per conversion, one report you can act on.
Start trackingWorth reading from the source, because the secondary coverage of this is unreliable. Meta’s post on generative AI transparency in its ads products, updated 1 June 2026, sets out a tier system for creative made with Meta’s own in-house generative AI features. No significant edit and no photorealistic human, and no label is applied. A significant edit, and a label appears either behind the three-dot menu or next to the “Sponsored” label. And where those tools produce an AI-generated photorealistic human, Meta states the label appears next to “Sponsored” rather than behind the menu.
Read that last tier against what an AI persona is. A photorealistic human who does not exist is the entire product. In the Meta-tools case the label is not tucked into a menu — it sits on the face of the ad, beside “Sponsored”, where the audience meets it before anything else.
Separately, since 1 June 2026 Meta applies automated detection to ad media created or edited with third-party generative AI tools, using what it calls industry-standard signals, and surfaces an “AI info” label in “About this ad” — the unified transparency panel that same update introduced behind the three-dot menu. What Meta’s post does not say is whether the photorealistic-human placement rule carries across to third-party detection. That is the open question, and for anyone generating personas outside Meta’s own tools it is the part of the policy whose answer would actually change the creative. Meta also says plainly that not every ad receives the label — minor changes such as resizing or colour correction do not trigger it — so detection is a floor, not a guarantee.
Affirmative disclosure by the advertiser is a different obligation and a narrower one. It is written into the standard for ads about social issues, elections or politics, and the wording repays attention: it covers photorealistic media digitally created or altered to depict a real person saying or doing something they did not, and also to depict a realistic-looking person who does not exist. That second clause describes an AI persona exactly. It simply does not reach a subscription ad, because a subscription ad is not that category. The area is being actively expanded, so read the current standard before a launch rather than trusting a page written in August 2026.
The rule that actually decides whether the ad runs is a different one again. Meta’s advertising standards prohibit imagery depicting nudity, sexual activity, or people in explicit or sexually suggestive positions, and a separate standard prohibits asking for or offering pornographic content and facilitating commercial sexual services. Those standards are about what is depicted. They do not soften because the person depicted does not exist. Being synthetic buys no latitude at all.
The destination declares it regardless. Fanvue requires that AI-generated media be disclosed as not real, shown in the profile bio, the content caption, or as a watermark on the media itself, and its help centre states that every AI creator carries an AI tag in the profile bio. So whatever the ad implies, the page the click lands on says the persona is AI, before the fan decides. Creative that leans on being taken for real is creative that arranges its own contradiction at the point of payment.
EvlPixel reports conversions to an ad account. It has no view of what is in the creative and cannot make an account compliant. Ad policy is your responsibility, and paid traffic should route through a safe-for-work destination.
facebookexternalhit fetches every ad destination when the ad is created — it is the fetcher that builds the preview card. At fifteen creatives that is background noise. At two hundred it is two hundred fetches of two hundred tracking links in a short window, and anything counting a request as a click has just invented two hundred phantom clicks and diluted every rate underneath them.
Filtering on that one name is already out of date. Meta’s crawler documentation lists several agents, among them meta-externalads/1.1, described as crawling the web for use cases such as improving advertising and other business-related products and services. A filter written against facebookexternalhit alone lets the rest through.
robots.txt is the obvious lever and it is weaker than it looks. Meta frames the file as a way to tell its crawlers how you would prefer them to interact with your site, then names exceptions: Meta-ExternalFetcher may bypass it because its fetches are user-requested, and FacebookExternalHit might bypass it when performing security or integrity checks. Meta’s own advice is to identify crawlers by user agent or by IP address, and it calls the IP address the more secure of the two. The reliable control is therefore filtering at the tracking endpoint, not a line in a file. And the blunt version has a cost either way: disallow the tracking path and the preview card stops being built along with the phantom fetches.
The opposite error costs more. In-app browsers on Snapchat, TikTok and Instagram send user agents that name the app, and naive bot filters read an unfamiliar token in a user agent as a crawler. Those are not crawlers. That is the audience, in the placements paid social sends the most traffic to.
Meta’s documentation puts the limit plainly: event_time can be up to seven days before you send an event. The real lifetime value of a subscription plus tips takes months to resolve. Those two facts do not overlap, and patience does not reconcile them — by the time the actual value of a fan is known, the event is far too old to send.
Which leaves two options. Send the first charge, and let the optimiser chase cheap first subscriptions. Or send a predicted lifetime value at conversion time, and let it chase people who resemble the fans who kept paying. The second is better, and it is also a model, with everything that implies.
The weak point should be stated plainly. A prediction is a claim about a cohort, and at the start of a campaign there is no cohort, so the earliest predicted values are guesses and are better presented as guesses than dressed up as measurements. In a portfolio there is a sharper version of the same problem. One lifetime-value curve applied across every persona will over-fund whichever persona converts cheapest at the front, whether or not its fans stay, because the error runs in one direction only. Whether personas differ enough in retention to need separate curves is an empirical question per portfolio — but assuming they do not is the assumption that costs money, and a per-creator curve costs nothing to keep if the difference turns out to be small.
Two mechanical details for anyone reconciling against Fanvue’s own numbers. Fanvue settles creator earnings in USD cents regardless of the currency the fan paid in, so the currency on a conversion event is a settlement fact and not the fan’s. And /insights/earnings caps page size at 50 — asking for more returns a too_big validation error — and is newest-first and cursor-paginated. A full backfill across a portfolio is one paginated crawl per creator; an incremental sync can stop as soon as it reaches records it already holds, which is the only reason newest-first ordering is a gift rather than a nuisance.
At portfolio volume you will meet Meta’s rate limits, and Meta reports them as HTTP 400 with error codes 4, 17, 32, 613 or 80004 rather than 429. A retry layer that only backs off on 429 reads those as permanent failures and drops the events.
It depends on whether they attract different people, and not on the learning phase. The learning phase is counted per ad set, on that ad set's own optimisation events, so splitting datasets does not by itself hold an ad set in learning for longer. What one dataset buys is a single event history behind modelling, audiences and reporting. What separate datasets buy is per-persona signal you never have to unpick. The attribution is per-creator either way, since each creator authorises separately and the click id returns on that creator's webhook.
In the general case Meta labels it rather than asking you to declare it. For creative made with Meta's own in-house generative AI features Meta describes a tier system, and where those tools produce an AI-generated photorealistic human it says the label appears next to "Sponsored" rather than behind the three-dot menu. Since 1 June 2026 Meta also detects third-party AI tools automatically and shows an "AI info" label in "About this ad"; its post does not say whether that same placement rule carries over to the third-party case. Affirmative advertiser disclosure is written into the standard for ads about social issues, elections or politics. Read the current standard before launching; this is being expanded.
No. The advertising standards prohibit imagery depicting nudity, sexual activity, or people in explicit or sexually suggestive positions. The test is what the imagery depicts. Whether the person depicted exists is not part of it.
No. Fanvue's webhook payload has the purchaser email as null, so there is nothing to hash and send. Matching rests on external_id, fbc, fbp, IP and user agent. Of those, fbc deserves the most engineering care, because it is the only one that ties the event to a specific ad click rather than to a person or a device — which is why the click id is captured at the redirect rather than reconstructed afterwards.
Because Meta's documentation allows an event_time up to seven days old, and the real value of a subscription takes months to resolve. There is no version of waiting that works. The choice is between sending the first charge and sending a prediction, not between a prediction and the truth.
facebookexternalhit fetches every ad destination when the ad is created, to build the preview card. Two hundred new ads means two hundred fetches in a short window. It names itself in the user agent, so it is filterable — but filter on more than that one name, since Meta's crawler documentation also lists meta-externalads, and Meta says FacebookExternalHit might bypass robots.txt when performing security or integrity checks. Anything counting raw requests as clicks will show a spike that never converts.
Yes. Fanvue requires AI-generated media to be disclosed as not real, shown in the profile bio, the content caption, or as a watermark, and its help centre states that every AI creator has an AI tag in the profile bio. The disclosure sits on the destination, in front of the fan, before they subscribe and whatever the ad said.
Fanvue rejects every write:* scope except write:tracking_links, which happens to be the one that matters, since minting the tracking link is how the click id gets carried through to the webhook. It also requires a third system scope, "offline", alongside openid and offline_access. Requesting the usual two is not enough.