Skip to main content
A booking rate is only useful if you know what it divides by. This page defines every figure GET /api/dashboard/analytics returns, so a number you show a client is a number you can explain.

The counts

inboundCalls and outboundCalls can sum to less than totalCalls. A call recorded without a direction counts in neither, and a sub-account disconnected before September 2026 contributes its calls to totalCalls from an archived summary that stored no direction.

The rates

Two families, and the difference matters. Lead rates divide by totalLeads. Conversion rates divide by conversations, where a conversation is a call that lasted longer than 30 seconds. A conversion rate tells you how the agent does once it is actually talking to someone. A lead rate tells you how the whole campaign does per person dialled. All rates are percentages, to two decimal places.

The window

dateFromUTC and dateToUTC set the reporting window. Send a UTC timestamp with Z or an offset, or a plain YYYY-MM-DD. A plain date covers that whole day. A timestamp without a zone is rejected rather than read as server time. The response carries window, the range actually used, as inclusive calendar days. Days, not instants: the underlying rows record the local calendar day the call happened, so a bound carrying a time is widened to cover its whole day.

Scoping the figures

Contacts you have marked as your own test leads are excluded from every figure here.

Per-project comparisons

Two endpoints return one row per project you can see, so an agency can compare clients:
  • GET /api/dashboard/booking-rate-by-project: project, leads, appointments, bookingRate.
  • GET /api/dashboard/transfer-rate-by-project: project, leads, transfers, transferRate.
Both take the same window and scope parameters, plus agency, projects and excludeProjects for agency-level filtering.

Boundaries

  • cached, queryTime and generatedAt describe the server, not your data. Do not build on them.
  • Only activity from the current platform carries campaign attribution, so a campaignId filter cannot reach calls placed before that.
  • These endpoints need the dashboard:read scope.

In the API