- Taste clusters — segments of likely buyers for this event.
- Suggested clusters for a given budget and goal — what to actually spend on.
- Expected value — predicted tickets sold and revenue for any cluster selection.
- Default campaign parameters — sensible budget / goal / cluster defaults so you don’t ask the user to start from scratch.
Taste clusters
A taste cluster is a learned segment for one specific event. It is not a generic audience — it is “people likely to buy a ticket to this event, grouped by why.” Clusters are versioned bytc_run_id.
metric_pred is the model’s affinity score (higher = more likely to buy).
size_share is the cluster’s share of the total reachable audience.
Suggested clusters at a budget
The Wave wizard doesn’t make the user pick clusters cold — it asks Affinity for the suggested mix at the user’s target budget and goal.| Goal | What it optimises |
|---|---|
tickets | Number of tickets sold |
revenue | Gross revenue |
reach | Impressions |
Expected value
Once the user has a candidate cluster selection, get the predicted outcome:suggested_tcs but at higher fidelity once
a selection is locked in — use it to render the “we expect ~412 tickets at
€18,540 revenue” preview in your UI.
Default campaign parameters
Budget min/max
CTA suggestions
For the campaign creative editor:How recommendations interact with campaigns
A campaign is uniquely identified by(eid, tc, tc_run_id). When Affinity
re-runs (because the event’s data changed materially), the new run produces
new clusters with a new tc_run_id. Existing campaigns keep their old run
— that’s intentional, so an active campaign isn’t disrupted by a model
refresh.
In your UI:
- Lookout — read
clustersand show the latest run. - Wave — when starting a new setup, take the latest run and lock the
tc_run_idfor the duration of the wizard. When the user edits a running campaign, keep its existingtc_run_id.
Geo radius helper (Meta targeting)
For partners using Meta as the ad platform, Affinity also provides a radius suggestion:{ radius: <number> } — wire it into the location targeting widget
so the user starts from a sensible default.
Caveats
Affinity is per-event, not per-audience
Affinity is per-event, not per-audience
There is no “global audience” Affinity endpoint partners can call
independent of an event. Recommendations always live under
/events/{eid}/.Cluster set sizes vary across events
Cluster set sizes vary across events
Don’t hard-code “show top 5 clusters”. Some events have 3, some have 12.
Render whatever the API returns and let the user pick within it.
Cold-start events return empty clusters
Cold-start events return empty clusters
Newly-ingested events without enough historical signal return
clusters: [] until the platform finishes computing recommendations.
The reference webapp shows an empty-state with a “still computing”
message — mirror that.`metric_pred` is comparable within an event, not across events
`metric_pred` is comparable within an event, not across events
A 0.83 on one event doesn’t mean the same thing as 0.83 on another. Don’t
rank events by their clusters’ scores.