The hierarchy
Why each level exists
Partner
Partner
The tenancy boundary. A partner has its own users, its own data, its
own integrations. Every authenticated call must carry
X-Preferred-Partner-Id to scope reads/writes — see
Partner & Client.Client
Client
A backend-side delivery target. In most partner integrations it is 1:1
with the partner; you usually don’t need to think about it. It surfaces
in
localStorage.partnerDetails.clientId in the reference webapp and in
a handful of admin endpoints, but the canonical handle is partner_id.Event
Event
The atom of demand. An event has a date, a venue, a capacity, a price
structure, and a sales curve. Lookout is “the view of all your events”;
Wave activates campaigns against an event. See Events.
Taste Cluster (tc)
Taste Cluster (tc)
A segment of likely buyers, computed by Affinity for one specific event.
Clusters are versioned by
tc_run_id — when an event’s data changes,
a new run produces a new set, but old campaigns keep their tc_run_id
for stability. See Recommendations.Setup Process
Setup Process
A per-event row that holds the Wave campaign configuration while you’re
editing it and after it’s published. The Wave wizard creates / updates /
publishes the setup process; campaigns are derived from it. See
Wave Campaigns Lifecycle.
Campaign
Campaign
The actual delivery unit. Each (event × taste cluster × tc_run) maps to
one campaign, identified by the composite
cid = {tc_run_id}__$ .What gets sent on each request
| Identifier | Where it lives | How it’s passed |
|---|---|---|
| User identity | Cognito AccessToken | Authorization: Bearer <token> |
| Partner | cognito:groups matching partner-id-* or fd\d+ | X-Preferred-Partner-Id: <partner-id> header |
| Event | URL path param | /events/{eid}/... |
| Taste cluster | URL path or body | /events/{eid}/{tc}/... or { "tc": "..." } |
| Campaign | Composite via tc_run_id | /campaigns/{eid}/{tc}/{tc_run_id}/... |
A worked example
A user belongs to two partners. They want to activate a Wave campaign for a concert at Olympiahalle.- Sign in → JWT carries
cognito:groups: ["partner-id-acme", "partner-id-beta"]. - UI shows a partner picker; user selects
partner-id-acme. SetX-Preferred-Partner-Id: partner-id-acmeon all subsequent requests. GET /events/returns Acme’s events. User clicks the concert (evt_abc).GET /events/evt_abc+GET /events/evt_abc/clusterspopulate Lookout. The clusters carry atc_run_idof42.POST /setup_processes/evt_abcstarts a Wave draft.PUT /setup_processes/evt_abcautosaves each edit (creative, targeting).POST /setup_processes/evt_abc/boostpublishes the campaigns. The platform creates one campaign per (evt_abc,<tc>,42).
setup_processes branch.
Where this breaks down
- Multi-partner users: if a user belongs to >1 partner, forgetting
X-Preferred-Partner-Idis the #1 source of “why is my data wrong” bugs. - Stale
tc_run_id: if you build a campaign against an old run, then refresh the event’s clusters, the new run gets a different id. Your campaign still references the old one — that’s intentional, but show the user that a newer recommendation is available. - Two API hosts: the main API and the Customer Representation API are two different hosts. Most calls hit the main API; EventEditor, Simulation, and bulk upload go to CR. See Two-host architecture.