+76.4% more tickets settled in one reply than staff alone

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

91.3% against 51.7%

AI-only tickets end after one reply 91.3% of the time. Staff-only tickets, 51.7%. That is 76.4% more.

The counts behind the rates

3,500 of 3,835 replied AI-only tickets took one reply. 534 of 1,032 staff-only ones.

AI helped sits lower

When AI only helped, the rate is 69.2%: 916 of 1,324. Before Easol it was 75.7%, or 426 of 563.

Worth knowing
  • Tickets are not shared out at random, so some of this is which tickets AI can take on. The groups are very different sizes: 3,835 AI-only, 1,324 AI-helped, 1,032 staff-only, 563 before Easol.
  • One reply means one reply. On its own it says nothing about whether the answer was any good.
Before Easol On Easol

One-reply rate

Before Easol 75.7% Staff only 51.7% AI helped 69.2% AI alone 91.3% No reply yet—

Tickets settled in one reply

Before Easol 426 Staff only 534 AI helped 916 AI alone 3,500 No reply yet 0

Tickets that got a reply

Before Easol 563 Staff only 1,032 AI helped 1,324 AI alone 3,835 No reply yet 0

Where the numbers come from

One entry per figure: what it means, the SQL that made it, and when it was last re-checked.

More one-reply fixes with AI ai_one_touch_uplift_pct

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

One-reply rate one_touch_pct_by_bucket

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 settled in one reply one_touch_by_bucket

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 that got a reply replied_tickets_by_bucket

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