swarmtix_analytics_event
Sales and traffic figures for one event — revenue, tickets sold, refunds, visits and the daily series behind them
swarmtix_analytics_event
Returns the sales and traffic figures for one event: revenue, tickets sold against capacity, complimentary and door sales, refunds, unique page visits, and the daily series behind them. Totals only — no attendee or buyer names.
When you would reach for it
- "How is this event selling?" — the single call that answers it.
- To see the sales curve, not just the total, when deciding whether to push a campaign.
- To compare tiers —
salesByTicketTypebreaks the total down. - When you want numbers without personal data. This tool is the answer to most sales questions and it reads no names at all.
Unlike swarmtix_tickets_summary, omitting the date here covers every date of the event.
Scope
analytics:read
This tool deliberately omits the attendee and order previews. The record behind it also carries short previews of real attendees and orders, with names on them. Returning those would put customer names behind a scope whose consent sentence promises figures and says nothing about reading anybody's name.
The tools that do return names are the order and attendee tools, behind the scopes whose consent text says so. This is a privacy guarantee, not a missing feature.
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
event | string | Yes | — | The event's id (a GUID) or its URL slug. |
eventDate | string | No | every date | Limit the figures to one scheduled date, by its id from swarmtix_event_dates_list. |
Example call
{
"name": "swarmtix_analytics_event",
"arguments": { "event": "spring-summit-2026" }
}What comes back
{
"eventId": "8f14e45f-ceea-467a-9c3d-1b2a5f6e7d80",
"eventName": "Spring Summit 2026",
"currency": "EUR",
"currencySymbol": "€",
"totalRevenue": 14235.5,
"ticketsSold": 316,
"ticketsAvailable": 450,
"complimentaryTickets": 12,
"soldAtDoorCount": 4,
"soldAtDoorRevenue": 180,
"refundedAmount": 225,
"refundedAmountToday": 0,
"uniqueVisits": 5821,
"uniqueVisitsToday": 137,
"lastTicketSoldAt": "2026-10-28T14:22:09",
"salesByTicketType": [
{ "ticketType": "General Admission", "sold": 182, "available": 300 },
{ "ticketType": "Workshop Add-on", "sold": 134, "available": 150 }
],
"dailySales": [
{ "day": "2026-10-26", "ticketsSold": 18 },
{ "day": "2026-10-27", "ticketsSold": 24 },
{ "day": "2026-10-28", "ticketsSold": 31 }
],
"dailyVisits": [
{ "day": "2026-10-26", "visits": 402 },
{ "day": "2026-10-27", "visits": 511 },
{ "day": "2026-10-28", "visits": 137 }
]
}| Field | What it is |
|---|---|
eventId, eventName | The event |
eventDateId | Present only when you narrowed to one date |
currency | The currency the money figures are in, as its ISO 4217 code — "EUR", "USD" |
currencySymbol | The symbol that renders it — "€", "$" |
totalRevenue | Gross ticket revenue |
ticketsSold | Tickets sold |
ticketsAvailable | How many were put on sale |
complimentaryTickets | Tickets issued free |
soldAtDoorCount, soldAtDoorRevenue | The door-sales share of the above |
refundedAmount, refundedAmountToday | Money refunded, in total and today |
uniqueVisits, uniqueVisitsToday | Unique visits to the event page |
lastTicketSoldAt | When the most recent ticket sold. Absent when nothing has sold yet. |
salesByTicketType | Sold against available, per ticket type |
dailySales | Tickets sold per day |
dailyVisits | Unique page visits per day |
currency and currencySymbol are two fields on purpose, and this is the tool where the difference bites. "$" is four different currencies, so a symbol cannot be totalled across events; "EUR" means exactly one thing anywhere. Roll figures up on the code and render them with the symbol.
lastTicketSoldAt is left out entirely rather than sent as a placeholder date when no ticket has sold. The underlying field defaults to the year 1, and 0001-01-01 reads as a real date to an assistant; absence is the honest rendering of "nothing has sold yet".
What happens when you call it
- The event identifier is resolved and the ownership checks run.
eventDateis parsed if given. An unparseable one is refused rather than ignored.- The figures are fetched for the event, or for that one date.
- The named fields above are projected. The attendee and order previews on the source record are not among them — see the scope note.
lastTicketSoldAtis dropped if it holds the default date.
Troubleshooting
There are no attendee names in the result
By design. analytics:read promises figures. Names live behind orders:read and attendees:read, on swarmtix_orders_list and swarmtix_attendees_list.
lastTicketSoldAt is missing
Nothing has sold yet. The field is omitted rather than given a placeholder.
The totals disagree with the dashboard
Check whether you narrowed to one date. With eventDate set, every figure describes that date alone; the response carries eventDateId when it did.
"eventDate is not valid: it is not an id. Expected an event date id (a GUID) from the event dates tool, or nothing for every date."
eventDate must be a date id from swarmtix_event_dates_list, not a calendar date.
"Event not found, or this connection does not have access to it."
The event does not exist, or it belongs to a different organisation than this connection covers.
"This connection is not authorized for analytics:read. Reconnect and grant it to use this tool."
Reconnect and approve analytics:read. It is the least personal of the data scopes — it reads no names — so it is usually the right one to grant on its own.
"Swarmtix could not complete this request. Nothing was changed."
The analytics fetch failed. Retry; if it persists, quote the time to support.
Use cases
- Weekly sales review — one call per event instead of five dashboard pages
- Campaign effect —
dailySalesagainst the day an email went out - Conversion —
ticketsSoldagainstuniqueVisits - Tier performance — which ticket type is carrying the event
- A figures-only assistant — the analytics scope with no personal data attached