Playbook: Destination Customized Inputs for Event Impact Report (Advisor)
What this produces: a per-event and portfolio projection of direct visitor spending and tax generation across the destination's event calendar, calculated with their own rates and assumptions rather than platform defaults. Optionally rolled up into a venue-level view.
Surface: Compass Advisor, used by a destination logged into their own Playeasy profile.
What this produces: a per-event and portfolio projection of direct visitor spending and tax generation across the destination's event calendar, calculated with their own rates and assumptions rather than platform defaults. Optionally rolled up into a venue-level view.
What it is not: an economic impact study. No multiplier, no indirect or induced effects. It is a conservative, preliminary projection of direct spending.
The model — read this before anything else
Three groups. Everyone at an event spends something — the questions are how much, and whether they paid for a hotel bed.
|
Group |
Who they are |
Rate |
Basis |
|
Local residents |
Live in the destination |
LocalResidentSpend — default $22 / day |
Per person, per day |
|
Overnight travelers |
Non-local, staying in a hotel |
OvernightTravelerDaily — default $150 / day |
Per person, per day |
|
Day travelers |
Non-local, no hotel |
DayTravelerDaily — default $79 / day |
Per person, per day |
The overnight rate covers lodging plus food, retail and everything else. The day rate covers everything a non-local spends except lodging. The local rate is deliberately smaller — a resident isn't traveling or lodging, but does spend on parking, concessions, retail and incidentals for each day they attend.
All three shares are derived from hotel rooms by default
This is the core mechanic of the whole model, and it needs no percentage typed in by anyone. Hotel rooms tell you how many people are staying overnight. What's left over splits between local residents and day travelers based on how big that leftover group is relative to the whole crowd — a large non-overnight group relative to attendance reads as mostly local; a small one reads as mostly day-trip.
OvernightTravelers = min(TotalAttendees, HotelRoomsPerNight × 2.5) (0 when Nights = 0)
OvernightShare = OvernightTravelers ÷ TotalAttendees
NonOvernight = TotalAttendees − OvernightTravelers
LocalResidents = NonOvernight × (1 − OvernightShare)
DayTravelers = NonOvernight × OvernightShare
Read what this does at the extremes:
- Zero hotel rooms → 100% local residents. OvernightTravelers = 0, OvernightShare = 0, so every non-overnight attendee defaults to local. A single-day 5K with no room block is a neighborhood event by default, not a tourism draw.
- Rooms cover the whole crowd → close to 100% overnight. OvernightShare approaches 1, so almost nothing is left to split between local and day-trip.
- A modest room block relative to a big crowd → weighted toward local. A 1,000-person event with 50 rooms/night has an OvernightShare of 12.5%, so most of the non-overnight 875 people default to local rather than day-trip.
- A. Provide it event by event — list the events with gaps and type in participants, spectators and rooms for each.
- B. Provide one set of figures for all events — one participants/spectators/rooms figure applied uniformly across every gapped event.
- C. Let Advisor assume — rooms default to (0.40 × Participants) + (0.10 × Spectators) wherever participants and spectators are known; where those are also missing, default to the median among this pull's events that do have real figures, named explicitly as a borrowed median.
- A. Provide the split yourselves — % Local Residents, % Day Travelers, % Overnight Travelers, either per event or one blended split applied across all of them.
- B. Let Advisor derive it from the rooms already gathered — the default mechanic above: hotel rooms decide the overnight count, and the leftover splits toward local or day-trip based on how large that leftover is relative to the crowd.
- Any event whose PeoplePerRoom falls outside roughly 1.5–4 — name the two figures in tension.
- Any single-day event with a sizeable estimated room demand (say, over 50 rooms/night) that is defaulting to 100% local because Nights = 0. That's the model working as designed, but confirm with one question: do teams for this event typically travel in the night before? If yes, that changes Nights to 1 and reopens the room-derived split for that event — recompute it, don't just override the percentages by hand while leaving Nights = 0.
- A. Room Rate / ADR — default $116. Keep it, or provide your own?
- B. Lodging Tax % (TDT or bed tax) — default 6%. Keep it, or provide your own?
- C. Sales Tax % (state + any local surtax) — default 6%. Keep it, or provide your own?
- D. Other Tax % and Flat Tax Per Room Night, if any — both default to $0.
- E. Any change to the default spending rates — Day Traveler $79 / Overnight Traveler $150 / Local Resident $22?
- Full impact — the whole event credited to each venue it ran at. Columns sum to more than the portfolio total, by design.
- Adjusted impact — the event split evenly across its venues. Columns sum to the portfolio total.
Every one of these is a default, not a fact, and every one is editable per event. A destination that knows a specific event draws heavily from out of state even with few hotel rooms booked should override it — the room-derived split is a reasonable starting point, not a claim about who actually showed up.
People per room is the other half of the mechanism
PeoplePerRoom = OvernightTravelers ÷ HotelRoomsPerNight (n/a when Nights = 0)
This runs forward, to produce the default above at a target of 2.5 people per room. It also runs backward as a check: if the destination overrides any of the three shares, recompute occupancy from the resulting overnight count and flag anything outside roughly 1.5 to 4. Outside that band, the override and the room count disagree — name which two figures are in tension and ask.
Defaults — apply these, then let the destination change any of them
Present every table with these already applied. The destination edits what they disagree with, per event or across the board. Nothing on this list is a required question.
|
Input |
Default |
|
Overnight Traveler Daily Spending |
$150 / person / day |
|
Day Traveler Daily Spending |
$79 / person / day |
|
Local Resident Spending |
$22 / person / day |
|
% Local Residents / % Day Travelers / % Overnight Travelers |
derived per event from that event's rooms — see above |
|
Hotel Rooms Per Night |
from event_impact_estimate if present; otherwise (0.40 × Participants) + (0.10 × Spectators) |
|
People Per Room |
2.5 |
|
Room Rate / ADR |
$116 |
|
Lodging Tax % |
6% |
|
Sales Tax % |
6% |
|
Other Tax %, Flat Tax Per Room Night |
0 |
|
Days |
event date span, inclusive |
|
Nights |
Days − 1 |
Say the defaults are defaults, once, plainly:
These are default assumptions, not fixed values — change any of them and I will re-run. Right now every event is using $150/day for overnight travelers, $79/day for day travelers, and $22/day for local residents, a $116 average room rate, and 6% for both lodging tax and sales tax, with the local/day/overnight split worked back from each event's hotel rooms.
There is no input on this list that should ever fall back to $0 for lack of a stated default. Room Rate, Lodging Tax and Sales Tax all have real defaults now specifically so that "use default assumptions" has something to apply — treating an unspecified rate as $0 understates every event and is never the right fallback.
Never present a defaulted figure as though it came from the event record. Asterisk it, and name what was defaulted in one line under the table it appears in.
How to run this
The destination is already resolved. The user is inside Advisor, on their own profile. Do not ask which destination, do not run a destination search, do not ask for a destinationId. Start at Step 1.
Do not open with caveats about missing data. Playeasy supplies event names, venues, dates, participants and spectators, and sometimes hotel rooms. It does not supply spending rates, ADR, or tax rates — but all three now have stated defaults, so this is never a reason to ask before showing something. That is the expected design of this workflow, not a limitation to flag.
Do not tell the user that data is missing from Playeasy, that figures will be "calculated by the AI," or any variation. Pull what the tools have, apply the defaults, and ask only for what the destination might reasonably want to change.
Ask questions as a stacked, lettered list. Every question goes on its own line, as its own bullet, prefixed with a letter:
A. First question
B. Second question
C. Third question
Each item starts on a new line. Never run lettered items together in a paragraph.
Do flag internal contradictions. If an override makes overnight travelers exceed total attendees, if the resulting people-per-room falls outside 1.5–4, or if an event would compute to an unexpectedly small or large number, say so and ask — before running the numbers, not after.
Four content steps, each building on the last, and each with its own grid: attendance and rooms first; who those attendees are second; the money last. Don't collapse them — asking for tax rates before the destination has seen the visitor-mix grid means they're approving numbers they haven't seen yet.
Step 1 — Get the timeframe
Ask for the date range first. Recommend one month or less per run — a longer window returns too many events to review carefully and produces a total nobody can audit.
Step 2 — Pull attendance and rooms, and close the gaps
This takes two calls, and both are required.
2a. Get the event list — names, types, venues, dates.
profile_search Event mode: Audit
eventFilter: { startDate, endDate, timeframe: "Any" }
Set timeframe: "Any" explicitly. The default is Upcoming, which silently drops past events and returns a short list that looks perfectly reasonable.
2b. Get participants, spectators and hotel rooms — from the impact tool, not the event search.
event_impact_estimate
searchFilter: { startDate, endDate }
profile_search does not return participant counts, spectator counts, or hotel room blocks. Those fields are private on the event record and the search tool will never surface them, no matter which mode is used. event_impact_estimate is the only path to them: it returns them for the events it can price, and lists whatever is missing under incompleteEvents with an incompleteFields array naming the gaps.
Never fall back to estimating attendance because the event search came back empty on those fields. That is not missing data; it is the wrong tool. Call event_impact_estimate and take the real numbers before defaulting anything.
Match the two responses on event id, then merge.
Combine multi-venue events
Playeasy publishes one page per venue. A tournament across three facilities appears as three rows carrying the same totals on each row — the organizer entered the whole event's figures on every venue page.
Group rows sharing a name and date range into one event. Take participants, spectators and hotel rooms per night once. Never sum across duplicate rows.
Keep every venue name — needed for the venue rollup.
Derive days and nights
Days = event date span, inclusive (Oct 3–4 = 2 days)
Nights = Days − 1 (Oct 3–4 = 1 night)
Present the attendance grid
|
Event |
Type |
Venues |
Participants |
Spectators |
Rooms/Night |
Nights |
Type is the event's category and level from Playeasy — tournament, championship, game, race, and so on, plus amateur/youth/professional where available.
Any gap in Participants, Spectators, or Rooms/Night is filled before moving on. Show the grid with gaps visibly blank or asterisked, then offer, as a lettered list:
Update the grid with whatever they choose. Nothing here writes back to Playeasy.
Step 3 — Get the visitor mix
With attendance and rooms settled, the next question is who these attendees are — not the destination's tax rates, not ADR. Keep this step entirely about people, and don't let ADR or tax questions creep in here.
Ask, as a lettered list:
If B, or if the destination doesn't answer this step at all, apply the default and present the result. If A, take their percentages, confirm they sum to 100%, and recompute PeoplePerRoom as a check.
Present the derived (or provided) mix as its own grid, separate from the attendance grid:
|
Event |
Total Attendees |
% Local |
% Day |
% Overnight |
Local |
Day |
Overnight |
Ppl/Room |
Asterisk anything defaulted rather than supplied.
Flag contradictions here, before moving on:
Step 4 — Get ADR and tax rates
Everything about who the attendees are is settled. This step is only about money. Ask as a lettered list:
Offer the same shapes as earlier steps where they apply: one set of figures for all events, individually per event, or keep the defaults shown — and if the destination says nothing more specific than "use the defaults," that means $116 / 6% / 6% / $79 / $150 / $22, never $0 for anything on this list.
Step 5 — Calculate and present
The formula
TotalAttendees = Participants + Spectators
HotelRoomsPerNight = on file, else defaulted per Step 2
TotalRooms = HotelRoomsPerNight × Nights
# Default three-way split, derived from this event's own rooms (Step 3):
OvernightTravelers = min(TotalAttendees, HotelRoomsPerNight × 2.5) (0 when Nights = 0)
OvernightShare = OvernightTravelers ÷ TotalAttendees
NonOvernight = TotalAttendees − OvernightTravelers
LocalResidents = NonOvernight × (1 − OvernightShare)
DayTravelers = NonOvernight × OvernightShare
# If the destination overrides any share directly, take their numbers and re-check occupancy:
PeoplePerRoom = OvernightTravelers ÷ HotelRoomsPerNight (flag outside 1.5–4)
LocalSpending = LocalResidents × Days × LocalResidentSpend
DaySpending = DayTravelers × Days × DayTravelerDaily
OvernightSpending = OvernightTravelers × Days × OvernightTravelerDaily
VisitorSpending = LocalSpending + DaySpending + OvernightSpending
LodgingRevenue = TotalRooms × ADR
LodgingTaxGenerated = (LodgingRevenue × LodgingTaxPct) + (TotalRooms × FlatRoomTax)
SalesTaxGenerated = VisitorSpending × SalesTaxPct
OtherTaxGenerated = VisitorSpending × OtherTaxPct
TotalEstimatedSpending = VisitorSpending
+ LodgingTaxGenerated
+ SalesTaxGenerated
+ OtherTaxGenerated
# The three-way spend breakout shown in the report — reporting only, changes nothing above:
HotelSpend = LodgingRevenue
LocalSpend = LocalSpending
TravelerSpend = VisitorSpending − HotelSpend − LocalSpend (day + overnight, non-lodging)
HotelSpend + LocalSpend + TravelerSpend = VisitorSpending, always, exactly. LodgingRevenue was already being calculated as the tax base; it's also the one figure in this model that is unambiguously money paid to a hotel for a room, so it becomes Hotel Spend without further adjustment.
If HotelSpend alone exceeds VisitorSpending, TravelerSpend would go negative. That's a contradiction — flag it and ask which input is off.
Seven errors the formula is built to prevent
The rate is chosen by residency first, then by whether the attendee books a hotel. Nothing else selects a rate — not event reach, not sport, not event size.
All three shares default from the room count, never from a flat guess. Zero rooms defaults an event to 100% local. A thin room block relative to attendance defaults heavily local, not evenly split.
Zero nights means zero overnight travelers, full stop. A large estimated room demand on a single-day event does not create overnight travelers; it's a signal to ask whether the night count itself is wrong.
People per room is calculated, never assumed. Outside roughly 1.5–4, the room count and the split disagree — flag it.
Lodging revenue is never added on top of Visitor Spending. TotalRooms × ADR is the tax base and, for reporting, the Hotel Spend piece of Visitor Spending already computed. Adding it again double-counts every room.
Days drive spending, nights drive lodging. A one-day event has 0 nights but a full day of attendee spending.
ADR and both tax rates have real defaults, so none of them silently becomes $0. "Use default assumptions" means $116 ADR and 6%/6% tax, never a rate that was never actually specified defaulting to nothing.
Verification case
Day $79 · Overnight $150 · Local $22 · ADR $116 · Lodging 6% · Sales 6% · 4 days · 4 nights · 156 participants · 234 spectators · 125 rooms/night · 2.5 people/room
|
Step |
Calculation |
Result |
|
Total attendees |
156 + 234 |
390 |
|
Overnight travelers |
min(390, 125 × 2.5) |
312.5 |
|
Overnight share |
312.5 ÷ 390 |
80.1% |
|
Non-overnight |
390 − 312.5 |
77.5 |
|
Local residents (derived) |
77.5 × (1 − 80.1%) |
15.4 |
|
Day travelers (derived) |
77.5 × 80.1% |
62.1 |
|
People per room (check) |
312.5 ÷ 125 |
2.5 ✓ in range |
|
Local spending |
15.4 × 4 × $22 |
$1,355.26 |
|
Day spending |
62.1 × 4 × $79 |
$19,623.40 |
|
Overnight spending |
312.5 × 4 × $150 |
$187,500.00 |
|
Visitor Spending |
|
$208,478.65 |
|
Lodging revenue |
500 × $116 |
$58,000.00 |
|
Lodging Tax Generated |
$58,000 × 6% |
$3,480.00 |
|
Sales Tax Generated |
$208,478.65 × 6% |
$12,508.72 |
|
Total Estimated Spending |
|
$224,467.37 |
|
— |
|
|
|
Hotel Spend |
= Lodging revenue |
$58,000.00 |
|
Local Spend |
= Local spending |
$1,355.26 |
|
Traveler Spend |
$208,478.65 − $58,000 − $1,355.26 |
$149,123.40 |
The report
Two tables, same events, same order.
The full record:
|
Event |
Type |
Venues |
Days |
Nights |
Participants |
Spectators |
Local |
Day |
Overnight |
Ppl/Room |
Total Rooms |
Visitor Spending |
Lodging Tax |
Sales Tax |
Total Impact |
Asterisk any figure that came from a default rather than the event record or the destination's own input.
The spend breakout:
|
Event |
Hotel Spend |
Local Spend |
Traveler Spend |
Total Estimated Spending |
Hotel Spend + Local Spend + Traveler Spend = Total Estimated Spending − taxes on every row.
Then the portfolio total for both tables, stated with the destination name, date range, and pull date.
Step 6 — Offer the venue rollup
After presenting the event report, ask:
Would you like this rolled up into a venue impact report — the same figures organized by the venues hosting them?
If yes, attribute each event's impact to its venues. Multi-venue events need two figures:
|
Venue |
Events |
Full Impact |
Adjusted Impact |
Show both and say plainly which one sums to the portfolio total. A venue where the two diverge sharply hosts shared tournaments — that gap is information, not a discrepancy to reconcile away.
Rules that do not bend
- Attendance and room figures come from event_impact_estimate, never from profile_search. Pull them before defaulting anything.
- Never sum duplicate venue rows. Take the event's figures once.
- Attendance and rooms, then visitor mix, then money — in that order, in separate steps. Don't ask about tax rates before the destination has seen the visitor-mix grid.
- Local, day, and overnight are the only three groups, and they sum to 100% of attendees. All three default from the room count.
- Zero hotel rooms defaults an event to 100% local residents. Zero nights means zero overnight travelers regardless of estimated room demand.
- A thin room block relative to attendance defaults heavily local, not evenly split.
- ADR and both tax rates have real defaults — $116, 6%, 6%. Nothing on the defaults list ever falls back to $0 for lack of a stated figure.
- Hotel Spend is TotalRooms × ADR, exactly, every time. Local Spend and Traveler Spend are read off the same calculation as Visitor Spending, never re-derived separately.
- People per room is calculated, never assumed. Outside roughly 1.5–4, flag the two figures in tension.
- Days for spending, nights for lodging.
- Absent is not zero. A field with no value means no value exists.
- Participants and spectators are organizer estimates, not verified attendance.
- Nothing writes back to Playeasy.
- Date every figure. Re-run rather than reusing an old pull.
- Defaulted figures are asterisked on their own row, not explained in a preamble.
- Questions are always a stacked, lettered list — one item per line.
- This is a conservative, preliminary projection of direct spending — never an economic impact study.
Tool reference
|
Need |
Call |
|
Event names, types, venues, dates |
profile_search Event mode: Audit eventFilter: { startDate, endDate, timeframe: "Any" } |
|
Participants, spectators, hotel rooms |
event_impact_estimate searchFilter: { startDate, endDate } — the only source; profile_search never returns these |
|
One event in detail |
profile_details Event id |
|
Rooms actually booked through Playeasy |
profile_report Destination Hotels startDate endDate |
On measured bookings. profile_report Hotels returns rooms booked through Playeasy — a verified floor, not total pickup.
On event_impact_estimate. Playeasy's own calculator, built on the Sports Facilities Companies methodology. It is the right tool when a destination wants the platform's modeling as given. This playbook is for the other case — a destination running its own coefficients.