What you’ll build
- Hero (title, date, venue, status pills, action menu).
- Event stats bar (Revenue / Purchases / Spent / ROAS / Active / Campaigns).
- Sales overview chart (benchmark vs prediction vs actuals).
- Daily revenue chart (with range and metric toggles).
- Taste clusters panel.
- Ticket categories chart + ticket type chart.
- Side actions: edit, flag, archive, add sales, clear sales, edit series.
Prerequisites
- An
eid(from the Events list row click or a deep link). - Tenant-level
partnerIdset in your client.
The call chain
All in parallel on mount unless noted:| # | Method | Path | Component | Purpose |
|---|---|---|---|---|
| 1 | GET | /events/{eid} | Hero | Title, date, venue, status, category, currency. 404 → redirect to 404 page. |
| 2 | GET | /integrations/facebook/events/{eid}/campaign_results | EventStatsProvider | Branch the layout between “has Meta stats” and “no stats”. |
| 3 | GET | /integrations/facebook/events/{eid}/fb_insights | EventStatsProvider | Impressions / clicks / ad spend. |
| 4 | GET | /events/{eid}/statistics | EventStatsBar | Per-event KPIs: revenue, purchases, spent, roas, currency, campaigns, active. |
| 5 | GET | /events/{eid}/benchmark | SalesOverview | { today/now, prediction, state }. Auto-detect fraction vs percent. |
| 6 | GET | /events/{eid}/sales-graph | SalesOverview | { sales: [{ mapped_date, norm_tickets_sold_current, norm_tickets_sold_avg }] }. |
| 7 | GET | /daily_revenue_summary/?event_id=¤cy=&start_date=1900-01-01&end_date=2100-01-01 | DailyRevenueChart | Daily revenue + manual adjustments. |
| 8 | GET | /events/{eid}/tickets | TicketCategories + TicketTypeChart | Fired twice — once per chart. Easy dedup win. |
| 9 | GET | /events/{eid}/clusters | TasteClustersPanel | Affinity clusters for this event. |
| 10 | GET | /events/{eid}/campaigns | TasteClustersPanel | Used only for suggested_creative keyword chips. |
| 11 | GET | /events/{eid}/attribution_model | EventAttributionModelContextProvider | Current attribution model. |
Payload — /events/{eid}/benchmark
0.78), some
return percentages (78). The reference webapp infers per response:
Payload — /events/{eid}/sales-graph
mapped_date is a normalised x-axis so multiple events can be compared on
the same time-to-event scale.
Payload — /daily_revenue_summary/
Reference implementation
tickets.data to both ticket charts to dedupe the call —
the reference webapp doesn’t do this and pays for it.
Status updates (flag / archive) — the two-step dance
Other interactions
| Interaction | API calls |
|---|---|
| Open in Wave | navigate to /campaigns/{eid} (no API) |
| Edit (event) | navigate to /events/edit/{eid} — see Event editor |
| Edit event series (modal) | GET /events/{eid}/series?limit=1000; GET /events/{eid}/available_events_for_series?limit=1000; save via POST /events/{eid}/series?event_series=...&event_series=...; remove via DELETE /events/{eid}/series?event_series=... |
| Add sales (manual) | navigate to /events/{eid}/update-sales/salesSummary — see Sales uploads |
| Add sales (file) | navigate to /events/{eid}/update-sales/documentUpload — see Sales uploads |
| Clear sales | DELETE /daily_revenue_summary?eid={eid} |
| Toggle flagged | setFrontendStatus(eid, "FLAGGED" | "DEFAULT") |
| Archive | setFrontendStatus(eid, "HIDDEN") then redirect to /events |
| Range / metric toggles | none (client-side only) |
Gotchas
~9 GETs in parallel on mount
~9 GETs in parallel on mount
Fire them all in parallel — sequencing them is the easiest way to make
this page slow. HTTP/2 keeps the cost reasonable, but if your client
serialises requests by accident (an
await in the wrong place), you’ll
see it immediately.`/events/{eid}/tickets` is fired twice
`/events/{eid}/tickets` is fired twice
Once per chart. Pass the data through context or dedupe via your
request cache. This is the single easiest perf win over the reference
webapp.
Benchmark percent vs fraction
Benchmark percent vs fraction
Apply the scale heuristic on every response; don’t cache the inferred
factor across events.
404 → redirect, not error toast
404 → redirect, not error toast
A
GET /events/{eid} 404 means the user typed a bad URL or the event
was hard-deleted. Redirect to a 404 page rather than showing an inline
error — the reference webapp does <Redirect to="/404">.Facebook integration calls are always fired
Facebook integration calls are always fired
Even for non-Meta partners. Don’t try to suppress them — handle the
empty/404 response gracefully.
Related
- Events list — the page above.
- Event editor — what the Edit menu opens.
- Sales uploads — Add sales actions.
- Recommendations concept — for the TasteClustersPanel.
- Wave campaign detail — reuses this page.