Most teams start this decision with a feeling: "we get that question all the time." That is not evidence. Two numbers settle it, and both come from records you already keep.
The first number is repetition: how often the same question arrives in a fixed window. The second is path: what the person was doing in the product before they wrote in. Repetition tells you whether it is worth spending anything at all. Path tells you which of the two fixes will actually work.
Repetition is easy to extract. Ticket taxonomies, macros, and tagging fields already group contacts into reasons for contact. SentiSum's ticket analytics product markets granular topic tags applied consistently to 100 percent of tickets, which is the property you need: consistent labels, not a lucky sample of well-described tickets (SentiSum). If your tagging is hand-applied and inconsistent, run a classification pass over a sample first, then count.
Path is harder and that is why it gets skipped. To get it, you need session context attached to the contact. Three practical sources:
- Pre-contact chat transcripts. Most chat widgets keep the visitor's current page and referrer in the conversation record, so "why is my invoice blank" arrives attached to the invoice screen.
- Search logs. What people searched in your help center before they opened a ticket. A failed search followed by a ticket is the clearest content-gap signal you will get.
- Product analytics. For logged-in users, event streams tied to the same account let you see the last three screens before the contact form was submitted.
Fallback and missed-utterance logging is the same idea on the bot side. Chatspark notes that a fallback rate under 5 percent is usually healthy while a rate above 20 percent signals a problem customers can feel, and recommends breaking the number down by intent, topic, channel, and customer group rather than trusting one blended figure (Chatspark). Do that disaggregation before you build any ranking.
A minimal log join that produces a path score
You do not need a data warehouse. A left join of contacts to the last session event before contact is enough to start. Something like this runs in any warehouse and takes an afternoon:
-- contact_path: count contacts by question and by last screen before contact
select
t.reason_for_contact as question,
s.last_page as entry_point,
count(distinct t.contact_id) as contacts,
avg(t.handle_time_minutes) as avg_minutes
from tickets t
left join sessions s
on s.account_id = t.account_id
and s.ended_at between t.created_at - interval '30 minutes'
and t.created_at
where t.created_at >= current_date - interval '90 days'
and t.reason_for_contact is not null
group by 1, 2
order by contacts desc;
Two derived columns do most of the work. Path concentration is the share of contacts for one question that share the same top entry point. Path spread is the number of distinct entry points that account for 80 percent of contacts for that question. High concentration plus high volume points at the product. High spread points at content.



