Attribution is how Future Demand connects observed sales to the campaigns that drove them. For Lookout / Wave integrations there is one attribution surface partners care about: per-event campaign results via the Meta integration endpoint. For the conceptual model, see also Campaigns.

Reading campaign results

The reference webapp reads campaign performance from the Meta integration endpoint, not from the generic /campaign_results/ endpoint:
GET /integrations/facebook/events/{eid}/campaign_results
GET /integrations/facebook/events/{eid}/fb_insights
Partner scope comes from the X-Preferred-Partner-Id header — there is no partner_id query parameter on this endpoint. Response shape:
{
  "event_results":  { ... },
  "series_results": { ... }
}
(The generic GET /campaign_results/ exists in the OpenAPI spec but is not used by the reference webapp and may return an authorization error when called by partners. Don’t rely on it.)

Attribution model

Each event has an attribution-model setting that controls how observed sales are credited to campaigns vs. organic vs. external sources:
GET /events/{eid}/attribution_model
PUT /events/{eid}/attribution_model
{ "model": "FD" | "META" | "EXTERNAL" }
Switching the model triggers a refetch of campaign_results and fb_insights on the Wave Statistics tab and updates the daily revenue chart on Lookout. Both surfaces share an attribution-model context. The partner-level default comes from GET /partners/attribution_model_default (also cached in browser storage).

Where it appears in the UI

SurfaceWhat it showsSource
Wave campaign detail → Statistics tabPer-campaign revenue, purchases, spend, ROAS.GET /integrations/facebook/events/{eid}/campaign_results + /fb_insights
Lookout event detail → Daily revenue chartSales over time with manual adjustments overlay.GET /daily_revenue_summary/
Lookout sales editManual transaction-summary entry.POST /ingest/transaction_summary
The platform runs the underlying attribution job on its own schedule — there is no partner-callable trigger.

Common gotchas

The reference webapp reads from /integrations/facebook/events/{eid}/campaign_results. The generic /campaign_results/ endpoint is not in use and returns auth errors for non-admin tokens.
Partner scope flows through X-Preferred-Partner-Id. Don’t add partner_id as a query param.
Changing FD / META / EXTERNAL invalidates campaign_results and fb_insights — your UI should refetch on toggle.
Non-Meta-integrated partners may receive empty objects. Render an empty state rather than treating empty as an error.