Attribution is how Future Demand connects observed sales to the campaigns
or audience packages that drove them. Two surfaces:
- Campaign attribution — sales adjustments tied to a specific event’s
campaigns. Visible in Lookout (event detail) and Wave (campaign detail).
- Backhaul attribution — package-level evaluation: which package
segments converted, and at what rate.
Campaign attribution
Each post-campaign attribution result is a “sales adjustment” row attached
to an event.
| Action | Endpoint |
|---|
| List adjustments for an event | GET /campaign_results/?eid=&partner_id= |
| Create one | POST /campaign_results/?eid=&partner_id=&purchase=&revenue= |
| Delete one | DELETE /campaign_results/?id= |
[
{
"id": "cr_xyz",
"eid": "evt_abc123",
"partner_id": "partner-id-acme",
"purchase": 147,
"revenue": 6615,
"created_at": "2026-06-13T08:00:00Z",
"source": "automated"
}
]
The reference webapp surfaces this:
- On the Event detail page, as part of the daily revenue chart’s
manual_adjustments overlay.
- On the Wave campaign detail page, as the post-campaign performance card.
The platform runs the attribution job on its own schedule — there is no
partner-callable endpoint to trigger it. Consume the result endpoints
(/campaign_results/) instead.
Backhaul attribution (Package Builder)
Packages have their own attribution sub-lifecycle, scoped to one package.
| Action | Endpoint |
|---|
| Get current settings | GET /package_builder/packages/{id}/backhaul_evaluation_details |
| Update settings (triggers re-eval) | PUT /package_builder/packages/{id}/backhaul_evaluation_details |
| Read results | GET /package_builder/packages/{id}/backhaul_evaluation |
| Default settings for partner | GET /partners/{partner_id}/backhaul_attribution_details |
| Update partner defaults | POST /partners/{partner_id}/backhaul_attribution_details |
Settings payload
{
"backhaul_evaluation_attribution_window": 14,
"backhaul_evaluation_model": "ALL_PURCHASES",
"email_sent_date": "2026-06-01"
}
| Field | Values | Meaning |
|---|
backhaul_evaluation_attribution_window | integer (days) | Number of days after email_sent_date to count attributed purchases. |
backhaul_evaluation_model | ALL_PURCHASES, EVENTS_FROM_PACKAGE, EVENT_SERIES | Which purchases count: any purchase, only purchases of events in this package, or only purchases in the same event series. |
email_sent_date | YYYY-MM-DD | Anchor date — typically the day the partner sent the marketing communication using the package. Optional in partner-default settings. |
Results shape
{
"clusters": {
"family_outings_munich": {
"customers": 184,
"items": 412,
"purchase": 18540
},
"german_metal_diehards": {
"customers": 132,
"items": 287,
"purchase": 12915
}
}
}
Aggregate client-side for header KPIs (total customers / items / revenue).
Choosing an attribution model
For most live-events partners:
EVENTS_FROM_PACKAGE — the most defensible model. Only counts ticket
purchases for events that were actually in the package being evaluated.
EVENT_SERIES — useful when the package targeted a tour or recurring
fixture and you want to credit downstream dates in the same series.
ALL_PURCHASES — broadest model, useful for “halo effect” reporting
where the partner accepts that some attribution is coincidental.
The reference webapp lets the partner pick per package; default is set by
POST /partners/{partner_id}/backhaul_attribution_details.
Lookout attribution model
Independently of Backhaul, Lookout’s per-event view has its own attribution
selection:
GET /events/{eid}/attribution_model
PUT /events/{eid}/attribution_model
This controls how the event’s daily-revenue chart attributes incoming
ticket sales to campaigns vs. organic. It’s a per-event override on top of
the partner-level default.
Putting it together
Campaign published
│
│ delivery (Meta / Google / ...)
▼
Sales flow in (via /ingest/transaction_summary or live feeds)
│
│ attribution job runs (overnight or on demand)
▼
/campaign_results/ ← partner reads here for campaign view
/package_builder/.../backhaul_evaluation ← partner reads here for package view
The partner-side integration responsibilities are:
- Ingest sales data (if you’re not already feeding it from a live source).
- Set partner-level attribution defaults once.
- Per-package: optionally override the model, then poll for results.
- Read results into your reporting UI.
You do not orchestrate the attribution jobs themselves. The platform
runs them on a schedule.