Attribution that works for a single creator can mis-credit a roster of six without ever producing a number that looks wrong. This is where it breaks, why the totals hide it, and what a per-creator key has to carry.
Attribution is a join. A click on one side, a conversion that happened on
fanvue.com hours or days later on the other. Every tool has to
decide which click a conversion belongs to, and every tool has cases where it is
not certain.
With one creator, uncertainty is harmless. There is only one creator, so any conversion that arrives belongs to them. Every ambiguous case resolves correctly by accident, and a tool can be sloppy about the join without ever showing it.
Put six creators behind the same workspace and each ambiguous case becomes a choice between six answers. The tool still returns one. It is simply wrong some of the time now, and wrong in a direction nobody audits.
Mis-crediting conserves the total. One conversion, one click, one credit — assigned to the wrong creator. The roster-level numbers stay exactly correct while every per-client number rots.
A worked example. Six creators, one month, $18,400 spent, 512 subscriptions. Assume eight per cent of conversions arrive without a click identifier and fall through to a weaker tier that picks the most recent unmatched click in the workspace. That eight per cent is a stated assumption for the example, not a measured rate. Misdirected credit flows towards whoever has the most recent click volume, which is the creator with the cheapest traffic.
| Creator | Spend | Subs (true) | Subs (reported) | CPA (true) | CPA (reported) |
|---|---|---|---|---|---|
| A | $2,100 | 214 | 238 | $9.81 | $8.82 |
| B | $3,200 | 96 | 107 | $33.33 | $29.91 |
| C | $2,800 | 71 | 77 | $39.44 | $36.36 |
| D | $4,100 | 63 | 55 | $65.08 | $74.55 |
| E | $3,400 | 41 | 27 | $82.93 | $125.93 |
| F | $2,800 | 27 | 8 | $103.70 | $350.00 |
| Total | $18,400 | 512 | 512 | $35.94 | $35.94 |
Total spend, total subscriptions and the $35.94 blended acquisition cost are all correct. Every per-client figure is wrong, and two are wrong enough to change a decision. F reads as a $350 acquisition against a real $104, and gets cut. E reads as $126 against a real $83, and gets its budget trimmed. A reads as the star and receives money it cannot absorb.
Note what these numbers are not. At an average first charge of around $12, a $35.94 acquisition cost is not a loss — it is a subscription business recovering over renewals, unlocks and tips. That is the whole reason per-client accuracy matters here: the decision to cut a creator is being taken on a first-month figure that only makes sense in the context of what their fans go on to spend.
Cut F and the mechanism does not stop; it operates on whoever is quietest next. Each round of pruning looks like it worked, because the survivors’ reported numbers improve as the misdirected credit concentrates into fewer creators. The roster gets smaller and the reports get better.
The second failure is cruder and easier to spot once you know to look for it. If conversions go to every pixel configured in the workspace rather than only the pixel belonging to the creator who earned them, every client’s dataset receives every other client’s conversions.
Meta’s asset model makes this worse than a reporting nuisance. A pixel is
owned by a business, and that business shares it with an agency by granting named
tasks. Meta documents UPLOAD as uploading website conversion data to
the dataset and ADVERTISE as connecting ad accounts to it. The
grammar of that model is unambiguous: the dataset is the client’s property
and the agency is a guest in it. Writing another creator’s subscription
values into it puts one client’s revenue inside another client’s
asset.
What makes the leak survive is that nothing looks broken. The events carry an
fbc rebuilt from a click on a different ad account’s ad, so the
receiving account has nothing of its own to credit them against, and they tend not
to surface there as attributed conversions. That last part is reasoning from how
attribution works rather than something Meta documents — but the dataset is
polluted either way. Value-based lookalikes and any audience built from purchasers
now include a stranger’s buyers, and the external_id sent with
each event — the Fanvue user uuid, which is the only stable person-level key
on offer, because Fanvue’s webhook payload carries the purchaser email as
null — identifies another creator’s fans.
Fan-out across a roster is a cross-client data leak, not a rounding error. Client B can export audiences built from client A’s paying fans, and neither of them agreed to that.
A filter added to the report cannot fix this, because a filter cannot recover information the join already discarded. The creator has to be part of the key from the click onwards.
On Fanvue the raw material is already there, because of how the links are
minted. Each creator authorises separately, and the connection holds that
creator’s own access token. Fanvue documents six write: scopes;
the only one this integration was granted is write:tracking_links,
and it arrives alongside openid, offline_access and a
third system scope, offline. A tracking link is created with one
creator’s token, inside one creator’s account, so the resulting
fvc code names exactly one creator.
It is worth being precise about the limit of that argument. Fanvue does publish agency scopes, and what they cover is the agency’s team members and invites — not a roster-wide key that mints links across creator accounts. Nothing in the public scope list describes one. Whether something equivalent exists internally is not visible from outside, which is the actual reason to carry creator identity in the tool rather than infer it: not that Fanvue cannot disambiguate, but that an integrator cannot verify that it does.
So creator identity is carried at every hop, and never has to be guessed:
ad click -> /r/spring-a slug belongs to one link
link belongs to one Fanvue connection
connection belongs to one creator
-> fanvue.com/handle?fvc=fv-123456&metadata[fvp_cid]=c8k2m9x
webhook -> tracking.metadata.fvp_cid = c8k2m9x the exact click
tracking.link_url ...?fvc=fv-123456 the creator's link
dispatch -> SELECT * FROM destinations
WHERE tenant_id = ? AND status = 'active'
AND (connection_id IS NULL OR connection_id = ?)
The bracketed metadata[...] spelling is Fanvue’s documented
form, and it is worth matching exactly rather than trusting a parser to normalise
a percent-encoded version of it. That one parameter is the entire join.
The weaker tier matters as much as the strong one. When a conversion names a
link but carries no click id, the fallback has to be scoped to that link —
newest unmatched click on fv-123456, not newest unmatched click
anywhere in the workspace. It is one extra join, and it is the entire difference
between the true and reported columns above.
Note the connection_id IS NULL branch. That is the single-creator
default, and it means every creator here. It is correct for a workspace
with one creator and wrong the moment a second is added. Any tool that grew up
serving solo creators has that default somewhere.
Each conversion carries the creator it belongs to, and only that client pixel receives it.
Start trackingSplitting a roster into one dataset per client is the right answer, and the objection to it deserves a straight hearing rather than a dismissal. The objection is the learning phase. Meta marks an ad set learning limited when it is unlikely to receive around fifty optimisation events in a week, and among Meta’s own suggested remedies is combining ad sets and campaigns. Six datasets each carrying a sixth of the events sounds like six times that problem.
The argument is weaker than it sounds, and the reason is in the definition. Those fifty events are counted per ad set, against that ad set’s own optimisation events. Another creator’s subscription is not one of them, whichever dataset it lands in. Pooling six creators into one pixel does not lift any client’s ad set out of learning limited; it puts five other creators’ conversions somewhere this client’s ad set will not count them. The consolidation buys less than the agency thinks it is buying.
What pooling genuinely feeds is the dataset-level machinery — audiences, value-based lookalikes, anything fitted on the set of people who converted. That is also precisely the machinery the contamination corrupts. A model fitted on a blended roster fits the blend, and where the creators’ audiences differ, the blend describes none of them accurately.
Ownership settles what is left. The dataset outlives the engagement: a client who leaves takes a pixel with a clean history, while a client whose pixel is full of six other creators’ buyers takes a liability. Where volume genuinely binds, the honest lever is fewer and larger ad sets inside one client, which is the unit the learning phase actually measures — not fewer datasets across clients.
These are things to verify, not questions for a sales call.
POST /webhooks/subscriptions can fail with
a 400 and an empty error body for some apps, so a working integration needs
the app-level endpoint as a fallback. The two are not equivalent. Meta aside,
Fanvue documents a per-subscription secret for API-registered webhooks and a
single signing secret for the app-level one — so on a roster that one
URL receives every creator’s events under one shared secret, and the
creator has to be resolved from the delivery rather than assumed from the
route.The technical fix stops the mis-crediting. It does not settle the argument, because the agency and the client are reading two systems that will never agree.
Meta’s attribution settings offer click windows of one day or seven days, so seven is the longest credit a click can be given. A fan who subscribes on day two and spends for eight months produces revenue the agency can see and Ads Manager will not credit. The agency’s dashboard therefore shows a better return than the client’s Ads Manager, permanently, in the agency’s favour. That is a genuine effect and also precisely what a dishonest agency would claim, which is why it has to be written down before the first invoice rather than explained after a bad month.
Three things belong in the contract:
One case has no clean answer. The same fan subscribes to two creators on the roster, through two paid clicks. Both clicks are real, both clients paid, and both conversions are correctly attributed. Fans are stored per connection, so that person is two records with two separate histories — which is right for each client’s pixel and wrong for the roster roll-up, where one person counts twice. Whether Fanvue’s user uuid is even the same value on both sides is not something one creator’s connection can see. That is a modelling decision rather than a bug, and it should be stated in the report rather than quietly resolved in whichever direction flatters the agency.
Connect a second creator, add a test event code to one pixel, and see whether the other one stays quiet.
Start trackingTechnically yes, and it is the default that causes the most damage. A shared pixel blends every creator's conversions into one dataset, so audiences and value-based lookalikes are fitted on the blend rather than on each creator's buyers. The usual defence is signal volume, and it is weaker than it sounds: Meta counts the roughly fifty optimisation events that clear the learning phase per ad set, and another creator's subscription is not one of this ad set's events wherever it lands. What remains is the ownership problem, which puts one client's revenue inside an asset another client owns. That alone usually decides it.
The pixel has to be bound to a specific creator connection, and the query that selects destinations for a conversion has to filter on it. Verify rather than trust: connect two creators, put a Meta test event code on only one client's destination, fire a conversion for the other creator, and confirm the Test Events tab stays empty.
Yes. Each creator authorises separately and the connection holds that creator's own access token. Fanvue documents six write scopes; the only one granted here is write:tracking_links, alongside openid, offline_access and a third system scope called offline. A tracking link is minted with one creator's token inside one creator's account, so a link and its fvc code identify exactly one creator. Fanvue does publish agency scopes, but what they describe is managing the agency's team members and invites, not a a roster-wide key for minting links across creator accounts.
Mostly the seven-day window. Meta's attribution settings offer click windows of one or seven days, so renewals, unlocks and tips beyond that still reach the dataset but stop being attributed to the ad. Unattributed conversions are the other half: a fan who arrived organically has no click behind them and should be reported as such rather than guessed onto the nearest campaign.
The client's business. Under Meta's asset model a pixel is owned by a business, which then shares it with an agency and grants named tasks — UPLOAD for uploading website conversion data to the dataset, ADVERTISE for connecting ad accounts to it. That arrangement leaves the learned history with the client when the engagement ends, which removes the most common cause of a bad separation.
Both clicks are real and both conversions attribute correctly to their own creator, so each client's pixel gets an accurate event. Fans are stored per connection, so that person is two records, and the roster-level roll-up will count them twice. There is no correct answer, only a stated one, and the report should say which convention it uses.
Separate datasets are the part that carries the attribution and ownership consequences described here. Separate ad accounts are mainly an access-control and billing question, and worth doing for the same reason, but a shared ad account with correctly scoped datasets is a far smaller problem than a shared dataset.