> ## Documentation Index
> Fetch the complete documentation index at: https://docs.erdo.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Lead details

> What each lead told you, on the form and in every call, chat, text and email reply since, with where and when they said it.

# Lead details

A lead tells you things in more than one place. The form captures what it asks,
such as budget and timeline. Later the same person may give a different budget on
a phone call, say they are paying cash on WhatsApp, or move their timeline in an
email reply.

Lead details keep all of it for each lead, one entry per question:

* the **current answer**, which is the most recent thing they said;
* **where** they said it: the form, a phone call, a website chat, a text, a
  WhatsApp message or an email reply, with a reference to that conversation;
* **when** they said it;
* their **exact words**;
* the **earlier answers** it replaced, newest first.

A second form submission no longer erases the first one's answer, and something
said on a call is kept as a field you can read.

## What is recorded

**From the form:** every question your form asks. That is every column in your
leads dataset's declared contract that has no semantic role. Names, email,
phone, consent, attribution columns (UTMs, click ids, the page) and the
qualification fields are not answers, so they are not recorded as details. Each
submission's answers are recorded when it is captured.

**From conversations:** calls, website chats, text and WhatsApp threads, and
email replies linked to a lead. Erdo records only what the lead **stated**, in
words that carry the value on their own:

| Recorded | Not recorded |
| - | - |
| "Our budget is about \$2.5M" | "How much is a three-bedroom?" (a question) |
| "We need three bedrooms minimum" | "A one-bedroom", replying to which unit they are asking about |
| "We're relocating to Miami for work" | "So your budget is around a million?" said by your side, answered "yes" |
| "My wife has the final say" | Moods, interest or how likely they are to buy |
| "Honestly we're not buying for three years or so" | "If it were cheaper we might…" |

Their age, health and other sensitive traits are never recorded. Nor is a
request such as "can I book a viewing?": the timeline already shows it.

Each detail from a conversation passes three checks before it is kept:

1. The model reading the conversation is told to transcribe what the lead said,
   not to conclude anything from it.
2. Code confirms the quoted words appear in one of the lead's own messages, and
   that every number in the value appears in the quote.
3. A second, separate check reads only the quote and the question it answers,
   and confirms the quote actually states that answer.

A detail that fails any check is dropped. Missing a detail is preferred to
recording a wrong one.

Conversations are read once they have finished. A text or WhatsApp thread is
read after half an hour without messages, and again when the lead writes more.
Test leads are skipped.

## Questions and keys

Each question has a key, such as `budget` or `move_in_timeline`, a label and a
one-sentence definition. A form column's key is its name. When a lead answers a
question your form asks, the conversation's answer uses the form's key, so both
answers sit under the same question. A new question gets a new key, and later
conversations reuse it.

## Reading details

Details are part of every lead read:

* REST: `GET /v1/datasets/{dataset}/leads/{lead}` returns `lead.details`.
* MCP: `erdo_get_lead` returns the same.
* CLI: `erdo leads get <dataset> <lead>` prints a **what they told us** table
  first.

```json theme={null}
{
  "key": "budget",
  "label": "Budget",
  "definition": "How much the lead wants to spend.",
  "value": "Around 1.3M",
  "quote": "we're looking at around one point three",
  "source_kind": "phone_call",
  "source_ref": "conv_7601…",
  "observed_at": "2026-09-12T10:04:31Z",
  "earlier": [
    { "value": "$1M–1.5M", "quote": "$1M–1.5M", "source_kind": "form", "source_ref": "5c1f…", "observed_at": "2026-09-08T14:10:02Z" }
  ]
}
```

`source_kind` is `form`, `phone_call`, `widget_conversation`, `sms`, `whatsapp`
or `email_reply`. For a form answer, `source_ref` is the capture it came from.
It is `row` for an answer read from a lead captured before lead details existed.
Those older leads keep only the answer their row held when details were turned
on. Any answer a later submission had already overwritten cannot be recovered.

## Merging leads

When two leads are merged (see [Lead identity](/lead-identity)), the absorbed
lead's details move to the survivor. The most recent answer to each question
across both becomes current. The merge response's `details_moved` says how many
moved.

## What details do not change

Details sit beside the lead's dataset row and never rewrite it. Dashboards,
queries and notifications keep reading the row. The typed qualification fields a
form captures are unchanged as well. A budget stated on a call does not change a
lead's qualification status.
