Insights & forecasts
Predictive and comparative insight endpoints built on your venues’ own
history. Every endpoint is operator (client role) and scoped to venues
you can access with scope - either one venue id, or all to combine every
venue you can access. Most of this page needs the Advanced BI add-on
(bi_advanced); each endpoint that does is marked below. Forecasts are
statistical estimates with an 80% confidence range, not guarantees - treat
them as a planning aid.
Endpoints
Section titled “Endpoints”| Method | Path | Purpose | Auth |
|---|---|---|---|
| GET | /api/my-operator/demand-forecast |
Predicted covers/bookings, 1-8 weeks ahead | operator, Advanced BI |
| GET | /api/my-operator/revenue-forecast |
Predicted revenue, 1-8 weeks ahead | operator, Advanced BI |
| GET | /api/my-operator/staffing-plan |
Suggested headcounts from the demand forecast | operator, Advanced BI |
| GET | /api/my-operator/noshow-forecast |
Per-booking no-show risk for an upcoming window | operator, Advanced BI |
| GET | /api/my-operator/deposit-whatif |
Simulate the effect of a deposit amount | operator, Advanced BI |
| GET | /api/my-operator/churn-forecast |
Guests ranked by risk of lapsing | operator, Advanced BI |
| GET | /api/my-operator/forecast-accuracy |
How accurate recent forecasts have been | operator, Advanced BI |
| GET | /api/my-operator/forecast-coverage |
How much history is available to forecast from | operator, Advanced BI |
| GET | /api/my-operator/ml-predictions |
Raw prediction feed behind the forecasts above | operator, Advanced BI |
| GET | /api/my-operator/network-benchmarks |
Compare your metrics to an anonymised peer group | operator, Advanced BI |
| GET | /api/my-operator/anomalies |
Metrics that moved significantly this week | operator |
| GET | /api/my-operator/proactive-alerts |
Preview this week’s proactive alert | operator |
| GET | /api/my-operator/weekly-digest |
Preview a venue’s weekly email digest | operator |
| GET | /api/my-operator/insights/rules |
List your custom alert rules | operator |
Guest-level predictions (attendance, cancellation, lifetime value) are a separate, guest-scoped endpoint - see A guest’s predicted attendance and lifetime value.
Demand, revenue and staffing
Section titled “Demand, revenue and staffing”GET /api/my-operator/demand-forecast and GET /api/my-operator/revenue-forecast predict covers and revenue per venue per
service window for weeks ahead (1-8, default 4), each with an 80%
confidence range. GET /api/my-operator/staffing-plan turns the demand
forecast into a suggested front-of-house/kitchen headcount per venue, day
and service window - add format=print for a printable HTML roster, or
format=csv to download one as a file.
curl "https://thesidedoor.co/api/my-operator/demand-forecast?weeks=4&scope=all" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"const res = await fetch( "https://thesidedoor.co/api/my-operator/demand-forecast?weeks=4&scope=all", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` } },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-operator/demand-forecast?weeks=4&scope=all");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],]);$data = json_decode(curl_exec($ch), true);{ "venues": [ { "venue_id": "ven_123", "forecast": [{ "week_of": "2026-07-13", "covers": 410, "range": [360, 460] }], "context": { "holidays": [], "school_breaks": [] } } ], "action": { "venue_id": "ven_123", "note": "Tuesday looks quiet next week" }}Without the Advanced BI add-on, these return { "entitled": false, "addon": "bi_advanced" } instead of a 403.
No-shows and deposits
Section titled “No-shows and deposits”GET /api/my-operator/noshow-forecast scores each upcoming booking (within
days, default 14) by no-show risk, with a summary per venue. GET /api/my-operator/deposit-whatif simulates what would happen if you required
a deposit of depositPence (default 2500) over the next days: projected
no-shows avoided, revenue protected and deposits captured.
curl "https://thesidedoor.co/api/my-operator/noshow-forecast?days=14&scope=all" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"
curl "https://thesidedoor.co/api/my-operator/deposit-whatif?depositPence=2500&days=14" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"const noshow = await fetch( "https://thesidedoor.co/api/my-operator/noshow-forecast?days=14&scope=all", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` } },).then((r) => r.json());
const whatIf = await fetch( "https://thesidedoor.co/api/my-operator/deposit-whatif?depositPence=2500&days=14", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` } },).then((r) => r.json());$ch = curl_init("https://thesidedoor.co/api/my-operator/noshow-forecast?days=14&scope=all");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],]);$noshow = json_decode(curl_exec($ch), true);{ "bookings": [{ "id": "bkg_9a1", "venue_id": "ven_123", "risk_pct": 34, "tier": "medium" }], "summary": { "upcoming": 120, "high": 6, "medium": 18, "low": 96, "expectedNoShows": 11 }}{ "before": { "expected_noshows": 11, "revenue_at_risk_pence": 198000 }, "after": { "expected_noshows": 4, "deposit_captured_pence": 300000 }, "uplift_pence": 110000}Guest names are only included in noshow-forecast for callers with the
analytics.pii permission - without it, rows carry the risk data only.
Guest loyalty forecast
Section titled “Guest loyalty forecast”GET /api/my-operator/churn-forecast ranks your regular guests (3+ visits by
default, tune with minVisits) by how likely they are to lapse, with a “why”
and a projected value at risk if they do.
curl "https://thesidedoor.co/api/my-operator/churn-forecast?minVisits=3&limit=100" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"const res = await fetch( "https://thesidedoor.co/api/my-operator/churn-forecast?minVisits=3&limit=100", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` } },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-operator/churn-forecast?minVisits=3&limit=100");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],]);$data = json_decode(curl_exec($ch), true);{ "guests": [{ "id": "usr_abc", "status": "at_risk", "lapse_probability": 0.42, "value_at_risk_pence": 24000 }] }Guest names and contact details are only included for callers with the
analytics.pii permission; everyone else sees the scores without identity.
Forecast quality
Section titled “Forecast quality”GET /api/my-operator/forecast-accuracy reports how close recent forecasts
came to what actually happened, per venue. GET /api/my-operator/forecast-coverage reports how much usable booking history
exists to forecast from. Both flag a venue as not having enough history yet
rather than guessing - useful to check before you lean on the forecasts
above for a brand-new venue.
curl "https://thesidedoor.co/api/my-operator/forecast-coverage?scope=all" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"const res = await fetch( "https://thesidedoor.co/api/my-operator/forecast-coverage?scope=all", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` } },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-operator/forecast-coverage?scope=all");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],]);$data = json_decode(curl_exec($ch), true);{ "venues": [{ "venue_id": "ven_123", "days_covered": 210, "tier": "ready" }], "summary": { "ready": 2, "limited": 1, "cold": 0, "none": 0 }}Raw prediction feed
Section titled “Raw prediction feed”GET /api/my-operator/ml-predictions returns the underlying per-booking,
per-guest and per-venue-day predictions that feed the forecasts above, as a
flat list - useful if you want the raw records rather than one of the
friendlier views. Filter with model (demand, revenue, noshow,
churn or ltv) and scope.
curl "https://thesidedoor.co/api/my-operator/ml-predictions?model=demand&scope=all" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"const res = await fetch( "https://thesidedoor.co/api/my-operator/ml-predictions?model=demand&scope=all", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` } },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-operator/ml-predictions?model=demand&scope=all");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],]);$data = json_decode(curl_exec($ch), true);{ "predictions": [{ "model": "demand", "venue_id": "ven_123", "date": "2026-07-14", "value": 410 }], "runs": [{ "model": "demand", "trained_at": "2026-07-13T04:00:00Z" }]}Network benchmarks
Section titled “Network benchmarks”curl "https://thesidedoor.co/api/my-operator/network-benchmarks?scope=all" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"const res = await fetch( "https://thesidedoor.co/api/my-operator/network-benchmarks?scope=all", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` } },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-operator/network-benchmarks?scope=all");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],]);$data = json_decode(curl_exec($ch), true);{ "venues": [ { "venue_id": "ven_123", "metrics": { "no_show_rate": { "yours": 0.06, "p25": 0.04, "p50": 0.08, "p75": 0.12, "verdict": "better" } }, "sufficient": true } ], "optedOut": false}Anomalies, alerts and digests
Section titled “Anomalies, alerts and digests”GET /api/my-operator/anomalies flags metrics that moved significantly
this week, with a likely driver; add ?explain=1 for a plain-English
narrative (uses your Aimy allowance). GET /api/my-operator/proactive-alerts
previews the proactive alert that would be sent right now, if any. GET /api/my-operator/weekly-digest?venue_id= previews a venue’s weekly email
report. None of these three need the Advanced BI add-on.
curl "https://thesidedoor.co/api/my-operator/anomalies?scope=all" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"const res = await fetch( "https://thesidedoor.co/api/my-operator/anomalies?scope=all", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` } },);const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-operator/anomalies?scope=all");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],]);$data = json_decode(curl_exec($ch), true);{ "coldStart": false, "anomalies": [{ "metric": "covers", "venue_id": "ven_123", "change_pct": -18, "likely_driver": "weather" }] }A venue with nothing unusual this week returns an empty anomalies array,
and proactive-alerts/weekly-digest return { "alerting": false } /
{ "coldStart": true, "report": null } rather than an error.
Custom alert rules
Section titled “Custom alert rules”GET /api/my-operator/insights/rules lists the custom alert rules you’ve
set up - each watching one metric against a threshold, with the message and
recommendation it fires when triggered.
curl "https://thesidedoor.co/api/my-operator/insights/rules" \ -H "Authorization: Bearer $SIDEDOOR_TOKEN"const res = await fetch("https://thesidedoor.co/api/my-operator/insights/rules", { headers: { Authorization: `Bearer ${process.env.SIDEDOOR_TOKEN}` },});const data = await res.json();$ch = curl_init("https://thesidedoor.co/api/my-operator/insights/rules");curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],]);$data = json_decode(curl_exec($ch), true);{ "rules": [ { "id": "rule_1", "title": "Revenue drop", "metric": "revenue", "period": "week", "cmp": "lt", "threshold": -15, "severity": "high", "recommendation": "Check for a cancelled event or venue closure" } ]}