EvlPixel
Home › Fanvue tracking links: what they measure and what they do not

Fanvue tracking links: what they measure and what they do not

Fanvue’s native tracking links are better than their reputation and more limited than their name suggests. This is where the ceiling sits, field by field, and what the per-impression metadata channel is actually for.

What the feature actually is

A Fanvue tracking link is a small object with a name, a channel label and a short code. Creating one takes two required fields: name and externalSocialPlatform. The platform must be one of eight enum values — facebook, instagram, other, reddit, snapchat, tiktok, twitter, youtube. Everything else is computed by Fanvue and read back.

What comes back is more than most people realise, which is why the ceiling catches them out later. One thing worth knowing before building against it: the field named linkUrl is documented as “Tracking link URL”, and the example value the reference gives for it is fv-123. It holds a short code, not a URL. It is the kind of naming that costs an afternoon if you assume otherwise.

FieldWhat it countsAttribution model
clicksClicks on the linkNone — a raw counter
engagement.acquiredSubscribersSubscribers acquired through this linkFirst-click — documented as “users only counted for the first link they clicked”
engagement.totalSubscribersEveryone who clicked this link and is an active subscriber nowCurrent state, no attribution
engagement.acquiredFollowers / totalFollowersThe same two shapes, for followsAs above
earnings.totalGross / totalNetLifetime revenue before / after feesWhole-link lifetime, no timestamp

Three attribution models sitting in one feature

This is the part nobody mentions. Fanvue’s tracking surface does not use one attribution model. It uses three, and they disagree with each other by design.

acquiredSubscribers is documented as first-click attribution, with the parenthetical that users are only counted for the first link they clicked. totalSubscribers is a current-state count of everyone who clicked this link and is an active subscriber right now, regardless of who acquired them. On the webhook, tracking.metadata is documented as the latest tracking-link impression metadata for this creator, which is last-touch.

Then there is the field that will bite you.

{
  "type": "creator.subscription.activated",
  "data": {
    "price": 999,
    "purchaser": { "uuid": "fan-uuid", "email": null },
    "tracking": {
      "link_url": "https://fanvue.com/creator-handle?fvc=spring-promo",
      "metadata": { "campaign": "spring-promo", "source": "x" }
    }
  }
}

Note the shape before the semantics. On the API object, linkUrl is a bare code. On the webhook, link_url is a full destination URL carrying the code in an fvc query parameter. Two fields, near-identical names, different shapes — so joining a webhook back to a link means parsing the query string, and defending against the bare code arriving instead.

link_url is not scoped to youFanvue documents tracking.link_url as the buyer’s stored tracking-link parameter, platform-wide last-touch, not scoped to this creator. If a fan clicks your link, then clicks another creator’s tracking link, then subscribes to you, the link_url on your webhook can be the other creator’s. tracking.metadata, by contrast, is documented as scoped to this creator. The reference says outright that the two can legitimately disagree. That single difference is why one is usable as an attribution key and the other is not.

Fanvue documents this plainly rather than hiding it, which is to their credit. It is still the single most common way a home-built attribution script goes quietly wrong.

Which events carry any of it is worth checking before you build. tracking is an object | null on creator.payment.succeeded, on creator.subscription.activated and on creator.follow.created. The post-liked and post-commented events carry no tracking block at all. Checkout-link events do not carry one either — those attribute through client_reference_id and their own passthrough metadata instead, which is a separate mechanism with a separate shape.

The renewal case matters more than it looks. The documented example for creator.subscription.renewed shows tracking: null. Attribution is present at inception and absent on every billing cycle after it, so anything that wants to credit renewal revenue to a source has to store the first-touch result itself and carry it forward. Nothing on the platform will re-state it for you.

The first-click rule has a consequence worth planning around too. Because a fan is only counted against the first link they clicked, a retargeting link will under-report against your prospecting link permanently. That is not a bug. It is correct behaviour for a first-click model, and it is the wrong number to judge retargeting on.

The money question, answered fairly

Tracking links do report revenue. Anyone saying otherwise has not read the schema. The earnings object carries totalGross, documented as total gross earnings from the link before fees, and totalNet, after fees. On a freshly created link the whole object is null, which the reference states explicitly.

The honest version of the limitation is narrower and more interesting than “no revenue data”. The number is a lifetime running scalar with no timestamp attached. There is no time series. The createdAfter and createdBefore filters on the list endpoint are documented as filtering links created on or after, and before, an ISO datetime — the link, not the money. There is no per-event breakdown, so a subscription and a tip are the same pound in the same total.

The earnings fields also carry no currency field and state no units. Webhook payloads are explicit on both counts: amounts are integers in the currency’s minor units, and resources carry an ISO 4217 currency. The tracking-link schema says neither. Fanvue settles creator earnings in USD cents, so USD cents is the reasonable inference — but it is an inference, and it is worth confirming against your own numbers rather than trusting it.

The structural consequence is the whole story of this page. Meta’s Conversions API wants a per-event value, a currency and an event_time, and it will not take an event older than seven days — if any event_time in a batch is further back than that, Meta rejects the entire request and processes none of it. A lifetime total has no event time and cannot be given one. You cannot derive per-event signal from an aggregate. This is not Fanvue doing analytics badly — it is an analytics number being asked to be an ad-optimisation signal, which is a different kind of object.

There is no campaign, only a channel label

externalSocialPlatform is the closest thing to a campaign concept, and it is a fixed enum of eight channel names. There is no campaign, no ad set, no ad. The enum does not map cleanly onto Meta either: Advantage+ placements is the default, and it delivers one ad set across Facebook, Instagram, Messenger and Audience Network at once. Being made to pick a single platform describes something the ad platform is actively trying not to distinguish.

The API reference lists create, list, delete, list users and get metadata, plus the agency-side equivalents of each. There is no update endpoint documented. A link’s name and platform are therefore effectively fixed — changing them means delete and recreate, and a new link starts with clicks at zero and earnings null. What becomes of the deleted link’s history is not documented at all; the delete endpoint says only that it returns 204. Whatever you encode in name at creation, you live with. Name them so they sort, and so a stranger could read the name in six months.

The per-impression metadata field is the interesting part

Among the tracking-link endpoints is the only field on the whole surface that belongs to you rather than to Fanvue.

The metadata endpoint returns custom metadata from the user’s most recent impression on the link: an object of arbitrary keys with string values, or null. The same data arrives pushed to you as tracking.metadata on the events listed above, scoped to your creator account.

That is a per-fan, per-impression, creator-scoped free-text channel that survives from click through to conversion. Every other field is an aggregate Fanvue computed for you. This one carries whatever you put in it.

Do not confuse it with its neighbours. On creator.payment.succeeded, the top-level client_reference_id, transaction_id and metadata are documented as always null, present so the payload keeps the same shape as the checkout events. The nested tracking.metadata is the one that carries anything.

Two things govern its use. The semantics are most-recent-impression, so a second click overwrites the first — whatever you store must resolve on its own, not depend on being the first touch. And the pull endpoint is keyed by both link uuid and user uuid, so you must already know which fan you are asking about. It is a reconciliation tool, not a discovery tool. Discovery comes from the users endpoint.

One thing the reference does not stateThe read side of metadata is documented thoroughly — both the pull endpoint and the webhook field. How a value gets attached to a tracking-link impression in the first place is not stated anywhere on those pages. Fanvue documents a metadata[key]=value query convention for checkout links, with limits of ten keys, forty characters per key and two hundred per value, and invalid entries dropped silently. Whether tracking-link impressions accept the same form is an assumption, not a documented capability. Verify it with one real click before anything load-bearing depends on it, and have a fallback for the case where nothing arrives.

What to do with the links alone

You can get a long way before needing anything else, and most creators never exploit half of this.

Where the ceiling actually is

Fanvue’s tracking links tell you how many people clicked, who those people are, what happened to them, and how much money the link has produced in total since it was made. That is a well-built feature and it answers the question it was designed to answer: which channel is working.

It does not tell you which of your ads it was, because there is nowhere to put an ad id. It does not tell you when the money arrived, because the earnings total has no time dimension. And it does not push anything outwards, because it is a reporting surface inside Fanvue, not an attribution pipeline.

What sits above itEvlPixel mints a link you point the ad at. On the click it records fbclid, fbc, fbp, IP and user-agent, mints a click id, and writes that click id into the metadata of Fanvue’s own native tracking link. When the fan later subscribes or tips, the Fanvue webhook carries the click id back — a deterministic join through a third party rather than a guess by IP and timestamp. Because renewals arrive with tracking: null, the winning click is stored against the fan and inherited by later events. The conversion then goes to the advertiser’s pixel through the Conversions API with value, currency and a predicted lifetime value. The unflattering part: purchaser.email is always null, so there is no hashed email to send as a matching key. Match quality rests on external_id, fbc, fbp, IP and user-agent instead, and it is lower than an integration that has email.

Attribution that survives the handoff

EvlPixel joins the click to the conversion through Fanvue’s own tracking link. Join the waitlist.

Start tracking

Common questions

Do Fanvue tracking links show revenue?

Yes. Each link carries an earnings object with totalGross (before fees) and totalNet (after fees), documented as null for newly created links. The limitation is not that revenue is missing but that it is a lifetime running total with no timestamp and no per-event breakdown. A subscription and a tip land in the same figure, and there is no way to ask what the link earned last week. The object also carries no currency field, unlike the webhook payloads, which state minor units and an ISO 4217 currency.

Can tracking links tell me which Meta ad worked?

Not on their own. There is no ad id, ad set or campaign field anywhere on the object — only externalSocialPlatform, an eight-value channel enum. The common workaround is one tracking link per ad, which does work, but it breaks down at scale: no update endpoint is documented, so a link cannot be renamed as creative changes, and first-click attribution means a fan touching two of your links is only ever credited to the first.

What is the difference between acquiredSubscribers and totalSubscribers?

acquiredSubscribers is documented as first-click attribution, with users only counted for the first link they clicked. totalSubscribers counts everyone who clicked this link and is an active subscriber right now, no matter who acquired them. A link with a high total and a low acquired count is doing re-engagement work rather than acquisition, which is useful to know before switching it off.

Does the conversion webhook tell me which of my links a fan came from?

Partly, and the detail matters. tracking.metadata is documented as scoped to this creator and is safe to use. tracking.link_url is documented as the buyer’s stored tracking-link parameter, platform-wide last-touch and explicitly not scoped to this creator, so it can carry a different creator’s parameter if the fan clicked one more recently — the reference notes the two can legitimately disagree. Treat link_url as a hint, never as an attribution key. Note also that the object appears on payment, subscription-activated and follow events, and the documented renewal example shows tracking: null.

Can I match a Fanvue conversion to a Meta user by email?

No. The purchaser object’s email is documented as always null. Hashing an email on both sides — the usual deterministic join — is not available. Anything claiming email-based matching on Fanvue is either using a different data source or is mistaken.

How many tracking links can I create, and can I rename one?

Fanvue’s help centre states tracking links are unlimited. Renaming is the constraint: the API reference lists create, list, delete, list users and get metadata, with no update endpoint. Deleting and recreating gives you a new link starting at zero clicks with earnings null, and what happens to the deleted link’s history is not documented, so pick a naming scheme before you create fifty of them.

What does the per-impression metadata field do?

It stores an object of arbitrary string-valued keys against a fan’s most recent impression on a link, readable either by pulling /tracking-links/{uuid}/users/{userUuid}/metadata or by receiving tracking.metadata on the webhook. It is the only field on the tracking surface that carries your data rather than Fanvue’s counters, which is what makes a click-to-conversion join possible at all. How a value is written to a tracking-link impression is not documented, which is the one thing to verify yourself.