Phase 1 · Messaging

Own the conversation layer without rebuilding the inbox from scratch

This slice replaces the part of GHL clients actually feel: clean message history, human takeover, AI pause/resume, and tenant-level context wrapped around a proven inbox surface.

Inbox UX

Chatwoot

Workflow brain

Inngest

State store

Postgres

Open threads

27

+6 since Monday

AI containment

81%

Healthy for SMS-first v1

Human takeovers

5

Mostly pricing + scheduling

Unread client-facing

9

2 need same-night follow-up

Architecture call

Why this stack

Chatwoot owns inbox UX. Agents and clients need reliable thread handling, assignment, read state, and reply ergonomics now — not after we spend weeks rebuilding a commodity UI.

Osprey CRM owns business state. Tenant config, AI control, escalation rules, booking intent, and CRM-grade events belong in our app and database because that’s where the product edge is.

Inngest is the workflow spine. Every inbound message can become a typed event: score for takeover, draft AI reply, sync notes, trigger booking flow, or create a task — cleanly and repeatably.

Recommended

Pilot rollout order

  1. 1. Deploy dedicated Chatwoot host + wire one Twilio number.
  2. 2. Mirror inbound/outbound SMS into Postgres via Chatwoot webhook.
  3. 3. Enable AI assist mode first, not full autopilot.
  4. 4. Give one friendly client a login and confirm thread clarity.
  5. 5. Add human takeover, booking handoff, and tenant controls before scaling.

Operational view

Threads that need eyes tonight

Inngest lanes

Automation health

Chatwoot → AI triage

healthy

Inbound SMS mirrored into Osprey state store and scored for human takeover.

Last run 12h ago

Missed-call follow-up

healthy

Voice agent event opened SMS thread and responded with callback acknowledgment.

Last run 12h ago

Booking escalation

attention

Waiting on production calendar-confirmation wiring before fully hands-off booking.

Last run 16h ago