bootsinthepark · everything up to 2026-08-03 · every figure double-checked
What this meansHow much more often a ticket ends after a single reply when AI handles it alone, against tickets staff handled alone. Both numbers behind it are in the charts below. Rounding can shift the last decimal. Checked 2026-08-03T16:10:59Z.
AI settles far more tickets in a single reply
AI-only tickets end after one reply 91.3% of the time. Staff-only tickets, 51.7%. That is 76.4% more.
3,500 of 3,835 replied AI-only tickets took one reply. 534 of 1,032 staff-only ones.
When AI only helped, the rate is 69.2%: 916 of 1,324. Before Easol it was 75.7%, or 426 of 563.
One entry per figure: what it means, the SQL that made it, and when it was last re-checked.
How much more often a ticket ends after a single reply when AI handles it alone, against tickets staff handled alone
WITH b AS (
SELECT
CASE
WHEN imported THEN 'pre_easol'
WHEN ai_resolved THEN 'full_ai'
WHEN (ai_draft_sent_count > 0 OR booking_action_performed_by_ai_count > 0) THEN 'partial_ai'
WHEN sent_message_count > 0 THEN 'no_ai'
ELSE 'no_reply'
END AS bucket,
sent_message_count
FROM reporting.inbox_tickets
WHERE company_id = $1 AND created_at < $2
),
rates AS (
SELECT bucket,
COUNT(*) FILTER (WHERE sent_message_count = 1)::numeric
/ NULLIF(COUNT(*) FILTER (WHERE sent_message_count > 0), 0) AS rate
FROM b GROUP BY bucket
)
SELECT ROUND(100.0 * (
(SELECT rate FROM rates WHERE bucket = 'full_ai')
/ (SELECT rate FROM rates WHERE bucket = 'no_ai') - 1
), 1) AS value
Source: app/models/reporting/inbox/ticket.rb:176 (Reporting::Inbox::Ticket#sent_message_count)
Verified: 2026-08-03T16:10:59Z
Of tickets that got a reply, the share that needed only one
No reply yet is blank here — nothing to divide by
SELECT
CASE
WHEN imported THEN 'pre_easol'
WHEN ai_resolved THEN 'full_ai'
WHEN (ai_draft_sent_count > 0 OR booking_action_performed_by_ai_count > 0) THEN 'partial_ai'
WHEN sent_message_count > 0 THEN 'no_ai'
ELSE 'no_reply'
END AS label,
ROUND(100.0 * COUNT(*) FILTER (WHERE sent_message_count = 1)
/ NULLIF(COUNT(*) FILTER (WHERE sent_message_count > 0), 0), 1) AS value
FROM reporting.inbox_tickets
WHERE company_id = $1 AND created_at < $2
GROUP BY 1 ORDER BY 1
Source: app/models/reporting/inbox/ticket.rb:176 (Reporting::Inbox::Ticket#sent_message_count)
Verified: 2026-08-03T16:10:59Z
Tickets that needed exactly one reply, split by who handled them
SELECT
CASE
WHEN imported THEN 'pre_easol'
WHEN ai_resolved THEN 'full_ai'
WHEN (ai_draft_sent_count > 0 OR booking_action_performed_by_ai_count > 0) THEN 'partial_ai'
WHEN sent_message_count > 0 THEN 'no_ai'
ELSE 'no_reply'
END AS label,
COUNT(*) FILTER (WHERE sent_message_count = 1) AS value
FROM reporting.inbox_tickets
WHERE company_id = $1 AND created_at < $2
GROUP BY 1 ORDER BY 1
Source: app/models/reporting/inbox/ticket.rb:176 (Reporting::Inbox::Ticket#sent_message_count)
Verified: 2026-08-03T16:10:59Z
Tickets with at least one reply sent, split by who handled them
SELECT
CASE
WHEN imported THEN 'pre_easol'
WHEN ai_resolved THEN 'full_ai'
WHEN (ai_draft_sent_count > 0 OR booking_action_performed_by_ai_count > 0) THEN 'partial_ai'
WHEN sent_message_count > 0 THEN 'no_ai'
ELSE 'no_reply'
END AS label,
COUNT(*) FILTER (WHERE sent_message_count > 0) AS value
FROM reporting.inbox_tickets
WHERE company_id = $1 AND created_at < $2
GROUP BY 1 ORDER BY 1
Source: app/models/reporting/inbox/ticket.rb:176 (Reporting::Inbox::Ticket#sent_message_count)
Verified: 2026-08-03T16:10:59Z