Nox Daily Brief
Audience: Sales · Management · Support · QA · Engineering · Where in app: Email (morning) + Nox surfaces (chat/voice, brief-ready badge) · Plan availability: Pro (rides on the Nox entitlement — verify exact tier)
Each morning, Nox composes a short brief summarizing the previous day — how much traffic came in, how many people converted, who the hottest lead was, and anything unusual. It is delivered as an email and via the Nox surfaces (the dashboard briefing strip was removed — the brief lives on Nox, not the dashboard), so the team starts the day with a read on what happened overnight without opening the full dashboard.
What it does
A typical brief contains:
- Traffic — sessions and unique visitors.
- Conversions — bookings and contact captures.
- Top traffic sources — where the visitors came from.
- Hottest lead identified — the highest-scoring visitor.
- Notable behavior — e.g. a rage-click cluster on a page, a conversion drop.
- Compared to baseline — measured against the tenant's
knox.baseline_metrics("what's normal").
It is a summary, not a deep dive — it points at what's interesting; the Dashboard and Nox chat are where you drill in.
How it works
Backend DailyBriefEmailJob (10-minute tick) owns delivery; ms-ai owns composition:
- The job sends once per company-local day at
knox.daily_brief.send_hour(default 9; funnel-beta tenants are set to 5 when gated), with a 3-hour catch-up window. Guards:knox.daily_brief.last_sent_local_day+ a per-company lock; skipped for archived companies, playgrounds, expired subscriptions, and companies withoutwidget_installed(no widget = no session data = nothing to brief on). It replacedReportingEmailJob(now unscheduled; the monthlyreports_emaildefaults off for new companies). - ms-ai's
KnoxBriefSnapshotServicebuilds the render model via the shared "What Matters Today" insight engine — traffic and bookings come from the canonical backend stats endpoints, the same source the dashboard reads, so the numbers line up. - On Nox funnel tenants the brief adds deterministic funnel blocks (
knox-funnel-insights.ts— snapshot, pace, priorities, very-warm, what's-working, learning, …; no LLM near the numbers) and persists executable offers tobrief_offers(~48h validity). "Yes, do the first one" in chat/voice executes via theknox_brief_offerstool. - The backend renders a locked EJS template and enqueues the email.
- In the dashboard the briefing strip is gone — a brief-ready badge appears on the Nox header; the per-user auto-play preference (
noxSettings.autoPlayBrief, default on, once/day) gates spoken playback.
Counting rules:
- Nox chats count via sticky
has_visitor_message/has_bot_messageflags on the chat (set once, never unset — a later transcript rewrite can't flip a counted chat back). Historic rows: migrationPOST /migrations/backfill-chat-brief-flags(+ super-admin MigrationPanel wrapper). - Identified visitors use one identity definition —
backend/app/lib/IdentityNormalize.js(shared name/email/phone normalization) — so the brief, dashboard, and Nox agree on who counts as identified. - Lead rows carry full contact details (email/phone/company) in the email, not just names.
The same logic is exposed to the chat assistant as the knox_daily_brief tool, so an admin can ask "what's today's brief?" / "recap" / "how are we doing today?" and get the current calendar day's brief in their timezone (see Tools). The brief is one consumer of the broader insight engine (knox-insight-engine.service.ts) — see Nox / Knox Admin Assistant.
One insight engine. "What Matters Today" / the insight engine is the single source for all Nox surfaces (brief, alerts, watch). Surfaces never re-derive insights independently.
Configuration & options
companies.knox.daily_brief:
| Field | Meaning |
|---|---|
enabled | Turn the brief email on/off for the tenant (default on) |
send_hour | Local hour of delivery (default 9; funnel tenants set to 5; user-settable 0–20) |
sections.* | Content blocks: stats, captured_leads, hot_leads, identified_visitors, ask_nox + funnel keys (funnel_snapshot, funnel_pace, funnel_priorities, very_warm, new_noteworthy, needs_attention, whats_working, booked_journeys, after_meeting, learning) — funnel keys render only when the funnel is enabled |
last_sent_local_day | Once-per-day send guard (YYYY-MM-DD, account tz) |
Baseline + anomaly inputs:
companies.knox.baseline_metrics— nightly rollup of normal ranges (refreshed byKnoxBaselineMetricsJob, ~02:00).companies.knox.alert_thresholds.*—rage_click_spike_count,intent_score_floor,visit_count_alert,anomaly_std_dev,form_abandonment_rate_alert,dead_click_threshold.
Behaviors & edge cases
- Anomaly detection is threshold-based today. When yesterday's metrics breach an
alert_thresholds.*value, the brief flags it. A full statistical anomaly-detection job is not yet built (theanomaly_std_devknob exists but the richer job is roadmapped). - Thresholds are crude. Large tenants with many baseline metrics can get noisy flags — tune
alert_thresholds.*. - Numbers match the dashboard by design (shared stats source) — if a brief number and a dashboard number disagree, that's a bug worth reporting.
- Empty-data days produce a brief that says so rather than fabricating activity.
Plan & limits
- Brief generation consumes AI credits each time it runs.
- Gated behind the Nox entitlement (Pro tier — verify).
- Not a replacement for the Dashboard; it's a once-a-day summary.
Technical implementation
- Delivery:
backend/app/jobs/DailyBriefEmailJob.js(10-min tick, once/local-day atsend_hour, EJS render,OFFER_VALIDITY_MS = 48h,OFFER_HOOKSblock→tool mapping). Offers persisted tobrief_offers(BriefOfferModel.js); read-time expiry onvalid_until, resolved viaKnoxBriefOfferController. - Composition:
ms-ai/src/knox-agent/services/knox-brief-snapshot.service.ts+knox-daily-brief-composer.service.ts+knox-insight-engine.service.ts(proactive insights) +knox-funnel-insights.ts(deterministic funnel blocks). - Tool wrappers:
tools/knox-daily-brief.tool.ts(knox_daily_brief) andtools/knox-brief-offers.tool.ts(knox_brief_offers). - Baseline cron:
KnoxBaselineMetricsJob(02:00) refreshes cohort/baseline metrics in backend. - Reads canonical backend stats endpoints (
/internal/knox/brief/{snapshot-data,sections,offers}); config fromcompanies.knox(see Company Configuration).
Related
- What is Nox · Tools · Capabilities
- Company Configuration — the
knox.*config block - Nox / Knox Admin Assistant — insight engine internals