Skip to main content
Chatwoot is an open-source customer engagement platform that centralizes conversations from a website widget, WhatsApp, Instagram, Facebook, Telegram, email and a generic API channel into shared inboxes. The connector extracts those conversations and their full message history, the contacts behind them, and the account configuration — inboxes, agents, teams, labels and custom attributes — so you can analyse your customer conversations in your Lakehouse. The connector works with Chatwoot Cloud and with self-hosted installations; the only difference is the address you inform in the Chatwoot URL setting.

Configuring Chatwoot as a Source

In the Sources tab, click on the “Add source” button located on the top right of your screen. Then, select the Chatwoot option from the list of connectors. Click Next and you’ll be prompted to add your access.

1. Add account access

Chatwoot authenticates with a static user access token, sent in the api_access_token header. In Chatwoot, open your avatar in the bottom left corner, go to Profile Settings, scroll to Access Token and copy the value.
The token inherits the permissions of the user who owns it. An administrator token reaches every inbox, conversation and contact of the account; an agent token only reaches the inboxes that agent is assigned to, and Chatwoot denies access to the Agent Bots, Automation Rules and Inbox Members streams. Generate the token with an account administrator to sync the whole account.
The following configurations are available:
  • Access token: the user access token copied from Profile Settings > Access Token. Required.
  • Account ID: the numeric identifier of the account you want to sync. It is the number that appears in the application URL — in app.chatwoot.com/app/accounts/1/dashboard, the account ID is 1. Required.
  • Chatwoot URL: the address of your Chatwoot installation. Keep the default https://app.chatwoot.com for Chatwoot Cloud, or inform your own address when self-hosting, for example https://chat.yourcompany.com.
  • Initial sync date: the earliest date from which records will be synced. It applies to the streams replicated incrementally — Conversations (by last activity) and CSAT Survey Responses (by creation date).
Once you’re done, click Next.

2. Select streams

Choose which data streams you want to sync. For faster extractions, select only the streams that are relevant to your analysis. You can select entire groups of streams or pick specific ones.
Tip: The stream can be found more easily by typing its name.
The Messages stream is a child of Conversations: it fetches the message history of each conversation the run touched. Selecting it on an account with a long history makes the first extraction considerably longer, since every conversation is read from its first message.
If you don’t see a stream you were expecting to find, please check if your access token has access to it. Chatwoot’s Reporting Events and Audit Logs endpoints, for instance, exist only in the enterprise edition and are not covered by this connector.
Select the streams and click Next.

3. Configure data streams

Customize how you want your data to appear in your catalog. Select the desired layer where the data will be placed, a folder to organize it inside the layer, a name for each table (which will effectively contain the fetched data) and the type of sync.
  • Layer: choose between the existing layers on your catalog. This is where you will find your new extracted tables as the extraction runs successfully.
  • Folder: a folder can be created inside the selected layer to group all tables being created from this new data source.
  • Table name: we suggest a name, but feel free to customize it. You have the option to add a prefix to all tables at once and make this process faster!
  • Sync Type: Conversations and CSAT Survey Responses support INCREMENTAL; the remaining streams are full table. Read more about Sync Types here.
Once you are done configuring, click Next.

4. Configure data source

Describe your data source for easy identification within your organization, not exceeding 140 characters. To define your Trigger, consider how often you want data to be extracted from this source. This decision usually depends on how frequently you need the new table data updated (every day, once a week, or only at specific times). Optionally, you can define some additional settings:
  • Configure Delta Log Retention and determine for how long we should store old states of this table as it gets updated. Read more about this resource here.
  • Determine when to execute an Additional Full Sync. This will complement the incremental data extractions, ensuring that your data is completely synchronized with your source every once in a while.
Once you are ready, click Next to finalize the setup.

5. Check your new source

You can view your new source on the Sources page. If needed, manually trigger the source extraction by clicking on the arrow button. Once executed, your data will appear in your Catalog.
For you to be able to see it on your Catalog, you need at least one successful source run.

Streams and Fields

Below you’ll find all available data streams from Chatwoot and their corresponding fields. API reference: developers.chatwoot.com.
The Chatwoot account itself (GET /api/v1/accounts/{account_id}). A single row carrying the account’s locale, status, plan and feature flags.Primary key: id
Users that belong to the account (GET /api/v1/accounts/{account_id}/agents), with their role and current presence.Primary key: id
Teams used to group agents and route conversations (GET /api/v1/accounts/{account_id}/teams).Primary key: id
Membership rows linking each team to its agents (GET /api/v1/accounts/{account_id}/teams/{team_id}/team_members). Child stream of Teams.Primary key: team_id, id
The channels of the account — website widget, WhatsApp, Instagram, email, API and others (GET /api/v1/accounts/{account_id}/inboxes). Channel credentials that Chatwoot returns to administrators (IMAP/SMTP passwords, HMAC tokens, Twilio auth tokens) are deliberately not extracted.Primary key: id
Membership rows linking each inbox to the agents assigned to it (GET /api/v1/accounts/{account_id}/inbox_members/{inbox_id}). Child stream of Inboxes.Primary key: inbox_id, id
Labels available to tag conversations and contacts (GET /api/v1/accounts/{account_id}/labels). The title is what appears in the labels array of a conversation.Primary key: id
Saved replies agents insert with a short code (GET /api/v1/accounts/{account_id}/canned_responses).Primary key: id
Definitions of the custom attributes available on contacts and conversations (GET /api/v1/accounts/{account_id}/custom_attribute_definitions). Both models are extracted; attribute_key is the key that appears inside the custom_attributes JSON of contacts and conversations.Primary key: id
Rules that react to conversation and message events (GET /api/v1/accounts/{account_id}/automation_rules). Requires an administrator token — the stream is skipped with a warning otherwise.Primary key: id
Agent bots registered on the account (GET /api/v1/accounts/{account_id}/agent_bots). Requires an administrator token — the stream is skipped with a warning otherwise. The bot access token and signing secret are deliberately not extracted.Primary key: id
The people behind the conversations (GET /api/v1/accounts/{account_id}/contacts). Chatwoot exposes no modification date on contacts, so this stream is replicated in full on every run.Primary key: id
Conversations held with contacts across every inbox (GET /api/v1/accounts/{account_id}/conversations), in every status and for every assignee. Replicated incrementally on last_activity_at, which Chatwoot bumps on any change to the conversation — a new message, a status or assignee change, a label.Primary key: id · Replication key: last_activity_at
The full message history of a conversation, including the system activity notes (GET /api/v1/accounts/{account_id}/conversations/{conversation_id}/messages). Child stream of Conversations: an incremental run only re-reads the conversations that saw activity since the last sync.Primary key: id
Answers contacts gave to the satisfaction survey sent when a conversation is resolved (GET /api/v1/accounts/{account_id}/csat_survey_responses). Only inboxes with csat_survey_enabled produce rows.Primary key: id · Replication key: created_at

Data Model

Conversations is the core entity: every conversation belongs to a contact and to an inbox, and carries the messages exchanged in it. Agents, teams and labels describe who handled the conversation and how it was classified.

Implementation Notes

Incremental replication of conversations

Chatwoot offers no “modified since” filter on the conversations list, but it does return conversations sorted by last activity, newest first. An incremental extraction therefore reads from the most recent conversation and stops as soon as it walks past the point reached in the previous run. Because Chatwoot bumps last_activity_at on every change to a conversation — a new message, a status or assignee change, a label — no update is missed. The Messages stream follows along: only the conversations that saw activity since the last run have their history re-read, and messages are matched on their identifier, so re-reading a conversation never duplicates rows.

Timestamps and nested fields

  • Chatwoot returns timestamps as Unix epochs and represents an absent timestamp as 0. The connector converts them to proper datetimes in UTC and turns those zeros into empty values, so a conversation that was never opened by an agent shows an empty agent_last_seen_at rather than a date in 1970.
  • Fields that hold a nested structure — custom_attributes, additional_attributes, content_attributes, attachments, sender, working_hours and others — are stored as JSON strings. Use your warehouse’s JSON functions to read inside them. The labels field of a conversation is the exception: it is a plain array of label titles.
  • message_type is translated from Chatwoot’s internal number to its name: incoming, outgoing, activity or template.

Credentials are never extracted

Chatwoot returns channel credentials to administrator tokens — IMAP and SMTP passwords, HMAC tokens, Twilio auth tokens and agent bot access tokens. None of them are part of the extracted schemas, so they never reach your Lakehouse.

Rate limits

Chatwoot throttles requests per IP address (3000 requests per minute by default, configurable on self-hosted installations). The connector respects the limit, waits the interval Chatwoot asks for when it is reached, and retries automatically.