Sales¶
Solution
A CRM stores the current stage of a deal. It does not store what you actually promised a customer, in whose words, or whether that promise survived the next three email threads. Telha resolves account and opportunity state across the CRM record and the correspondence around it, so "what did we commit to" has an answer with a source, not a guess from whoever remembers the call.
The state questions sales needs to answer¶
- What did we commit to this customer, and when did we commit to it?
- What was the account's state (owner, stage, terms) at the time of the renewal decision?
- Which opportunities had a discount or non-standard term approved, and who approved it?
- What did the rep say in email or Slack that never made it into the CRM record?
- What was the deal's stage on the date a competitor's mention first shows up in the correspondence?
- Whose commitment was it, when two people on the account team said different things?
Why this needs three clocks
A renewal conversation asks about the account "as it stood" on a past date, not the account as CRM shows it today after three stage changes. Valid time answers what the terms were on that date; transaction time answers what we had recorded about it by then, which matters when a rep insists they "always knew" a discount was approved.
What to connect¶
| Source | Shipped connector | What it feeds |
|---|---|---|
| Salesforce | Salesforce connector | Accounts, opportunities, contacts, stage history, as format=json records labeled by SObject |
| Exchange connector | Commitments and terms discussed by email, ingested as format=email | |
| Slack | Slack connector | Deal-desk and account-team threads, ingested as format=json (SLACK_THREAD) |
| Contracts and proposals (PDF/DOCX) | Uploaded via /v1/ingest (docling) | Signed terms and the language actually in the paper |
| Identity | Entra ID connector | Verified rep and approver identity, for clarification routing and RBAC |
Order matters
Run the Entra connector first. It supplies the canonical identity that Salesforce, Exchange, and Slack principals resolve against, and it is the authority substrate clarifications use to find the right person to ask.
Example queries¶
All examples run against POST /v1/query. See the query language reference for the full grammar.
{
"find": "OPPORTUNITY",
"where": {
"status": { "$eq": "open" },
"amount": { "$gte": 250000 },
"stage": { "$in": ["negotiation", "proposal"] }
},
"limit": 50
}
{
"find": "ACCOUNT",
"where": { "name": { "$eq": "Northwind Traders" } },
"atValidTime": "2026-03-14T00:00:00Z",
"expand": [{ "type": "OWNED_BY", "direction": "out", "depth": 1 }]
}
{
"find": "OPPORTUNITY",
"where": { "name": { "$eq": "Northwind Traders - FY27 Renewal" } },
"atValidTime": "2026-03-14T00:00:00Z",
"atTxTime": "2026-02-20T00:00:00Z"
}
{
"find": "COMMITMENT",
"where": { "account": { "$eq": "Northwind Traders" } },
"vector": { "text": "extended payment terms", "model": "m1", "k": 10, "minScore": 0.55 },
"expand": ["REFERENCED_IN"]
}
A verified answer in practice¶
Question posed to /v1/generate: "What did we commit to Northwind Traders on pricing for the FY27 renewal, and when?"
{
"draft": "Telha committed to a 12% renewal discount for Northwind Traders, effective the FY27 term [S1]. The discount was confirmed by the account owner in an email to the customer's procurement lead on Feb 18, 2026 [S2].",
"verification": {
"status": "verified",
"claims": [
{ "text": "a 12% renewal discount ... effective the FY27 term", "verdict": "supported", "span": "S1" },
{ "text": "confirmed ... in an email ... on Feb 18, 2026", "verdict": "supported", "span": "S2" }
]
}
}
S1 traces to the OPPORTUNITY record's discount field in Salesforce, at the byte span holding the approved value. S2 traces to the exact paragraph of the Exchange email where the account owner confirmed the number to the customer. Both spans are clickable back into Salesforce and Outlook behind their own logins. Neither claim is a paraphrase of what the rep remembers, both are matched against the actual source bytes at generation time, per the verified-answers loop.
If the commitment had been ambiguous
If the email had said "we'll do something in that range" with no pinned figure, ingestion would apply a best-guess and open a clarification: a one-tap card to the account owner asking to confirm the number, and any answer generated in the meantime would carry an explicit caveat rather than stating the figure as fact.
Evidence and permissions¶
- Provenance. Every commitment, term, and stage value carries provenance to the exact span in the CRM record, email, or document it came from, so a generated answer's citation is never "somewhere in Salesforce," it is the field or paragraph.
- RBAC from Entra groups. Access to account and opportunity data is deny-by-default, mapped from your IdP groups. A rep who is not on the account team sees nothing for that account, not a redacted version of it.
- Field-level encryption. Fields declared classified (contract pricing exceptions, named individual compensation terms) are encrypted in the app layer before core ever stores them, and are excluded from indexing and vector search as a result.
- Corrections don't erase the record. When a deal term is corrected (a discount renegotiated, a stage rolled back), the prior version stays reconstructable at its original transaction time, so "what did we tell the customer before the correction" remains answerable.