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 theapi_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 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 is1. Required. -
Chatwoot URL: the address of your Chatwoot installation. Keep the default
https://app.chatwoot.comfor Chatwoot Cloud, or inform your own address when self-hosting, for examplehttps://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).
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.
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.
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.
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.Streams and Fields
Below you’ll find all available data streams from Chatwoot and their corresponding fields. API reference: developers.chatwoot.com.Account
Account
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: idAgents
Agents
Users that belong to the account (
GET /api/v1/accounts/{account_id}/agents), with their role and current presence.Primary key: idTeams
Teams
Teams used to group agents and route conversations (
GET /api/v1/accounts/{account_id}/teams).Primary key: idTeam Members
Team Members
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, idInboxes
Inboxes
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: idInbox Members
Inbox Members
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, idLabels
Labels
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: idCanned Responses
Canned Responses
Saved replies agents insert with a short code (
GET /api/v1/accounts/{account_id}/canned_responses).Primary key: idCustom Attribute Definitions
Custom Attribute Definitions
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: idAutomation Rules
Automation Rules
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: idAgent Bots
Agent Bots
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: idContacts
Contacts
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: idConversations
Conversations
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_atMessages
Messages
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: idCSAT Survey Responses
CSAT Survey Responses
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_atData 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 bumpslast_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 emptyagent_last_seen_atrather than a date in 1970. - Fields that hold a nested structure —
custom_attributes,additional_attributes,content_attributes,attachments,sender,working_hoursand others — are stored as JSON strings. Use your warehouse’s JSON functions to read inside them. Thelabelsfield of a conversation is the exception: it is a plain array of label titles. message_typeis translated from Chatwoot’s internal number to its name:incoming,outgoing,activityortemplate.