Nox Daily Brief
Audience: Sales · Management · Support · QA · Engineering · Where in app: Email (morning) + Dashboard banner · 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/or a dashboard banner, 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, and expired subscriptions. 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 brief no longer auto-opens — a brief-ready badge appears on the Nox header; the per-user auto-play preference (
noxSettings.autoPlayBrief, default on, once/day) gates spoken playback.
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