Overview
Leads and results
From lead to patient
Team health
Score and the biggest problem per team. Click a team for details.
Where leads are now status of leads received in the period
Leads by source share and conversion
Needs attention
Grouped by where the lead is in the journey. Click any line to open those leads.
Leads report
Every lead received, who owns it, how far it got and what happens next. Quick views and filters apply to everything on this page.
These leads over time
Status now click a slice to filter
Pipeline
How far these leads got. Click a step to keep only the leads that reached it.
Breakdown
Pick what the rows are and, optionally, what to split each row by. Click a row to filter the page to it; ▸ opens the split.
Open leads by age
Every open lead matching the filters, any date, by how long ago it arrived. Click a number to open those leads.
Why leads were lost
Alerts by agent
Which calling rules each agent breaks, grouped like the dashboard. Click a number to open those leads.
Lead list
Columns ▾
Activity
Calls and messages between agents and clients in the period.
Calls
Call outcomes
Best time to call % answered by hour
Calls by agent
Click a column to sort, a row to open that agent's calls. Outcomes and hours above open those calls too.
Messages
WhatsApp, SMS and email. Sent = by the agent · received = on the agent's leads.
Messages sent
By channel sent · received · failed
Source reports
Which sources, campaigns and countries bring leads that convert. Click any row to open those leads.
New leads by source
Which source converts lead → accepted plan
By source
By campaign
By country
Source × agent
Conversion rate per agent per source, leads received underneath. Grey = too few leads to judge. Click a cell to open those leads.
Call-quality alert rules
RULES at the top of the alerts code: first call 15 min · never called 2 h · minimum 4 attempts before giving up · 2 h between unanswered calls · best hours 17:00–20:00 · cold after 3 days · plan within 48 h of qualifying · chase a plan after 5 days · "answered" calls under 10 s flagged · pool limit 30 min.Data sources (for the developer)
leads.source · campaign_name · country · status · owner_id · last_contact_at · call_attempts · accepted_value · converted_at. Needs one new endpoint, GET /api/crm/reports/leads.treatment_interest · language · email · patient_message · photos_received · ad_set · ad_name · landing_page · referral_agent · assigned_at · qualified_at · callback_at · quote_sent_at · quote_items · deposit_paid_at · visit_date · lost_reason · lead_notes · WhatsApp message count. Alerts are computed from these plus every call's time, outcome and talk seconds (call_cdr)./api/crm/reports/activity (per agent) · /api/crm/reports/activity/days (per day) · call_cdr (talk time) · call outcomes from lead_activities.wa_messages (direction, status) + sent-by-agent from lead_activities kind=whatsapp. SMS: sms_messages + sent-by-agent from lead_activities kind=sms. Email: email_messages (direction, member_id, opened_at). Received messages count for the lead owner. WhatsApp and email per agent already come from /api/crm/reports/activity (wa_out, wa_in, wa_unreplied, email_out, email_opened, email_in). SMS is not in that endpoint yet: add sms_out / sms_in to it.leads.source, campaign_name / utm_campaign, country, joined to status and owner. Ad spend and cost per lead need the Meta and Google ad accounts connected.