Skip to main content

Dashboard

Audience: All teams (sales/management read KPIs; QA/support verify metrics; engineering owns the StatsV2 endpoints) · Where in app: Default landing screen of the admin web app (/dashboard) · Plan availability: All plans

Restructured (2026-07, Agent K beta-gated). /dashboard renders DashboardHome.vue, which switches on company.agent_k_beta_enabled:

  • Beta companies get the new "Today on Knock Knock" command center (frontend/src/views/Dashboard/Index.vue) — in-page tabs Today / Impact / Visitors plus Funnel (shown only when the Nox funnel is enabled; /funnel deep links redirect to /dashboard?tab=funnel) and Campaigns (tokenized links + ManyReach push for externally-sent campaigns, Dashboard/Campaigns.vue). Today = live scored visitors + today's pipeline rail; Impact = question-led weekly report; Visitors = every live visitor, scored.
  • Non-beta companies keep the six-tab analytics described below — which moved wholesale to frontend/src/views/Reports/Index.vue (and for beta companies is served at /reports).

The section below documents the six-tab analytics view; file paths are now under src/views/Reports/.

The analytics view shows headline KPIs, a Nox-powered "what matters now" strip, and six analytics tabs (Overview, Hot Leads, Conversions, Traffic Sources, Auto Engage, Engagement). A global date-range picker drives every block, and every visible number is also answerable on demand by Nox via chat/voice.

What it does

  • Surfaces the headline numbers (visitors, hot leads, conversions, traffic sources, engagement) for a chosen date range with period-over-period comparison.
  • Lets admins drill into each metric area through dedicated tabs.
  • Provides quick links from a metric row into the underlying chat, recorded session, or person detail.
  • Runs a Nox proactive strip (NoxStrip) above the metric cards that turns the dashboard from reactive to proactive by pushing the engine's top insights. The insight engine (ms-ai POST /knox-agent/insights) is the single source for all Nox surfaces.

How it works

The analytics page (frontend/src/views/Reports/Index.vue, previously Dashboard/Index.vue) is a tabbed Vue 3 view. It:

  1. Reads tab, start, end from the URL query (or defaults: tab = overview, range = today).
  2. Renders DashboardHeader (headline summary cards + date picker), then NoxStrip, then TabNav, then the active tab component.
  3. Fetches headline stats once (/stats/v2/headline) regardless of active tab; each tab fetches its own StatsV2 endpoint.
  4. Keeps state ↔ URL in sync both directions (so browser back/forward and shareable links work).

All data comes from StatsV2 POST endpoints on the backend, called through the useStatsV2Query composable (TanStack Query, 5-minute staleTime). Each request body is { start_date, end_date, ...extra }.

The six tabs

TabComponentEndpointShows
OverviewOverviewTab/stats/v2/headline, /stats/v2/activity-timeline, /stats/v2/page-performanceSummary cards + activity area chart + page performance table
Hot LeadsHotLeadsTab/stats/v2/hot-leadsTop-scoring visitors, paginated
ConversionsConversionsTab/stats/v2/conversionsConversion rows (chat / call / booking), paginated
Traffic SourcesTrafficSourcesTab/stats/v2/traffic-sources, /stats/v2/traffic-source-sessionsSource funnel + expandable session lists
Auto EngageHooksTab/stats/v2/hook-performanceAuto-engage hook performance cards
EngagementEngagementTab/stats/v2/engagementPer-channel cards, video unmutes, handoff timeline

Headline summary cards (Overview tab)

SummaryCards.vue renders three cards from the headline payload:

CardFieldTooltip / meaning
Engagement Rateengagement_rate% of total visitors who interacted with at least one channel (chat/video/voice) during their session
Response Rateresponse_rate% of AI auto-engage messages that received a reply or action
Conversionstotal_conversionsTotal conversions in the period

The DashboardHeader itself surfaces additional headline fields: total_visitors (with day_over_day_change), hot_leads_count + top_leads, conversion split (chat_conversions / call_conversions / booking_conversions), top_sources, best_hook / hook_response_rate, engagement_summary (chat/video/voice), and visitor_buckets (hourly or daily granularity).

Activity Timeline (Overview)

Area chart of three series — Visitors, Engagements, Conversations — over the period. Granularity (hour vs day) comes from the endpoint and switches the x-axis labels automatically.

Page Performance (Overview)

Table of pages with Visitors and Avg Time columns. Client-side sortable by either column; shows 10 rows with Show All / Show Less.

Hot Leads tab

  • Loads 20 leads at a time, sorted by score, with a Load More button that appends (preserves scroll position rather than paging).
  • Each LeadCard shows: name (or "Anonymous Visitor"), company, job title, email, location, traffic source, search keyword, and an intent score (0–100) rendered as a colored bar/badge — green ≥70, amber ≥40, slate below.
  • "View" opens the recorded session in a new tab; expanding the card shows LeadDetailPanel.

Conversions tab

  • Table of conversion rows, 20 at a time with Load More.
  • Columns: Date, Contact (name + email/phone), Type (chat / call / booking — booking also shows date/time), Page, Actions.
  • Action buttons open the originating chat (?chat=) or recorded session (?session=).

Traffic Sources tab

  • Four funnel summary cards: Total Sources, Total Visitors, Total Engaged, Total Conversions (summed client-side).
  • A per-source list with funnel columns: visitors → identified → engaged → responded → conversions plus an engagement rate bar.
  • Source rows show top referrer domains and top search keywords; AI-referrer domains are relabeled to friendly names (chatgpt.com → ChatGPT, perplexity.ai → Perplexity, claude.ai → Claude, gemini.google.com → Gemini, copilot.microsoft.com → Copilot, poe.com → Poe).
  • Clicking a source expands an inline session list (separate /stats/v2/traffic-source-sessions call, 10 at a time, Load more).
  • Shows 10 sources by default with Show All.

Auto Engage tab

  • Grid of HookCards, 12 per page with prev/next pagination.
  • Each card: the hook message text, Shown / Responded / Rate stats, a response-rate bar, and the best source for that hook.

Engagement tab

  • Three ChannelCards — Chat, Video Calls, Voice Calls — each showing Sessions, Avg Duration (video/voice), Bookings, and Handoffs (handoffs_per_channel).
  • A Video Preview Unmutes card: video_unmutes.total_sessions (visitors who unmuted) and total_unmutes.
  • A Handoff Timeline (AI→human handoffs over the period).

Configuration & options

The dashboard is read-only analytics; the only "settings" are view controls:

ControlLocationBehavior
Date range pickerDashboardHeader (top)Preset ranges (Today, Last 7/30/90 Days) or custom start/end; drives every block. Persisted to URL start/end as YYYY-MM-DD.
Comparison labelHeader (auto)"vs yesterday" when range ≤1 day, otherwise "vs previous N days".
Active tabTab navPersisted to URL tab; one of overview, hot-leads, conversions, traffic-sources, hooks, engagement.
Per-tab paginationEach tabHot Leads / Conversions: 20 + Load More. Auto Engage: 12 + page nav. Traffic Sources / Page Performance: 10 + Show All. Traffic-source sessions: 10 + Load more.
Page Performance sortOverview tableClick column header to sort by Visitors or Avg Time (client-side).

Behaviors & edge cases

  • StatsV2 replaced an older Stats endpoint. Older/cached dashboards may surface different numbers than StatsV2.
  • Headline perf fix (2026-07): chat conversions are aggregated instead of distinct — headline dropped from ~34s to ~200ms.
  • "Identified" narrowed: the identified-visitors metric now counts only sessions with apollo_data or snitcher_data set (real enrichment), so identification rates dropped vs older numbers by design.
  • Hot leads sort on score total. If you re-tune lead-score weights, historical leads are not re-scored.
  • Conversions = bookings + contact captures (chat/call/booking types). If your business defines conversion differently, slice further with Nox.
  • Date defaults to today (start of day → end of day in the browser's local time via moment).
  • Each tab resets its pagination when the date range changes.
  • Queries are disabled until both start and end are set; results cache for 5 minutes (staleTime).
  • Empty states are explicit per tab ("No hot leads found for this period", etc.); errors render an ErrorAlert.
  • Anonymous visitors appear as "Anonymous Visitor" / "Unknown" until identified.

Plan & limits

All plans include the dashboard. There is no documented row/quota cap on dashboard analytics beyond the underlying data retention — verify retention windows against current product/package config. Live-session viewing and lead-intelligence enrichment shown in some rows can be add-on gated (see Glossary → Add-on).

Technical implementation

  • Owning UI (six-tab analytics): frontend/src/views/Reports/Index.vue (page + URL state), components/DashboardHeader.vue, components/TabNav.vue (hooks tab labeled "Auto Engage"), and the per-tab folders (overview/, hot-leads/, conversions/, traffic-sources/, hooks/, engagement/).
  • Command center: frontend/src/views/Dashboard/Index.vue (+ Campaigns.vue); route switchers DashboardHome.vue / ReportsHome.vue.
  • Data layer: composables/useStatsV2Query.js (TanStack Query factory; POSTs to /stats/v2/* with start_date/end_date).
  • Owning service for the data: StatsV2Controller in backend (MongoDB aggregation over user_sessions, chats, bookings, lead scores).
  • Nox strip: frontend/src/components/knox/NoxStrip.vue, fed by ms-ai POST /knox-agent/insights — see ms-ai and Nox Assistant.
  • Charts: ApexCharts (apexchart component), theme-aware via the app store dark-mode flag.