How rumblebuilt.com handles inbound chat and forms: route map, guardrails at each stop, AI drafts, Postmark mail, and durable cases for the team — with forms as a full-page option when visitors prefer them.
Site agents replace third-party form dump mailers. Visitors still use the same Signal, Support, Investors, beta, survey, and grant UIs — or talk through intake in Ask chat.
Traffic lands on /api/comms/* (marketing-inline on Vercel). Agents draft replies; Postmark sends mail; Supabase holds cases, messages, and journeys for ops.
Most lanes auto-send the visitor ack after output guardrails pass. Higher-risk lanes (investor, grant, security/legal/pricing signals) stay pending approval in /ops until a teammate releases them. Agents speak as Rumble Built (we / our). Unpublished facts are declined plainly — never invented.
Floating “Ask” on key pages. Answers FAQ, finds pages, and walks intake like a teammate (one question at a time, choice chips — not a dumped multi-field form). Optional “Prefer the form page” chip opens Support / Signal / beta HTML. Quick actions: Submit ticket, Send Signal, and Beta. Panel stays open across same-tab navigation until Close / Escape. Name and email can be remembered on-device (Clear chat to forget).
Full-page forms remain the backup UI. Client script rumble-form-submit.js posts to /api/comms/ingress. Chat and forms share the same agent + Postmark + case store path.
Every public entry converges on the same policy spine, then fans out to draft, send, and durable storage.
Web forms, Ask FAB, email replies, mailbox, and delivery webhooks all enter API routes, pass a shared policy spine (validate, rate limit, policy, case, agent), then reach Postmark, Supabase, and the ops inbox.
Eight stops in order: Validate, Rate limit, Policy, Case, Agent, Guardrails, Risk tier, Outbox.
Each stop either soft-filters, hard-blocks, or rewrites before anything reaches the visitor inbox.
Request enters validate and rate limit. Policy may soft-filter honeypot or hard-block grant and own-domain loops. Case is written, agent drafts, output guardrails either pass or swap a safe template. Risk tier either auto-sends or holds for ops approval, then outbox.
Visitor submit through reply digest — same spine, with a human in the loop at the end.
Submit to ingress, audit checklist, agent draft, guard and case and Postmark, inbound reply digest, then human follow-up. Replies re-enter inbound.
Each form posts a lane so the agent knows which checklist and tone to use.
| Lane | Page | Agent focus | Notify |
|---|---|---|---|
| signal | /contact#signal | Fit + clarifying questions (goal, timeline, budget band, build vs advisory) | info@ |
| support | /support | Ack ticket; ask for repro / env / urgency if missing | support@ |
| investor | /investors | Short ack; link investors + NDA; never invent metrics | investors@ |
| beta | /beta-testers | Thank + no access promises | info@ |
| survey | /survey | Short thanks for feedback | info@ |
| grant | /impact/community-grant | Ack application; no funding promises | info@ |
Internal notify and visitor confirmation emails both include a Form fields block with the same labels as the website forms (empty optional fields shown as not provided). Chat intake is rejected until required form fields are collected.
Branded HTML confirmation (logo, lane eyebrow, body, CTA, labeled submission table). Plain-text multipart still included for clients that prefer it.
Same brand shell with denser ops layout: form fields table, intake brief, primary message, and the visitor draft that was sent. Subject like [Form signal] unclear · Jane Doe.
When a visitor replies (Postmark Inbound → /api/comms/inbound), the team gets a branded digest: short summary, highlighted answered questions / changed fields / still-missing gaps, recommended next step, and the stripped reply. Subject like [Reply signal] Jane Doe. Requires POSTMARK_INBOUND_REPLY_TO + inbound webhook secret.
get_offering) — product/service blurbs with deep linksfind_page) — official URLs / hubsread_public_page) — any login-free rumblebuilt.com page (Privacy, Services, Field Notes, product details, …). Denied: portals, APIs, internal-only pathsread_visitor_url) — when someone shares their company/product URL for intake context; public https only, SSRF-hardened (no private/internal hosts). Not a general web crawler. Extracts are stored on the case/session timeline (visitor_url_fetch)submit_intakereply + choice buttons; conversational Q&A (forms stay on the full pages as an option)intent=pricing_listsecurity@ or privacy page; never handle vulns or DSR dumps in chatget_status)Forms stay as a backup UI if chat intake fails or they prefer a full page wizard.
lib/site-form-intake.ts, lib/site-chat.ts, routes under /api/comms/*. Inline is the production path.OPENAI_API_KEY); optional OPENAI_VECTOR_STORE_ID for file search. Output guardrails run before visitor email sends.POSTMARK_SERVER_TOKEN + From addresses above)./api/comms/inbound with header X-Comms-Secret (COMMS_INBOUND_SECRET); query ?secret= is deprecated. Set POSTMARK_INBOUND_REPLY_TO.NEXT_PUBLIC_SUPABASE_URL + server-only SUPABASE_SERVICE_ROLE_KEY). Full message timeline, submissions, contacts, chat sessions, and consent-gated journey events. Memory fallback when unset./ops with case timeline + site journey (COMMS_OPS_SECRET). Risk tiers: auto receipts vs approval for investor/grant/security/legal/pricing.COMMS_URL proxy to apps/comms is off unless COMMS_USE_REMOTE=1 and URL is a public host (never localhost).Related: Privacy (how we describe site intake) · Security · Support · Signal.
Try the live Ask FAB on the home page, or transmit a Signal to see the brief land in info@.
Open Signal