Skip to main content

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:

  1. 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 replaced ReportingEmailJob (now unscheduled; the monthly reports_email defaults off for new companies).
  2. ms-ai's KnoxBriefSnapshotService builds 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.
  3. 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 to brief_offers (~48h validity). "Yes, do the first one" in chat/voice executes via the knox_brief_offers tool.
  4. The backend renders a locked EJS template and enqueues the email.
  5. 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:

FieldMeaning
enabledTurn the brief email on/off for the tenant (default on)
send_hourLocal 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_dayOnce-per-day send guard (YYYY-MM-DD, account tz)

Baseline + anomaly inputs:

  • companies.knox.baseline_metrics — nightly rollup of normal ranges (refreshed by KnoxBaselineMetricsJob, ~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 (the anomaly_std_dev knob 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 at send_hour, EJS render, OFFER_VALIDITY_MS = 48h, OFFER_HOOKS block→tool mapping). Offers persisted to brief_offers (BriefOfferModel.js); read-time expiry on valid_until, resolved via KnoxBriefOfferController.
  • 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) and tools/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 from companies.knox (see Company Configuration).