Tickets, chats, WhatsApp, CSAT and NPS
AI classifies reason and sentiment with evidence
Topics by customer, revenue and recurrence
Roadmap, CS queue and AI agent
What it solves
- Every ticket is linked to a paying customer, with reason, sentiment and the excerpt that proves the classification.
- Topics are ranked by affected customers, revenue and recurrence, not just by volume.
- Cancellation and downgrade requests made in support reach CS the same day.
Business questions it answers
Ask your agent these questions once the case is live.
What you need
- Support tool or WhatsApp connected to Nekt, with the conversation text
- A closed list of reasons agreed between support, CS and product
- A single customer across support, CRM and billing
What you get
- A per-ticket table with customer, timings, reason, sentiment and evidence
- A ranking of topics by affected customers, revenue and recurrence
- An exit-request alert for CS
- An AI agent that builds the account's support history
Where to activate
Topics ranked by affected customers, revenue and recurrence, with evidence excerpts for the product team to read.
Exit or downgrade requests and recurring customers go to CS the same day, with the conversation excerpt.
Builds the account's support history before a meeting, quoting the customer's own words.
Linking tickets to customers and computing timings is quick. The AI classification needs an agreed reason list, cost control and a sample review before going to production. The detailed view has the business rules, the pitfalls and the acceptance test. Or send everything straight to your agent with the Nekt MCP.
Tickets arrive without a company, with the category empty in most cases, with the waiting time starting after the customer was already waiting, and with emails that repeat the whole conversation in every reply. Sending that straight to an AI returns generic topics, inflated sentiment and no link to revenue. The final ranking rewards the noisiest topic, not the one that most affects paying customers.
How it is usually done, and the rule
Each row is a mistake that already happened in practice.
Resolve the company in a cascade: the ticket's own association, then the contact's, then email, then normalized phone (country and area code plus the last 8 digits). An email domain only counts if it is not a free email provider. Anonymous widget visitors, who can be half of the tickets, stay out of the per-customer analysis but count in volume. Publish the link rate.
Remove the team's internal tickets, test companies and messages from the team's own numbers. Flag the tool's AI bot replies and automations. Agent productivity counts only messages from an identified human operator; system events and internal notes are not conversation.
In chat, the customer writes before the ticket is created: in a real base, the first message was at 07:43 and the ticket at 07:59. Measure waiting and resolution from the customer's first message in the transcript. A technical close of the conversation is not resolution. Timings are summarized by median and percentiles, never by sum or average of averages.
Rebuild the full thread (customer, agent and bot) before classifying. In email, cut the quoted history from each reply ("On ... wrote:", "Em ... escreveu:", "De: ... Enviada em:", lines starting with ">"). Call transcripts have very short utterances: join them into 60-second windows with a timestamp. Never use the call tool's ready-made summary as a source: it is a third-party interpretation that loses context.
The AI picks one primary reason from a closed, versioned list, and separately lists every reason that appears with evidence. For a cancellation or downgrade request, classify its nature: leaving or rightsizing. Without enough evidence, the safe default for retention is to treat it as leaving. When the list changes, store the version on each row and map the old reason to the new one.
Each reason, sentiment and risk signal comes with the literal quote from the new text. Normalize the keys of the AI's response (accents and lowercase) before consolidating. Track the class distribution every run: a model that returns everything as neutral is almost always a call error, not a happy customer.
Classify only what is new: a ticket enters the run if it was never classified or if it received a message newer than the last one read. The watermark is per ticket; a single watermark for the table gives each ticket one chance and loses messages that arrive later. Use a fixed window and a cap on calls per run, and limit how many types go to the AI in frequency analyses.
Rank topics by affected customers and their revenue, not by raw message count. Recurrence is the same customer opening the same reason (or the same tag combination) more than once in 30 days: it signals a problem not solved at the root, not a customer who uses support a lot. Counting distinct weeks with a ticket separates recurrence from an isolated spike.
In real bases, the category was empty in about 60% of tickets and almost half had no owner. Use queue or pipeline as the main split, treat a null owner as unassigned and never discard it: a queue without an owner is itself a support health signal. Priority, origin and stage are dimensions, not quality measures.
Before sending conversations to an external model or a voice-of-the-customer tool, replace email with the user id, phone with a placeholder, and mask CPF and CNPJ (individual and company tax IDs). In a source shared by several clients (for example, one account that gathers reviews for several brands), the per-client filter is mandatory: a forgotten filter does not throw an error, it leaks silently.
What the AI extracts from each conversation
Fixed fields, a closed list of values and always an evidence excerpt.
Definitions
Pitfalls that already happened
More than 80% of email text was repeated history. The AI found the same sentence again in every reply and churn signals came out almost three times higher than reality.
Cut the quote before the AI and only accept evidence found in the new text.
The call tool's automatic summary looked like a shortcut to answer questions and to pick which calls to read. It is a lossy third-party interpretation, and it left out what the customer actually asked for.
Use only the full transcript, with quotes, and never the third-party summary.
Because of a call failure, the model started returning neutral for every comment. The report looked stable, and only a diagnosis of the call found the cause.
Track the class distribution every run and alert when one class goes over a threshold.
With a single watermark for the table, tickets that received messages after others had been classified never went back to the AI.
A per-ticket watermark, comparing the last message read with the newest one.
Waiting time was measured from ticket creation, which happens minutes after the customer starts typing in the chat.
Time zero at the customer's first message in the transcript.
The internal meeting notes field in the CRM was always empty; the team pasted the transcript into the meeting body, and the analysis read the empty field.
Check on a sample where the text really lives before building the AI's base.
Acceptance test
The case is done when every item passes.
- The number of valid tickets per month matches the tool's native report, within 1%.
- The link rate to paying customers is published, and every unlinked ticket appears as no customer, none is discarded.
- Every classified ticket has a primary reason from the current list and an evidence excerpt that exists in the ticket's new text.
- On a sample of 50 tickets reviewed by a person, the AI's primary reason matches in at least 80%.
- No text sent to the model contains an email, phone, CPF or CNPJ in the clear.
Agent package
Paste into Claude, ChatGPT or any client with the Nekt MCP connected.
AI support analytics - A valid ticket follows the same rule as the tool's native report. Internal tickets, tests and messages from the team itself stay out. - Every ticket is linked to a customer by the cascade: ticket, contact, email, phone. With no link, the value is no customer; never discard it. - Timings count from the customer's first message. Report median and p90, never an average of averages. A technical close is not resolution. - The reason comes from the current closed list (version <vN>). Use the primary reason to count and the list of evidenced reasons for detail. - Every statement about what the customer said needs the literal quote from the new text. Do not use third-party automatic summaries. - For a cancellation or downgrade request, say whether it is leaving or rightsizing. - Prioritize topics by affected customers, revenue and recurrence, not by message count. - A null owner is unassigned. An empty category is no category. - NPS and CSAT are different surveys. A missing one is never replaced by the other. Client exceptions: - <client>: queue <name> is internal and stays out of the analysis. - <client>: reason <old reason> was renamed <new reason> on <date>.
Build the "AI support analytics" case in my Nekt workspace following the rules at https://academy.nekt.com/en/casos/analise-de-suporte.md. 1) Find the source tables and confirm the columns the rules use. 2) Create a transformation at the stated grain applying every rule. 3) Run the acceptance test and show me the result of each item. 4) Create the case's context document in the workspace, leaving my clients' exceptions open for me to fill in.
Variations
One row per resolved ticket with text ready for embedding, so an assistant can answer from the history.
Messages from customer groups, without the team's numbers, grouped into the 10 most frequent questions of the period.
Public comments and reviews classified by sentiment, with a 24 and 72 hour index against the previous period.