← Back to portfolio Sales Calls Analytics Dashboard preview
Stack
PythonStreamlitpandas
Impact
  • 16,891 synthetic calls, deterministic labeling (script markers)
  • 4-step funnel: greeting → offer → meeting → qualification
  • Main leak broken down by type (silence / hang-up / refusal) + weighted contact loss
  • Engagement by hour and weekday — when to call
  • LLM labeling hook (llm_labels.csv) — the pipeline is reproducible without it

Sales Calls Analytics Dashboard

Business Context

An AI call flow is a funnel: greeting → offer → meeting → qualification. The production export stores the calls but does not say which step the bot loses the client on. The goal is to turn the raw export into an answer in a minute: where the drop-off is, for what reasons, when to call, and what to fix.

What the dashboard shows

BlockWhat it answers
KPI + funneloverall picture and where the main break is
Step-1 breakdownthe main leak by type: silence / hang-up / refusal
Where to focusfunnel transitions by weighted contact loss
Client reactionswhat to fix in the script from the engaged tail
When to callengagement by hour and weekday
Bot qualityready-made defects: industry bug, looping, dead air
Dialog drill-downfilter a slice + read drop-off transcripts

Labeling methodology

The bot script is templated, so the step a conversation reached is determined deterministically from markers in the bot’s replies:

  • 1 — greeting + consent;
  • 2 — offer;
  • 3 — meeting;
  • 4 — qualification.

The step-1 drop reason and the client reaction type are text heuristics. No LLM is used in the pipeline (everything is reproducible), but if an llm_labels.csv with phone, dt_raw, <labels> columns is placed alongside, the labels are merged automatically — reaction labeling can be strengthened via an LLM.

Data

The data/calls_demo.csv dataset is fully synthetic: generated by make_demo_data.py, deterministic on a fixed SEED, and contains no real phone numbers, names, or recordings. The numbers reproduce the shape of a typical production export (funnel, defects, hourly distribution) so the dashboard tells a realistic story on safe data.

Run

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/streamlit run app.py

Impact

  • A minute to an answer — which step loses the client and what to fix.
  • Deterministic labeling — reproducible, no LLM in the critical path.
  • A growth point — weighted contact loss and a first A/B scenario.
  • Safe demo — synthetic data, free public deployment.

Documentation

Case study

Problem

An outbound call flow is a funnel with big drop-off at early steps, but the production export does not answer the key question: which step the bot loses the client on, and what to fix — the script, the timing, or bot quality.

Approach

The step a conversation reached is determined deterministically from markers in the bot's scripted replies (greeting → offer → meeting → qualification). The step-1 drop reason and the client reaction type are text heuristics; no LLM is used in the pipeline, but an llm_labels.csv hook is provided to strengthen reaction labeling. The dashboard breaks the funnel into weighted contact loss, engagement by hour/day, and bot defects, with drill-down into drop-off transcripts.

Result

One minute to an answer to 'where the bot loses the client': a funnel with typed main leak, a growth point, and a first A/B scenario. Labeling is deterministic and reproducible, and the dataset is synthetic — safe for a public demo deploy.

16,891 Calls (synthetic)
4 Funnel steps
deterministic Labeling
no (hook exists) LLM in pipeline