Chatwoot Setup
Chatwoot provides the support chat backend for FrameWorks. Deckhand integrates with Chatwoot to enable customer messaging from the webapp.
Initial Setup
Section titled “Initial Setup”After starting Chatwoot for the first time:
1. Create Admin Account
Section titled “1. Create Admin Account”Visit http://localhost:18092 when using the local FrameWorks compose stack
(or your deployed Chatwoot URL) and complete the setup wizard to create your
admin account. Chatwoot still listens on port 3000 inside its container; the
FrameWorks compose and Ansible defaults expose it on host port 18092.
2. Get API Token
Section titled “2. Get API Token”- Click the profile icon (bottom-left corner)
- Go to Profile Settings
- Copy the Access Token value
- Set it in your environment:
Terminal window CHATWOOT_API_TOKEN=your-token-here
3. Create API Inbox
Section titled “3. Create API Inbox”- Go to Settings → Inboxes
- Click Add Inbox
- Select API as the channel type
- Name it
FrameWorks Support - Complete the wizard
Note the inbox ID from the URL (e.g., /app/accounts/1/settings/inboxes/1 → inbox ID is 1).
4. Add Custom Attributes
Section titled “4. Add Custom Attributes”Go to Settings → Custom Attributes and add each of these:
| Applies to | Display Name | Key | Type | Description |
|---|---|---|---|---|
| Conversation | Tenant ID | tenant_id | Text | Customer tenant identifier |
| Conversation | Page URL | page_url | Link | Page where conversation started |
| Conversation | Subject | subject | Text | Conversation subject line |
Deckhand writes these as conversation custom attributes when it creates a
support thread. Contacts are matched using the contact source_id; no contact
custom attributes are required for the current integration.
5. Configure Webhook
Section titled “5. Configure Webhook”- Go to Settings → Integrations → Webhooks
- Click Configure then Add new webhook
- Set the URL:
- Ansible Docker Chatwoot + native Deckhand:
http://host.docker.internal:18015/webhooks/chatwoot - Same Docker network for both services:
http://deckhand:18015/webhooks/chatwoot
- Ansible Docker Chatwoot + native Deckhand:
- Check these events:
conversation_createdconversation_updatedmessage_createdmessage_updated
- Click Create Webhook
Environment Variables
Section titled “Environment Variables”# RequiredCHATWOOT_SECRET_KEY= # Chatwoot Rails secret; compose requires it, Ansible can generate itCHATWOOT_API_TOKEN= # From step 2 above; Deckhand requires it
# Defaults (usually don't need to change for docker-compose)CHATWOOT_HOST=chatwootCHATWOOT_PORT=3000CHATWOOT_ACCOUNT_ID=1CHATWOOT_INBOX_ID=1For production GitOps deployments, set CHATWOOT_FRONTEND_URL,
CHATWOOT_ACCOUNT_ID, CHATWOOT_INBOX_ID, and CHATWOOT_API_TOKEN in the
shared environment after creating the Chatwoot account and API inbox.
How It Works
Section titled “How It Works”- User opens support chat in webapp
- Webapp sends message to Bridge GraphQL API
- Bridge forwards to Deckhand gRPC service
- Deckhand creates/finds contact in Chatwoot (using
tenant_idassource_id) - Deckhand creates conversation with custom attributes
- Chatwoot webhook notifies Deckhand of agent replies
- Deckhand broadcasts to webapp via Signalman
Troubleshooting
Section titled “Troubleshooting”Empty conversations list: Contact’s source_id doesn’t match tenant ID. Edit the contact in Chatwoot and set source_id to the tenant’s UUID.
Webhook not firing: Verify the webhook URL is reachable from the Chatwoot
container. For the Ansible Docker stack, use
http://host.docker.internal:18015/webhooks/chatwoot.
“Inbox not found” errors: Ensure CHATWOOT_INBOX_ID matches the inbox you created.