Skip to main content

Settings — Nox

Audience: Management · Sales · Support · QA · Engineering · Where in app: Settings → {Nox} Assistant (/settings/nox) · Plan availability: Requires Nox enabled for the account; company-level cards require the settings.organization permission

This screen controls how the Nox admin assistant behaves for your account: the morning Daily Brief email (send hour + which sections it includes), how Nox follows up with leads (channel + whether it can send without approval + the GoHighLevel contact-update policy), visitor-alert defaults, the registered watches Nox is holding, a per-user auto-play toggle for the spoken brief, and the list of durable memories Nox has saved about you. It mixes company-level settings (org-admin only) with personal preferences available to everyone.

The assistant name is white-labeled — the page reads "{Nox} Assistant" using the resolved brand name. This page is the settings surface for Nox; the assistant itself is documented under modules/nox and subsystems/nox-assistant.

What it does

  • Toggles the Daily Brief email (yesterday's leads/activity), sets its send hour, and picks which content sections it includes.
  • Sets the follow-up channel and whether Nox may send follow-ups without approval (off by default).
  • Sets the GHL contact-update policy for correcting linked GoHighLevel contacts when a visitor's real identity is later learned.
  • Sets visitor-alert defaults: identity confidence required to alert, auto-engage cooldown, and quiet-push outside business hours.
  • Per-user, this-device-only: auto-play daily brief when you first open Nox each day.
  • Lists and lets you delete durable memories Nox has saved about you.

How it works

The view (settings/nox/Index.vue) only applies when Nox is enabled for the org (company.knox.enabled === true); otherwise it shows a "Nox isn't enabled yet" card. Company-level cards render only with the settings.organization permission (canManageCompany); the per-user cards (auto-play, memories) are available to everyone.

Company settings are a vee-validate + zod Form saved via a dedicated endpoint PUT /company/<id>/nox-settings, which uses dot-path $set so it never clobbers the rest of the knox subdocument (counters, etc.).

Daily Brief

  • Daily Brief email toggle → knox.daily_brief.enabled (default true).

  • Send hourknox.daily_brief.send_hour (payload brief_send_hour, validated 0–20; model default 9, funnel-beta tenants are set to 5 when gated).

  • What to include (shown when enabled) → knox.daily_brief.sections.* (all default on):

    Section keyLabelIncludes
    statsDaily statsVisitor and lead counts
    captured_leadsCaptured leadsNew form submissions
    hot_leadsHot leadsHigh-intent returning visitors
    identified_visitorsIdentified visitorsOther named visitors
    ask_noxSuggested questionsPrompts you can ask next

    On funnel-beta tenants (nox_funnel_beta_enabled && nox_funnel.enabled) the funnel section keys (funnel_snapshot, funnel_pace, funnel_priorities, …) are appended to the checkbox group — see Nox Funnel. On save, unchecked sections are written as false (the payload sends an explicit boolean per known key).

Follow-ups (only when GHL is connected)

The Follow-ups card renders only if GoHighLevel is connected (company.go_high_level.access_token).

  • Follow-up channelknox.actions.channel_preference: auto (SMS then email), email, or sms. Default auto.

  • Let {Nox} send follow-ups without approvalknox.actions.autonomous_send (default false). Off = Nox drafts follow-ups for you to review/send. On = Nox sends email/SMS automatically. The AI phone call-back is a separate path and is not gated by this toggle.

  • Update GHL contacts with corrected identityknox.ghl_contact_update_policy:

    ValueLabelEffect
    created_onlyOnly contacts Nox createdCorrects only contacts Nox auto-created from enrichment; never overwrites a pre-existing contact (those are conflict-flagged). Default.
    allAll matched contactsAlso overwrites a pre-existing contact on a mismatch.
    offOff — don't update GHLNever writes corrected identity back to GHL.

Visitor alerts

Defaults for "watch this visitor / auto-engage on return" directives. Written under knox.visitor_watch:

ControlFieldOptions / rangeDefault in form
Identity confidence to alertmin_confidenceverified (only) or strong (match)verified
Auto-engage cooldown (hours)auto_engage_cooldown_hours0–1686
Quiet push outside business hoursquiet_push_outside_business_hourson/offon (holds mobile/desktop push; in-app alert still recorded)

The form initializes min_confidence to verified, while the CompanyModel schema default is strong. New accounts that never save this screen use the model default (strong); once saved, the chosen value (form default verified) is persisted. Note this when supporting "why did/didn't an alert fire."

Registered watches

Lists the visitor watches / auto-engage directives Nox registered from chat (getVisitorWatches / cancelVisitorWatchGET/DELETE /knox/visitor-watches, repository @/repositories/Knox/watches). Each row shows the person, type, and recurrence, with a cancel action.

My preferences (per-user, this device only)

  • Auto-play daily brief — speaks your brief automatically the first time you open Nox each day (at most once/day). Stored in localStorage via noxSettings store (autoPlayBrief, key kk_nox_settings); not synced across devices. When off (or already played today), a brief-ready badge on the Nox header replaces auto-play — the brief never auto-opens.

What Nox remembers (per-user)

  • Loads durable memories via getNoxMemories() and lists them with a type tag.
  • Forget removes one via deleteNoxMemory(id); failures are non-blocking (chat memory still works).

Configuration & options

PUT /company/<id>/nox-settings payload (company cards):

CardPayload key(s)
Daily Briefdaily_brief_enabled; brief_send_hour (0–20); brief_sections.{stats,captured_leads,hot_leads,identified_visitors,ask_nox,funnel_*}
Follow-ups (GHL only)channel_preference, autonomous_send, ghl_contact_update_policy
Visitor alertsvisitor_watch.{min_confidence, auto_engage_cooldown_hours, quiet_push_outside_business_hours}

The Follow-up keys are only included in the payload when GHL is connected.

Behaviors & edge cases

  • Nox disabled: the entire form is replaced by an "isn't enabled yet" card — nothing is editable.
  • Non-org-admins: see only the per-user cards (auto-play, memories); the company Form and Save button are hidden.
  • No GHL: the Follow-ups card (channel, autonomous send, GHL policy) is hidden entirely; those settings aren't editable until GoHighLevel is connected.
  • Cooldown bounds: auto_engage_cooldown_hours is validated 0–168 (a week).
  • Autonomous send is off by default and deliberately conservative (draft-and-approve) — the AI call-back path is independent of it.
  • Unsaved-changes guard: leaving with a dirty company form prompts to save (onBeforeRouteLeave + swal).
  • Auto-play is device-local — clearing browser storage resets it; it never affects the email brief.

Plan & limits

Requires Nox enabled for the account (company.knox.enabled) — a per-account capability rather than a generic plan flag. Company-level cards additionally require the settings.organization permission. Follow-ups depend on a connected GoHighLevel integration. The Daily Brief and follow-ups consume AI credits per the assistant's general behavior. Tier specifics (which plans include Nox / GHL action layer) are verify with product/pricing.

Technical implementation

  • View: frontend/src/views/settings/nox/Index.vue (vee-validate + zod)
  • Route: name settings-nox, path /settings/nox, no route-level permission (per-user cards open to all; company cards gated in-page via usePermissions().canAccess('settings.organization')) — frontend/src/router/index.js
  • Save endpoint: PUT /company/<id>/nox-settings (dot-path $set, preserves the rest of knox)
  • Per-user store: frontend/src/store/noxSettings.js (autoPlayBrief, localStorage)
  • Memory API: @/repositories/Knox/memory (getNoxMemories, deleteNoxMemory)
  • Company model: backend/app/models/CompanyModel.jsknox.daily_brief, knox.actions, knox.visitor_watch, knox.ghl_contact_update_policy (note visitor_watch.min_confidence model default is strong)
  • Brief generation/scheduling and visitor directives are produced by the Nox subsystem (see below). The send fires at knox.daily_brief.send_hour with a once-per-day guard (knox.daily_brief.last_sent_local_day); backend/app/jobs/DailyBriefEmailJob.js.
  • Watches list: @/repositories/Knox/watchesGET/DELETE /knox/visitor-watches (backend NoxActionUserController).
  • Funnel stage criteria/feeding/mapping live on a separate page — Settings → Nox Funnel (/settings/nox-funnel, views/settings/nox-funnel/Index.vue); see Nox Funnel.