---
id: saas/conversas-base-para-ia
industry: SaaS and technology
usage: common
effort: high
grain: Interaction (one row per message, note or call) and call x 60-second window
---

# Conversations as a foundation for AI

Each customer's calls, emails, notes, tickets and WhatsApp messages in a single AI-readable base, which extracts risk, objections and next steps, always with the quote that proves them.

## Executive summary

**For:** B2B SaaS companies with consultative sales and CS, who talk a lot with each customer.

**What it solves**

- The team walks into the meeting knowing what the customer already said.
- Risk, objections and product requests come out of conversations with the quote that proves them.
- AI reads each conversation once, with no repeated history and no runaway cost.

**Why it matters:** Conversations are where the customer warns they are leaving, before any usage number drops. But dirty text produces false signals: quoted history, third-party summaries and double-counted calls make AI see risk where there is none and hide it where there is.

**Business questions it answers**

- What did customer X say in the last three calls?
- Which objections came up in this month's meetings?
- Which customers talked about canceling or downsizing in the last 30 days?
- Which competitors do customers mention most?
- Which feature requests and bugs came out of conversations this quarter?
- Brief me for the meeting with customer X.

**What you need**

- Meeting recorder, CRM and support tool connected to Nekt
- The single-customer map, to tie each conversation to a customer
- A closed list of the signals AI should extract

**What you get**

- A base of interactions per customer with clean text
- Transcripts in quotable windows, with timecode and link
- AI-extracted signals, each with the literal quote
- An AI agent that prepares the pre-meeting brief

## Detailed

### The problem

What the customer said about canceling, pricing or a bug is scattered across transcripts, CRM emails and chats, and nobody reads it all before the meeting. When the base is built for AI, each email reply carries the whole quoted thread and inflates signals, the transcript sits in a different field than expected, the same call is linked to three companies and the agent answers from another tool's summary instead of what was actually said.

### Business rules

1. **One readable grain, with customer and channel.** Consolidate every text interaction into a single format: canonical customer, date and time, channel (call, email, note, ticket, WhatsApp), direction (customer or team), author and full text. Include former customers, including those who canceled: they provide the examples of exit signals used for calibration. (Avoid: One table per tool, each with its own customer key.)
2. **Only the new text of each message.** In email, each reply carries the quoted history. Cut at the markers ('From: ... Sent:', 'On ... wrote:', lines starting with '>') before sending to AI. In a real base, 85.5% of email text was repeated history, and the AI kept finding the same statements in every reply: churn signals came out about 2.7 times inflated. (Avoid: Sending the whole email body to AI.)
3. **The source is the full transcript, never the summary.** The summary generated by the meeting recorder is a lossy third-party interpretation. Do not use it to answer, to choose which calls to read or to fill gaps. A call with no transcript is reported as having no transcript. (Avoid: Answering from the recording tool's automatic summary.)
4. **Transcripts in 60-second windows.** Utterances are too short to give context (median of about 50 characters in a real base). Join consecutive utterances into 60-second windows, keyed by call and window number, keeping each utterance's timecode. Reading the windows in order rebuilds the whole call. A citation carries the call title, date, timecode and recording link. (Avoid: Indexing utterance by utterance, or the whole call as a single block.)
5. **Real calls, counted once.** Calendar placeholders and calls without a minimum duration or a transcript are left out of contact counts. One call links to several companies (the CRM's company hierarchy ties the same call to the parent and to subsidiaries), so count distinct call_id when joining to companies. (Avoid: Counting rows of the call x company link as calls.)
6. **Read the field where the team writes.** In HubSpot, the transcript pasted by the team was in hs_meeting_body, and hs_internal_meeting_notes was always empty. Check with real data which field holds the text before building the base. The HubSpot search API stops at 10,000 results and cuts notes: use the connector's full stream. (Avoid: Assuming meeting notes are in the internal notes field.)
7. **Structured output, with a closed list and quotes.** AI returns fixed fields: summary, sentiment, churn risk signals, expansion signals, pain points, product feedback, competitors mentioned and next steps. Every signal carries the literal quote and the interaction id. In a cancellation or downgrade request, separate leaving from rightsizing; when in doubt, the safe default for retention is leaving. (Avoid: Asking AI for a free paragraph about the conversation.)
8. **Controlled cost: only what is new.** Process forward, item by item: an interaction enters the run if it was never read or changed since the last read, with a watermark per item, not a global one. Use a fixed window (for example, the last 15 days), batch processing and a cap per run. Old history is classified once, outside the routine, and new data always wins. (Avoid: Reclassifying every conversation on each run.)
9. **Real contact is a conversation, not an activity.** The last meaningful contact is the last valid call or the last message exchanged with the customer on their preferred channel. A created task, an automated email and a field change in the CRM do not count. (Avoid: Using the date of the last CRM activity as the last contact.)
10. **Sensitive data leaves before the model.** Mask email, phone, CPF (individual tax ID) and CNPJ (company tax ID) before sending text to an external model or a voice-of-the-customer tool. Keep the text base in a layer with its own MCP permission, separate from contract values. (Avoid: Sending raw text with personal data.)

### What AI extracts from each conversation

Fixed fields, each item with the literal quote and the interaction id.

- **Talk about leaving, downsizing, switching tools** → Churn risk (`churn_risk_signals`)
- **New team, new unit, module requested** → Expansion signal (`expansion_signals`)
- **The customer's business problem** → Pain points (`pain_points`)
- **Bug, feature request** → Product feedback (`product_feedback`)
- **Competing tool mentioned** → Competitors (`competitors`)
- **Commitments and open items** → Next steps (`action_items`)
- **Cancellation or downgrade request** → Leaving or rightsizing (`leaving | rightsizing`)
- **Customer's overall tone** → Sentiment (`positive | neutral | negative`)

### Definitions

| Metric | Definition |
|---|---|
| Interaction | a message, note, email (new text only), ticket or call with a transcript, tied to a canonical customer |
| Valid call | call with a transcript and the declared minimum duration, counted by distinct call_id |
| Transcript window | consecutive utterances of a call within 60 seconds, with each utterance's timecode |
| Signal | item from a closed list extracted by AI, with a literal quote and the interaction id |
| Customers with a risk signal | distinct active customers with at least one risk signal in the last N days / active customers |
| Last real contact | date of the last valid call or message exchanged with the customer |
| Transcript coverage | valid calls with a transcript / valid calls in the period |

### Pitfalls

- **Signals nearly tripled.** With quoted email history, AI kept finding the same statements in every reply and churn signals came out about 2.7 times inflated. How to avoid: Cut quoted history before AI.
- **Notes always empty.** The base read the meeting's internal notes field, which was always empty; the transcript was in the meeting body. How to avoid: Check the field with real data before publishing the base.
- **Agent reading a third-party summary.** The agent answered from the recording tool's automatic summary and missed objections that only appeared in the transcript. How to avoid: Forbid the summary in the context document and use only the transcript.
- **One call, three companies.** Through the CRM's company hierarchy, each call was linked to about three companies and contact volume tripled. How to avoid: Count distinct call_id.
- **Wrong rep on the call.** The meeting owner in the CRM was not the person who led the conversation, and the per-rep analysis was wrong. How to avoid: When the owner is unreliable, identify the team participant from the transcript.
- **API credit burned.** Reprocessing every call on each run used up the API credit in a few days. How to avoid: Fixed window, batches and a per-item watermark.

Validated on real data: In Nekt's own recorded meetings, the median utterance is 85 characters, about 6 seconds, and 1 in 3 utterances is under 40 characters. On their own they cannot support a quote; in 60-second windows, they can.

### Acceptance test

- [ ] In a sample of 50 emails, no interaction carries quoted text from an earlier message.
- [ ] The call count per customer uses distinct call_id and matches the meeting recorder.
- [ ] Every extracted signal has a literal quote that exists in the interaction text.
- [ ] Running the routine with no new interaction calls the model zero times.
- [ ] For 10 calls, reading the windows in order rebuilds the full transcript.

### Context document

```text
Customer conversations
- The source for call content is the full transcript in 60-second windows. Never use the recorder's automatic summary: not to answer, not to choose calls, not to fill gaps. Call without a transcript: say there is no transcript.
- Every statement about what the customer said comes with a citation: call title or email subject, date, timecode when available and link.
- Emails contain only the new text of each message; quoted history was removed.
- Count calls by distinct call_id; one call may be linked to several companies of the same group.
- Short calls or calls without a transcript do not count as contact.
- Risk, expansion, pain point, feedback, competitor and next-step signals come from the signals table, each with a literal quote. Do not invent a signal without a quote.
- Cancellation or downgrade request: leaving = exit, rightsizing = size adjustment. When in doubt, treat it as leaving.
- Last real contact = last valid call or message exchanged, not the last CRM activity.
Client exceptions:
- <client>: the transcript pasted by the team is in field <field>.
- <client>: the preferred channel is WhatsApp; the customer's group is linked by the normalized group name.
```

### Variations

- **Qualification from notes:** Extracting qualification criteria (such as MEDDPICC) from sales notes logged in the CRM.
- **WhatsApp support:** Groups per customer linked by the normalized group name or by the last 8 digits of the phone.
- **Export to a voice-of-the-customer tool:** Anonymized text (email, phone and tax ID masked) sent to an external analysis tool.
