Volume Reach/Docs

Lead Detail Page

Everything you need to triage one lead in a single screen — arrival source, call timeline, transcript, consent evidence, and CRM custom fields.

Overview

The Lead Detail page (/leads/[id]) is where you land after Volume Reach tells you a lead just qualified. Three ways to get here:

  1. Click the qualified-lead toast — appears on your dashboard within 1 second of a lead qualifying. The toast deep-links to this page.
  2. Click the bell badge in the sidebar header — opens /leads filtered to your qualified leads. Click any lead.
  3. Click a lead in the leads list/leads shows your recent leads with status, source, and last activity.

The page is built for fast triage: a lead came in, the AI called them, an outcome was recorded. You want to see what happened, what they consented to, and what their CRM record looked like, in 10 seconds.


The header gives you the lead's identity + current state at a glance:

  • Name — pulled from the Person record (or first+last name if no Person yet)
  • Phone — E.164 normalized (e.g., +13105550100)
  • Email — if provided in the webhook payload
  • Source attribution — the platform that delivered this lead (e.g., GHL Smart List ABC, Facebook Lead Ads, Zapier)
  • Arrived timestamp — when the webhook landed at /api/v1/leads/inbound
  • External lead ID — your CRM's internal ID for this lead (the idempotency key)

Status pills

A color-coded chip shows the lead's current state. The four chip families:

StatusChip colorMeaning
QUALIFIEDVioletAI call ended with INTERESTED outcome; this lead is ready for human follow-up
DIALING / IN_PROGRESSEmeraldAI is actively on a call with this lead right now
NEWBlueLead has arrived but hasn't been dialed yet (in quiet hours, rate-limited, or wallet-deferred)
DEAD / DEFERREDRoseLead hit a terminal state (stale >24h, DNC match, dial cap exhausted)

If the lead is qualified, an additional qualified mono pill appears next to the status — a quick-scan signal for ops dashboards.

If the lead is in a deferred state, you'll see a separate "Deferred" panel in the right sidebar explaining why and when the next dial will fire (quiet hours window-close, wallet recovery, or rate-limit window reset).


Lifecycle timeline

The left column is a chronological log of everything that happened to this lead, from inbound arrival to current state.

Event types you'll see:

  • Lead arrived — webhook landed at /api/v1/leads/inbound with source attribution
  • Call — AI call placement, outcome chip (color-coded violet/emerald/rose/amber per outcome family), duration, recording link, transcript link
  • SMS — inbound or outbound text messages with body preview
  • Webhook delivery — outbound webhooks fired to your CRM (success ✓ / retrying ⏱ / failed ⚠)
  • Callback — manual or AI-scheduled callbacks

Each row shows the timestamp in mono font for quick comparison. Click an outcome chip to filter the timeline to that outcome family.

The transcript link on a call event opens the full transcript + audio player. For qualified leads, the transcript is the operator's pre-call homework before they human-call the lead back.


The right sidebar's top card surfaces the lead's most recent LeadConsent row. This is the panel you screenshot when a regulator or plaintiff asks "what proof do you have this lead opted in?"

Two visual states:

  • Emerald box — Consent on record. Shows:

    • Versionv1, v2, etc. Each re-ingestion writes a new version; older versions are preserved (immutable ledger).
    • Captured at — when the lead saw and agreed to the consent language (provided by your source).
    • Ingested at — when Volume Reach received the consent record.
    • SourceWEBHOOK / ZAPIER / PUBLIC_API / MANUAL.
    • URL — the page where consent was captured (clickable, opens in a new tab).
    • Language — click to expand the exact text the lead agreed to.
  • Rose box — No consent on record. The lead reached Volume Reach without a consent block on the webhook payload. AI calls without prior consent carry TCPA risk; verify the lead source flow includes consent capture before the next dial. See Lead Arrived → TCPA best practices.

The consent ledger is immutable — Volume Reach never updates or deletes a LeadConsent row. Re-ingesting consent for the same lead writes v2, v3, etc. Retention is ≥4 years (TCPA statute of limitations).


Custom fields panel

Below the consent card is a read-only display of every custom field your CRM sent with the lead.

The panel shows:

  • Key (in mono uppercase) — the field name from your webhook payload (e.g., property_address, motivation, timeline)
  • Value — the raw text your CRM sent

Long values (>100 chars) collapse with a "Show more" toggle so one bloated field can't dominate the panel. Multi-line values render in <pre> formatting for JSON or formatted addresses.

Why the "Untrusted input" chip

You'll see an amber "Untrusted input" chip in the panel header. This is a visual reminder that custom field values came from outside your team — your CRM, a form, a Zapier action — and Volume Reach treats them as untrusted by default.

Custom field values are NEVER sent to your AI voice agent's prompt unless you explicitly allowlist the key in agent settings. Allowlisted values are sanitized and isolated from the agent's instructions before interpolation — a CRM webhook can't smuggle "ignore your prior instructions" into the agent prompt via a custom field.

This is display-only on the lead detail page — it's just showing you what your CRM sent so you can sanity-check your integration.


Common pitfalls

  • No calls yet, lead is in NEW status — the lead is deferred. Look for the "Deferred" panel in the sidebar; it'll tell you the reason (quiet hours, wallet low, rate-limited) and the next dial time. See Lead Arrived settings to adjust.
  • Custom fields panel doesn't appear — your CRM didn't send custom fields, OR sent an empty object. Verify the custom_fields block in your webhook payload at the CRM source.
  • Consent panel shows the rose "no consent on record" state — your CRM didn't include a consent block at ingestion. If you can't update the CRM integration, capture consent on the form/landing page and use a tool like ActiveProspect TrustedForm to attach the timestamp + URL.
  • Multiple lifecycle rows for the same call — calls progress through states (placed → connecting → answered → completed). Each major state writes a row. This is intentional — it's the receipt trail for what happened.
  • Recording link missing — recording may still be processing (~2 minutes after call completion) OR the call was short enough that no recording was made (e.g., dialed and the lead hung up at hello).