Analytics Insights
Analytics
Analytics Insights
Conversation-shaped analytics for the Tuco AI iMessage API: channel and direction split, a cadence-step funnel with reply attribution, and per-day/hour series.
GET
Analytics Insights
The companion to Analytics. Where that endpoint answers “how many messages”, this one answers “what happened across the conversation”.Every send is classified by its role in the thread — a net-new first touch, a cold follow-up nudge (the lead hasn’t replied yet), or a response (you replied to their reply). Each conversation’s first reply is credited to the cadence step that earned it, and later inbound messages are counted as reply-to-reply turns.Roles are computed over each conversation’s entire history, then counted inside your window — so a step-4 send still reads as step 4 even when you only look at a single day.Scope is a single workspace (the one behind your key). Agency roll-ups are not offered here yet.
Authentication
Query parameters
string
Inclusive start of the window — an ISO 8601 timestamp (
2026-08-01T00:00:00Z) or a calendar day (2026-08-01). Date-only bounds cover whole calendar days in the workspace timezone. Defaults to the trailing 30 days.string
Inclusive end of the window — ISO timestamp or
YYYY-MM-DD.string
Restrict to messages sent on a single Tuco line (24-char ObjectId hex).
string
Restrict to one attributed origin (
gohighlevel, campaign, api, dashboard, autopilot, unattributed, …). The sources breakdown always lists every origin so you can switch.string
IANA zone to cut days and hours in (e.g.
America/New_York). Defaults to the workspace timezone. tz is accepted as an alias.Example
Success response (200)
object
Delivery-aware split.
attempted = all sends; imessageDelivered = reached over iMessage; smsFallbackSent = fell back and an SMS was actually dispatched; notOnImessage = recipient has no iMessage (status fallback), a list-quality signal distinct from failed (technical); notReached = notOnImessage with no SMS dispatched (reached nobody); reached = delivered + dispatched SMS. Plus imessageReplied / smsReplied / totalReplied.object
Distinct recipients, not message counts:
attempted = tried, reached = a message actually got to, notOnImessage = leads never delivered an iMessage (the headline when there is no SMS fallback), replied = replied. Reply rate should use replied / reached so it’s comparable across workspaces regardless of iMessage delivery.number
First outbound message ever sent to a lead (their first touch).
number
Cold follow-up sends — outbound to a lead who has not replied yet (cadence step 2+).
number
Outbound sent after the lead had already replied (“I replied to their reply”).
number[]
Cold outbound sends by cadence step — index 0..4 = step 1, 2, 3, 4, 5+.
number[]
Each conversation’s first reply, credited to the step that earned it (same 1..5+ index).
number
Conversations that opened — one per lead that replied at least once.
number
Reply-to-reply turns — inbound after the conversation had already opened.
number
Average messages per conversation touched in the window.
number
Distinct leads with at least one message in the window.
object[]
Per-day iMessage delivered / SMS fallback / not-reached / replies, plus that day’s distinct
activeConversations (drives the day drill-down).object[]
Sent and replies by hour of day (0..23) in the workspace timezone.
object
Delivery/read receipts, voice notes, attachments, scheduled sends.
boolean
true when the workspace history was too large to replay for this request; cadence and daily fields are then empty. Narrow the window or filter by line.object[]
Where the sending came from. A message carrying a GoHighLevel location counts as GoHighLevel even when sent through the API. Messages with no marker are reported as
unattributed.