---
title: "Ticket sales analytics"
description: "Ticket sales analytics: available fields, filters, associations, and API operations."
lastModified: "2026-08-21"
---

**Path:** `ticket-sales-analytics` at organization level  
**Methods:** GET collection/record only.

Each record represents one event inside the token's event selection.

- Fields: `event-id`, `metric-version`, `generated-at`, `time-zone`, `draft-purchases-count`, `invoiced-purchases-count`, `completed-purchases-count`, `failed-purchases-count`, `currency-totals`, `tickets`, `discount-codes`, `purchases-by-type`, `purchases-by-source`.  
- Filters: `event_id`, `created_at_from`, `created_at_to`, `purchase_completed_from`, `purchase_completed_to`, `currency`, `ticket_id`, `ticket_type_id`, `discount_code_id`, `purchase_type`, `purchase_source`.  
- Associations: none.

```
GET /api/core/organizations/30/ticket-sales-analytics?event_id=319986&purchase_completed_from=2026-01-01T00:00:00Z&currency=EUR
```

Creation-time filters affect status counts and the type/source breakdowns. Completion-time filters affect completed purchase, money, ticket, and discount-code aggregates. Currency and amount values use the currency's **minor units**; for EUR, `1250` means EUR 12.50.

Nested response structures:

```json
{
  "currency-totals": [
    {
      "currency": "EUR",
      "completed-purchases-count": 25,
      "tickets-sold-count": 31,
      "subtotal-amount-minor": 325000,
      "discount-amount-minor": 15000,
      "total-amount-minor": 310000,
      "average-order-value-minor": 12400
    }
  ],
  "tickets": [
    {
      "ticket-id": 501,
      "ticket-name": "Standard",
      "ticket-type-id": 301,
      "currency": "EUR",
      "quantity-sold": 20,
      "gross-amount-minor": 200000,
      "discount-amount-minor": 10000,
      "net-amount-minor": 190000
    }
  ],
  "discount-codes": [
    {
      "discount-code-id": 601,
      "code": "EARLY10",
      "currency": "EUR",
      "completed-purchases-count": 8,
      "tickets-sold-count": 10,
      "discount-amount-minor": 10000
    }
  ],
  "purchases-by-type": [
    { "purchase-type": "checkout", "count": 18 }
  ],
  "purchases-by-source": [
    { "purchase-source": "ticketing", "count": 18 }
  ]
}
```

Ticket identity is resolved from the current ticket record while monetary amounts use the captured historical ticket price. If a request would materialize more than 100,000 historical ticket rows, the API returns `422`; narrow it with event, date, currency, or ticket filters.
