Reports

Yield Insights

Aggregated occupancy and revenue insights for a site's yield pricing — where the peak and quiet spells are, and what yield rules have earned since they were switched on.

The YieldInsights object

Attributes

  • periodstringrequired

    The reporting period the insights were calculated over.

    Possible values:last_30_dayslast_60_dayslast_90_days
  • windowobjectrequirednullable

    The concrete datetime window the requested period resolved to, or null when the site has no occupancy history at all to build a window from. When the site's data starts too recently to cover the whole requested period, starts_at reflects where the data actually begins rather than the full period.

  • currencystringrequired

    The ISO-4217 currency code every monetary amount in this response (performance.additional_revenue, performance.aov_uplift_amount) is denominated in. The amounts themselves are integers in this currency's minor units.

  • has_occupancy_databooleanrequired

    Whether the site has any occupancy data at all. When false there is nothing to calculate insights from, so the stat fields elsewhere in the response are null.

  • is_yield_enabledbooleanrequired

    Whether yield pricing is switched on for the site. When false the performance stats have nothing to measure and are null.

  • opportunitiesobjectrequired

    Where the opportunity for demand-based pricing lies — how busy the site runs on average, and how many peak and quiet spells its occupancy shows over the reporting window.

  • performanceobjectrequired

    What yield pricing has earned for the site since it was switched on. Monetary amounts are integers in the minor units of the top-level currency — format them client-side.

{
  "period": "last_30_days",
  "window": {
    "starts_at": "2026-01-15T09:30:00+00:00",
    "ends_at": "2026-01-15T09:30:00+00:00"
  },
  "currency": "GBP",
  "has_occupancy_data": true,
  "is_yield_enabled": true,
  "opportunities": {
    "has_data": true,
    "avg_utilisation_percent": 68,
    "bookable_area_count": 4,
    "peak_period_count": 9,
    "quiet_period_count": 23,
    "peak_threshold_percent": 90,
    "quiet_threshold_percent": 40
  },
  "performance": {
    "has_data": true,
    "additional_revenue": 648000,
    "additional_revenue_since": "2026-01-15",
    "aov_uplift_amount": 1420,
    "aov_uplift_percent": 11,
    "bookings_at_high_peak_percent": 36,
    "bookings_by_tier": [
      {
        "tier": "low",
        "count": 110,
        "share_percent": 22,
        "revenue": 1190000
      }
    ]
  }
}
get/shop/yield-insights

Get yield insights

getYieldInsights

Returns a site-level summary of how yield pricing is set up and performing over a recent reporting period: the opportunity for demand-based pricing (utilisation, peak and quiet spells) and what yield rules have earned since they were switched on.

The four state flags (has_occupancy_data, is_yield_enabled, opportunities.has_data, performance.has_data) are always present, so a dashboard can decide which panels to render before reading any stats. The stat fields themselves are null until the underlying calculation has data to work from.

Monetary amounts are integers in the minor units of the top-level currency — format them client-side.

For a per-sale breakdown of every price a yield rule moved, use the yielded sales report.

Query parameters

  • site_iduuidrequired

    The site to return yield insights for.

  • periodstringoptional

    The reporting period to calculate results over, ending now. Defaults to last_30_days. Shared by the yield insights endpoints so a dashboard can request every panel over the same window.

    Possible values:last_30_dayslast_60_dayslast_90_days

Responses

  • 200

    The yield insights were successfully retrieved.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 422

    The request didn't pass validation

get/shop/yield-insights/heatmap

Get the yield insights demand heatmap

getYieldInsightsHeatmap

Returns how full a site's bookable capacity was by weekday and hour over a recent reporting period, so an operator can see when demand is heavy enough to price against.

Each average is the share of bookable minutes that were booked in that weekday and hour across the period — booked time over usable capacity, with time blocked out by staff reducing capacity rather than counting as demand. An average is null rather than 0 where nothing was bookable, so a closed hour reads differently from an empty one.

type selects which offerings the averages cover.

has_occupancy_data is always present, so a dashboard can decide whether to render the grid before reading it. heatmap is empty until the underlying calculation has data to work from.

Separate from the yield insights summary because type scopes only the grid: a dashboard switching between offering types re-reads this without re-reading the summary.

Query parameters

  • site_iduuidrequired

    The site to return yield insights for.

  • periodstringoptional

    The reporting period to calculate results over, ending now. Defaults to last_30_days. Shared by the yield insights endpoints so a dashboard can request every panel over the same window.

    Possible values:last_30_dayslast_60_dayslast_90_days
  • typestringoptional

    Which offerings the averages cover. Defaults to appointments.

    Rooms and bookable areas are not a type here: they are returned one row per resource by room and area occupancy.

    Possible values:appointmentssessions

Responses

  • 200

    The demand heatmap was successfully retrieved.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 422

    The request didn't pass validation

get/shop/yield-insights/revenue-comparison

Get the yield insights revenue comparison

getYieldInsightsRevenueComparison

Returns what the site took over the reporting period against what the same bookings would have made at baseline prices, as the two lines of a chart plus the overall uplift between them.

has_data needs both occupancy history and yield rules — with no rules there is nothing to compare against. series is empty until the underlying calculation has data to work from.

Separate from the yield insights summary because it returns a series rather than a stat. For the single since-inception figure, read performance.additional_revenue there instead.

Amounts are integers in the minor units of the top-level currency. Sites without the advanced_yield_management feature respond 404.

Query parameters

  • site_iduuidrequired

    The site to return yield insights for.

  • periodstringoptional

    The reporting period to calculate results over, ending now. Defaults to last_30_days. Shared by the yield insights endpoints so a dashboard can request every panel over the same window.

    Possible values:last_30_dayslast_60_dayslast_90_days

Responses

  • 200

    The revenue comparison was successfully retrieved.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 422

    The request didn't pass validation

get/shop/yield-insights/room-occupancy

Get yield insights room and area occupancy

getYieldInsightsRoomOccupancy

Returns how full each of a site's bookable resources was by hour over a recent reporting period, so an operator can see which rooms carry the demand and which sit empty.

Each average is the share of that resource's bookable minutes which were booked in that hour across the period, with time blocked out by staff reducing capacity rather than counting as demand. An average is null rather than 0 where nothing was bookable, so a closed hour reads differently from an empty one.

Rows cover treatment rooms today; kind distinguishes them from bookable areas, which are added as further rows once their capacity is measured.

avgs is empty until the underlying calculation has data to work from, while the rows themselves are always returned, so a grid can render its axes before any fill rate exists.

Query parameters

  • site_iduuidrequired

    The site to return yield insights for.

  • periodstringoptional

    The reporting period to calculate results over, ending now. Defaults to last_30_days. Shared by the yield insights endpoints so a dashboard can request every panel over the same window.

    Possible values:last_30_dayslast_60_dayslast_90_days

Responses

  • 200

    The room and area occupancy grid was successfully retrieved.

  • 401

    The user is unauthenticated

  • 403

    The authenticated user does not have permission.

  • 422

    The request didn't pass validation