FixControl/Documentation

User Guide

Auto-reply

Policy-based AI replies for the Inbox — suggest, draft, or send, gated by per-mailbox guardrails.

What it is

Auto-reply is the AI layer in front of the Inbox. On every inbound message the AI classifies the thread, drafts a reply, and runs the result through a policy. The policy decides what happens next: a suggestion, a draft for you to approve, or a send — never anywhere except where you opted in.

There is no global "AI may mail" toggle. Autonomy is policy-scoped per mailbox + category, defaults to suggest_only, and never auto-sends out of the box. Admins can additionally set an organization-wide ceiling under Governance → Customer Communication: when enabled it can only further restrict auto-send (by mode, confidence threshold, allowed channel, or restricted topic) — it never loosens a mailbox's own policy.

Settings — Inbox AI policy
Settings — Inbox AI policy

Mode ladder

ModeWhat it does
offAI does nothing for matching messages — no suggestion, no draft, no send.
suggest_onlyAI surfaces a suggestion in the inbox detail panel. No draft is written.
auto_draftAI saves an outbound draft against the thread. The operator approves and sends.
auto_send_low_riskAI sends if every guardrail passes. Otherwise downgrades to auto_draft.

The ladder is monotonic: a higher mode includes the behaviour of the lower modes. New policy rows default to suggest_only.

Scope

Each policy is scoped by mailbox scope and optionally a single category:

  • Mailbox scope is a logical mailbox group. all is the tenant-wide default; named scopes (e.g. support, billing) match against the inbound mailbox's tag set.
  • Category narrows further to a single category. Leave it empty for "any category in this mailbox scope".

FixControl picks the most specific match (mailbox + category) and falls back to broader scopes (mailbox-only, then all). Exactly one default policy is allowed per mailbox scope.

A mailbox can also pin a default policy directly in Settings → Inbox mailboxes when you want the binding explicit.

Guardrails

When the matched policy is auto_send_low_risk, every guardrail below has to pass. Any failure downgrades the outcome to auto_draft (or suggest_only if drafting is also blocked). The result is recorded on the suggestion row so the operator can see why.

GuardrailWhat it checks
Minimum confidenceAI confidence ≥ min_confidence (default 0.90, range 0.5–1.0).
KB groundingAt least one knowledge-base / similar-issue source backs the reply. Only enforced for auto-send.
Intent allowlistInferred intent is in allowed_intents (empty = any non-blocked).
Intent / category blocklistIntent is not in blocked_intents; category is not in blocked_categories.
Hard-blocked intentsFloor enforced regardless of policy: bug, feature, legal, billing_dispute, security, refund, escalation never auto-send.
Office hoursCurrent time falls inside the configured timezone / days / from / to window. Leave unset for 24/7.
Per-thread rate limitNumber of AI replies already sent on this thread in the trailing 24h is below max_auto_replies_per_thread_per_day.
Disclosure footerIf Require disclosure is on, the generated body must contain your disclosure text verbatim.

Operators can read the full picture on the suggestion: every guardrail result is shown along with a final outcome of suggest_only / draft / send / blocked.

What the operator sees

The detail pane carries the AI block when a suggestion exists:

  • Confidence (0–100%) and risk (low / medium / high) badges.
  • Intent + suggested action (e.g. "answer FAQ", "ask follow-up question").
  • Suggested reply — full body, editable before send.
  • Sources — knowledge-base chunks and similar past issues that backed the reply, with links.
  • Why this outcome — the guardrail results, including which one held the message back. If auto-send was downgraded to draft, the reason is right there ("require_kb_grounding: no sources matched").

When a policy holds a reply back, the thread status flips to AI drafted and the row carries that signal in the queue. Filter by AI drafted to clear the backlog.

Setup

Open Settings → Inbox AI policies and create a row. Defaults are conservative:

  • Mailbox scope: all
  • Mode: suggest_only
  • Minimum confidence: 0.90
  • Require KB grounding: on
  • Max auto-replies per thread per day: 1

Tighten or widen from there. Common patterns:

GoalSettings
Surface AI suggestions only, no draftingMode: suggest_only
Pre-write drafts on support@, never sendMailbox scope: support, Mode: auto_draft
Auto-send simple FAQ answers in office hoursMode: auto_send_low_risk, Allowed intents: faq, qa, Minimum confidence: 0.92, office hours set, KB grounding on
Block AI on a sensitive categoryNew row scoped to that category, Mode: off

Audit

Every step writes an event on the thread:

EventWhen
ai_suggestion_createdThe AI ran and stored a suggestion.
ai_policy_matchedThe evaluator picked a policy + outcome.
ai_auto_draft_createdA draft was written off the back of auto_draft (or a downgraded auto_send).
ai_auto_send_blockedA guardrail held the send back. The reason is in the metadata.
ai_auto_reply_sentThe AI actually sent a reply via the mailbox provider.
ai_suggestion_acceptedAn operator accepted the suggested reply.
ai_suggestion_rejectedAn operator dismissed the suggestion.

Bodies and tokens never land on the audit events themselves — the full reply lives on the suggestion and the outbound draft, both tenant-scoped like everything else in the inbox.

Sending

When auto-send fires, it goes out via the same Gmail / Office 365 mailbox connection your operator sends use — there is no second outbound channel. A mailbox without a working provider cannot auto-send; the policy outcome downgrades to draft and records provider_unavailable in the guardrail results, so the operator can see why.

Drafts created by the AI are flagged in the UI ("This draft was written by AI"), and the rate limit counts AI-driven sends per thread per day separately from operator sends.

Common mistakes

  • Auto-send on every category. Don't. Pick a narrow scope (one category, one mailbox) and watch the audit for a week before you widen.
  • High confidence ≠ safe to send. Risk is a separate axis. A confident reply on a refund intent still gets blocked because that intent is hard-floor blocked.
  • Disclosure footer not appearing. The check is literal. If the body doesn't contain your disclosure text exactly (whitespace included), the send is held back.
  • Office hours misset. Days run Monday through Sunday. Use the timezone of the team that owns the mailbox, not UTC, unless your team really runs UTC.

FAQ

Can I disable the AI entirely? Yes — set every relevant policy to mode off, or delete the policies. With no policy at all the inbox defaults to suggest_only for every message.

Can I retract an auto-sent reply? No. Configure auto-send conservatively and watch the audit; the rate limit stops a runaway loop after the first message per thread per day.

Why did my AI reply land as a draft instead of going out? A guardrail blocked it. Open the suggestion in the detail pane and read the guardrail results — the failing one carries a reason.

Does the AI reply in the customer's language? Yes. The classifier infers the language from the inbound message and the reply matches it.

Anything unclear or wrong?Let us know →

FixControl is a trade name of FixControl B.V. i.o.