The pages you’ll rebuild
| Page | What it shows | Guide |
|---|---|---|
| Dashboard | KPI scoreboard + upcoming events panel. | Dashboard |
| Events list | Filterable, paginated list of all events with status badges and the demand benchmark. | Events list |
| Event detail | Full event view: hero, stats, sales graph, daily revenue, ticket categories, taste clusters. | Event detail |
| Event editor | Edit one event’s metadata (title, venue, lineups, …) and optionally trigger a recommendation refresh. | Event editor |
| Bulk event upload | CSV/XLSX bulk import for ingesting many events at once. | Bulk event upload |
| Sales uploads | Per-event manual sales ingest + generic file uploads. | Sales uploads |
| Simulation | Create a synthetic event to probe model behaviour. Optional, feature-flagged. | Simulation |
Recommended build order
Auth + Dashboard
Stand up authentication, the partner picker, and the
Dashboard. Three API calls. Lets you confirm the end-to-end loop.
Events list
Add the paginated, filter-driven list. The same
/events/ endpoint
powers Wave’s list too — investment compounds.Event detail
The heaviest page in Lookout — ~9 parallel GETs on mount. Build it once,
reuse the components in Wave’s campaign detail.
Mutations
Flag / archive / pause — the small set of state changes that need the
two-step CR API dance.
What you do not need to rebuild
- The platform admin surfaces (
/auth/users/csv_export,POST /partners/, …). Internal-only. - The “prompt registry” endpoints (
POST /prompts/...). Used for internal LLM tuning, not partner integrations. - Sentry/Redux/i18n plumbing the reference webapp uses. Use your own.
What’s tricky in Lookout
The “calibration data” you need to mirror behaviour exactly:- Two API hosts. Most calls hit the main API; EventEditor, Simulation,
bulk upload, and the second half of the status-update dance go to the
Customer Representation API (
cr_api). See CORS & two-host architecture. - Benchmark scale auto-detection. The benchmark payload comes back as fractions on some deployments and percentages on others — the reference webapp auto-detects.
- Repeated query params for arrays. Use
?city=A&city=B, notcity[]=or CSV. See Pagination. - The
formatApiEventnormalisation. The list view flattens benchmark into a different shape than the detail view. Don’t over-normalise.