Plain logo

Integrate Plain with your AI CRM

Plain is a collaborative support platform for B2B support teams, offering a modern, AI-powered interface to consolidate support channels and assist customers efficiently.

Explore Triggers and Actions

Customer Event

Fires when a customer in Plain is created, updated or deleted. `event_type` says which it was, `created`, `updated` or `deleted`, in the same vocabulary the config filters on — so a single subscription to all three can branch downstream without matching on Plain's raw event names. Group membership changes are a separate slug, `customer_group_membership_changed`.

TriggerwebhookTry it

Customer Group Changed

Fires when a customer group is created, edited or deleted in Plain.

TriggerwebhookTry it

Customer Group Membership Changed

Fires when a customer is added to or removed from a customer group in Plain. Use it to re-segment a customer downstream the moment their grouping in Plain changes — move them onto a different plan's onboarding, change who gets paged for their threads, sync the new segment into your CRM. `change` says which direction it was, `added` or `removed`, straight from Plain. Which group it was is the one that differs between `customer.customer_group_memberships` and `previous_customer.customer_group_memberships`, both of which carry the customer's full membership list.

TriggerwebhookTry it

Thread Created

Fires when a new support thread is opened in Plain.

TriggerwebhookTry it

Thread Custom Field Updated

Fires when one of your own thread fields is set, changed or cleared on a Plain thread.

TriggerwebhookTry it

Thread Message Received

Fires when an inbound message arrives on a Plain thread. Covers email, in-app chat, Slack, Discord and Microsoft Teams, and each channel ships its own message shape, so read `channel` before reading `message`. For the replies your own team sends out, use the Thread Message Sent trigger instead.

TriggerwebhookTry it

Thread Message Sent

Fires when your team sends a message out on a Plain thread. Covers email, in-app chat, Slack, Discord and Microsoft Teams, and each channel ships its own message shape, so read `channel` before reading `message`. Editing a Slack or Discord message afterwards does not fire it again, and for messages arriving from the customer use the Thread Message Received trigger instead.

TriggerwebhookTry it

Thread Note Created

Fires when an internal note is added to a thread in Plain. Carries no `mentions`: Plain only reports them on its separate mention event, which is `PLAIN_THREAD_NOTE_MENTIONED`. Subscribing to both slugs delivers every mentioning note twice, under two different event ids.

TriggerwebhookTry it

Thread Note Mention Created

Fires when an internal note mentions a machine user in Plain. The only event that carries `mentions`. The raw `<@mu_…>` markup is not guaranteed in either `note.text` or `note.markdown`, so this slug — not scanning the note body — is how a consumer learns who was mentioned. Plain publishes such a note twice, here and as `thread.note_created`, so subscribing to both this and `PLAIN_THREAD_NOTE_CREATED` delivers it twice, under two different event ids.

TriggerwebhookTry it

Thread Properties Updated

Fires when a thread's status, assignee, priority or labels change in Plain. Every event carries the thread's new state alongside its state immediately before the change, and names which of the four properties changed. Assignment events also cover reassignment, so both sides can be populated.

TriggerwebhookTry it

Thread Tenant Updated

Fires when a thread's tenant is set, changed or cleared in Plain. Plain also sends this event when a thread's tenant is reapplied without changing, in which case both sides hold the same tenant or both are null.

TriggerwebhookTry it

Add Customer To Group

Add a customer to up to 25 customer groups. Existing memberships are skipped, and the response contains only newly created memberships.

ActionTry it

Add Customer To Tenants

Idempotently add a customer to one or more tenants.

ActionTry it

Add Generated Reply

Add a suggested reply for teammate review without sending it to the customer.

ActionTry it

Add Labels To Thread

Add one or more labels to a thread by label-type ID.

ActionTry it

Add Members to Tier

Add or move up to 25 tenants or companies into one tier.

ActionTry it

Apply or Clear Thread SLA Policy

Apply an SLA policy, or clear it so the thread falls back to its tier's SLAs.

ActionTry it

Archive Label Type

Archive a label type while preserving labels already on threads.

ActionTry it

Bulk Delete Thread Fields

Sequentially delete thread-field values by thread and schema key. Deletions are non-atomic; an interrupted call can leave earlier deletions committed without returning all item results.

ActionTry it

Bulk Set Thread Fields

Create or replace multiple typed thread-field values.

ActionTry it

Change Thread Assignment

Assign or unassign a thread's primary assignee, or add or remove additional assignees. For AI-agent assignment, LIVE allows customer replies while SHADOW observes without sending customer replies.

ActionTry it

Create Attachment Download URL

Create a sensitive three-minute URL and return its virus-scan result. Download or process the file only when attachmentVirusScanResult is CLEAN. Treat INFECTED as unsafe, FAILED or PENDING as not cleared, and null as unscanned; do not fetch or expose the file in any of those states. Do not log or share the URL.

ActionTry it

Create Attachment Upload Form

Create a sensitive, two-hour presigned upload capability; no file is uploaded. Do not log or share uploadFormUrl or uploadFormData. Next, POST multipart/form-data directly to uploadFormUrl with every uploadFormData key/value as a form field and the exact binary file in the form field named `file`. After that upload succeeds, pass the returned attachment.id to a compatible message or note action.

ActionTry it

Create Autoresponder

Create an autoresponder that automatically sends outbound customer replies. Enabled autoresponders can send irreversible external messages when new threads match. Plain permits at most 25 autoresponders per workspace and delays up to 900 seconds.

ActionTry it

Create Customer Group

Creates a new customer group in Plain for organizing and segmenting customers. Customer groups allow you to categorize customers (e.g., by pricing tier, feature access, or support level) and manage them more effectively in your support workflow. Each group has a unique key, display name, and visual color for easy identification. Use this when you need to create a new customer segment for organization or filtering purposes.

ActionTry it

Create Customer Or Thread Event

Create a custom customer-wide or single-thread timeline event.

ActionTry it

Create Email/Slack Discussion

Immediately and irreversibly start an external EMAIL or SLACK discussion. EMAIL delivers the first message to every emailDetails.toAddresses recipient and optional ccAddresses recipient. SLACK posts it to the connected channel selected by slackDetails.connectedSlackChannelId. Live provider authorization requires threadDiscussion:create, although the current operation page omits it.

ActionTry it

Create Label Type

Create a label type that can be applied to threads.

ActionTry it

Create Note

Create an internal note on an existing customer thread. Plain's live API currently rejects customer-level notes without threadId even though the current GraphQL SDL marks that input nullable.

ActionTry it

Create SLA Policy

Create a named SLA policy with zero or more unique target types.

ActionTry it

Create Snippet

Create a reusable plain-text and optional Markdown reply snippet.

ActionTry it

Create Task

Create a task with optional company, tenant or account context and an optional assignee. Tenant and account IDs may be supplied together; a company ID cannot be combined with either.

ActionTry it

Create Thread

Create a thread after obtaining a valid customer identifier. Creating a thread can trigger a configured autoresponder, which sends an external reply to the customer; that outbound message cannot be recalled.

ActionTry it

Create Thread Field Schema

Create a custom thread-field schema.

ActionTry it

Create Tier

Create a support tier, optionally assigning tenant or company members.

ActionTry it

Create Tier SLA

Create one legacy tier SLA; next-response requires a first-response SLA on the tier.

ActionTry it

Delete Autoresponder

Permanently delete a native autoresponder.

ActionTry it

Delete Customer

Permanently and irreversibly deletes a Plain customer by ID, including all associated threads, timeline entries, and other customer data. Deletion runs asynchronously. Confirm the destructive operation before calling.

ActionTry it

Delete Customer Group

Permanently delete an empty customer group after confirmation.

ActionTry it

Delete Note

Soft-delete an internal note.

ActionTry it

Delete SLA Policy

Delete an SLA policy, its targets, and their trackers. Threads using the deleted policy fall back to their tier's SLAs.

ActionTry it

Delete Snippet

Soft-delete a snippet while preserving historical references.

ActionTry it

Delete Task

Soft-delete a task and remove its thread links.

ActionTry it

Delete Tenant

Delete a tenant, unlink its customers, and remove its field values. Existing threads retain a reference to the tenant deletion record but are no longer routed through that tenant.

ActionTry it

Delete Tenant Field Schema

Permanently delete a tenant-field schema and all values stored against it.

ActionTry it

Delete Tenant Field Value

Clear one tenant field value without deleting its schema.

ActionTry it

Delete Thread

Permanently delete a thread and all associated data.

ActionTry it

Delete Thread Field Schema

Delete a schema and all values stored against it.

ActionTry it

Delete Tier

Permanently delete a tier and all of its memberships. The live API also requires serviceLevelAgreementBreachAction:delete, including when the tier does not exist. Plain's API-key UI grantability for that permission is currently unknown.

ActionTry it

Delete Tier SLA

Delete a legacy SLA from a tier. A first-response SLA cannot be deleted while the tier still has a next-response SLA; delete the next-response SLA first.

ActionTry it

Delete User

Permanently removes a Plain workspace user by ID. Their threads remain but become unassigned. Plain rejects deletion when the user is the workspace's only owner, so assign another owner first. Confirm this destructive operation.

ActionTry it

Escalate Thread Or Select Path

Advance a thread's escalation or attach/detach its escalation path.

ActionTry it

Fetch Company

Tool to fetch company details by ID. Use when you need the full profile of a company, including name, domain, contract value, owner info, and timestamps.

ActionTry it

Fetch Issues

Fetches external issue tracker links (Jira, Linear, GitHub, etc.) associated with a customer's threads. Returns a bounded, flattened snapshot of issue links across the customer's threads, including thread context. With defaults, it examines up to 50 threads and 50 links per thread; results may be truncated at either limit.

ActionTry it

Fetch Tier

Fetch a tier by ID. Set include_details=true to include memberships and SLA configuration, which require additional permissions.

ActionTry it

Get Autoresponder

Fetch a native Plain autoresponder by ID through a machine-user-safe list query. Returns no result when the list is exhausted without a match; fails if pagination cannot be exhausted within 25 pages.

ActionTry it

Get Customer By Email

Fetch customer details by email address. Returns customer information if found, or null if no customer exists with that email.

ActionTry it

Get Customer By External ID

Fetch a customer by the exact stable external ID from your own system.

ActionTry it

Get Customer By ID

Retrieve a customer's ID, full name, email address, and creation and update timestamps by customer ID.

ActionTry it

Get Customer Group

Fetch one customer group by its Plain ID. Plain's live API requires customerGroup:read for this query.

ActionTry it

Get Customers

Tool to fetch a list of customers. Use when retrieving multiple customer records with pagination, filtering, or sorting.

ActionTry it

Get Email/Slack Discussion

Fetch metadata for one EMAIL or SLACK side-conversation by ID. Live provider authorization requires threadDiscussion:read, although the current public operation page does not state that permission.

ActionTry it

Get Knowledge Gap

Fetch one AI-detected knowledge gap and its linked task and signals.

ActionTry it

Get Label Type

Fetch one label type by Plain ID or external ID.

ActionTry it

Get SLA Policy

Fetch one SLA policy by its Plain ID.

ActionTry it

Get Snippet

Fetch one snippet by ID, including a soft-deleted snippet.

ActionTry it

Get Task by ID or Ref

Fetch one task by either its Plain ID or human-readable T-123 ref.

ActionTry it

Get Tenant

Fetch one tenant by its Plain ID, including current custom field values.

ActionTry it

Get Thread By ID

Fetch a thread by ID, including customer info, status, priority, labels, and assignments. If not found, the thread field in the GraphQL response is null.

ActionTry it

Get Thread By Reference

Fetch a thread by ref or by its customer-scoped external ID.

ActionTry it

Get User By ID

Fetch workspace user/team member by ID. Returns detailed information about a workspace team member including their name, email, status, and avatar. Note: This fetches workspace users (team members), not customers. Use GET_CUSTOMER_BY_ID for customer data.

ActionTry it

Import Thread

Import one historical thread without triggering SLAs or autoresponders.

ActionTry it

Import Thread Messages

Import up to 25 historical messages and return one result per input message. Reusing a message externalId is idempotent and returns NOOP. The batch is non-atomic: successful messages remain committed when others fail, with per-message results and a top-level bulk_partial_failure error. Attachments require previously uploaded IDs.

ActionTry it

List AI Feedback

List feedback submitted on Plain AI features, optionally filtered by feature, sentiment, or time.

ActionTry it

List Autoresponders

List native Plain autoresponders in priority order.

ActionTry it

List Customer Groups

List one paginated page of customer groups with optional external-ID filtering.

ActionTry it

List Deleted Threads

List deletion-audit records for threads.

ActionTry it

List Email/Slack Discussions

List only EMAIL and SLACK side-conversations with filters and pagination. Live provider authorization requires threadDiscussion:read, although the current public operation page does not state that permission.

ActionTry it

List Generated Replies

List current suggested replies for a thread's most recent inbound message.

ActionTry it

List Knowledge Gaps

List AI-detected knowledge gaps with status filters and useful sort orders.

ActionTry it

List Label Types

List active and/or archived label types.

ActionTry it

List SLA Policies

List named SLA policies, optionally filtering by name or target type.

ActionTry it

List Snippets

List the workspace snippet library with cursor pagination.

ActionTry it

List Tasks

List workspace tasks with pagination, filtering, and sorting.

ActionTry it

List Tenant Field Schemas

List tenant-field schemas before reading or writing custom values.

ActionTry it

List Tenants

List tenants with current filters and cursor pagination.

ActionTry it

List Thread Field Schemas

List the workspace's custom thread-field schemas.

ActionTry it

List Threads

Retrieve up to 50 threads from one page, optionally filtered by status. Omit the cursor for the first page and pass the returned end cursor to fetch the next page.

ActionTry it

List Threads (Deprecated)

DEPRECATED: Use PLAIN_PLAIN_QUERY_THREADS instead. Lists one page of threads (support conversations) in Plain. Returns thread summaries including ID, reference, title, status, and priority. Use this action to: - Get an overview of a page of threads in the system - Fetch threads with pagination for large datasets - Find threads by browsing through the list Pagination: Use 'first' for forward pagination (newest first) or 'last' for backward pagination (oldest last). For paginated results, use the cursors from pageInfo (endCursor/startCursor) with 'after'/'before' parameters. If no pagination parameters are provided, returns the provider's default first page.

ActionTry it

List Threads By External ID

List a page of threads with an external ID across all customers.

ActionTry it

List Threads With Rich Filters

List threads with the provider's complete public filter and sort surface.

ActionTry it

List Tiers

List tiers with cursor pagination. Set include_details=true to include memberships and SLA configuration, which require additional permissions.

ActionTry it

Mark Customer As Spam

Idempotently hide a customer's threads as spam and exclude them from metrics.

ActionTry it

Remove Customer From Group

Removes a customer from one or more customer groups in Plain. Use this action to revoke customer group memberships. The customer must be a member of the specified group(s) - attempting to remove a customer from a group they're not in will result in an error. Groups can be identified by their Plain internal ID (customerGroupId), unique key (customerGroupKey), or external ID (externalId). Common use cases: - Downgrade customer tier (e.g., remove from premium_tier group) - Remove customer from beta access groups - Clean up group memberships after customer status changes

ActionTry it

Remove Customer From Tenants

Idempotently remove a customer from one or more tenants.

ActionTry it

Remove Labels From Thread

Remove one or more concrete labels from a thread.

ActionTry it

Remove Members from Tier

Remove up to 25 tenants or companies from their current tiers.

ActionTry it

Reorder Autoresponders

Reorder native autoresponders in one call.

ActionTry it

Reorder Thread Field Schemas

Reorder one or more thread-field schemas.

ActionTry it

Reply To Email

Immediately and irreversibly send an external reply to an inbound email. Plain inherits the primary recipients and email channel from the referenced inbound email. The request can add CC and BCC recipients or send from a verified alternate support address while preserving email-client threading.

ActionTry it

Run GraphQL Query

Execute an arbitrary GraphQL document against Plain without a safety gate; mutations can immediately and irreversibly change data. This tool cannot predeclare sufficient permissions for every operation and field. GraphQL errors without data raise an error; partial responses can include errors.

ActionTry it

Search Customers

Search customer profile fields or timeline text using explicit OR conditions.

ActionTry it

Search Tenants

Search tenants by name, domain, or exact external ID.

ActionTry it

Search Threads

Search thread titles, messages, and customer names or emails.

ActionTry it

Send Email/Slack Discussion Message

Immediately and irreversibly deliver a message in an existing discussion. The discussion ID determines the external recipients and original EMAIL or SLACK channel; they cannot be reviewed or overridden here. Live provider authorization requires threadDiscussionMessage:create, although the current operation page omits it.

ActionTry it

Send Message

Immediately and irreversibly deliver a message through an existing thread. The thread determines the delivery channel and primary recipient or channel; this action does not let the caller review or override them. Email threads can add CC and BCC recipients. By default Plain sends as the connected machine user, while impersonation can make the message appear from a customer or an allow-listed workspace user.

ActionTry it

Send New Email

Immediately and irreversibly send an external email to a customer. Plain uses the customer's email as the primary recipient. The request can add CC and BCC recipients, send from a verified alternate support address, and attach the email to an existing thread; the delivery channel remains email.

ActionTry it

Set Customer Tenants

Replace a customer's complete tenant membership set in one call.

ActionTry it

Transition Thread Status

Move a thread to Todo, Snoozed, or Done.

ActionTry it

Unarchive Label Type

Restore an archived label type for use on new threads.

ActionTry it

Unmark Customer As Spam

Idempotently clear a customer's spam flag and restore inbox visibility.

ActionTry it

Update Autoresponder

Update an autoresponder that automatically sends outbound customer replies. Enabling or changing a matching autoresponder can cause irreversible external messages. Plain permits at most 25 autoresponders per workspace and delays up to 900 seconds.

ActionTry it

Update Company

Upserts (creates or updates) a company in Plain. Provide companyId to update by ID or companyDomainName to upsert by domain. When both identifiers are omitted, domainName is also used as companyDomainName for compatibility. Use this to create new companies, update existing company details (name, domain, contract value), or assign account owners.

ActionTry it

Update Company Tier

Assign one company to a tier or clear its tier membership.

ActionTry it

Update Generated Reply

Record teammate feedback on a generated reply.

ActionTry it

Update Label Type

Update mutable label-type properties using field wrappers.

ActionTry it

Update Note

Replace an internal note's content and optional attachment list.

ActionTry it

Update SLA Policy

Replace an SLA policy's targets; omitted target types and their trackers are deleted.

ActionTry it

Update Snippet

Update selected snippet fields using Plain's field-level wrappers.

ActionTry it

Update Task

Update selected fields on an existing task.

ActionTry it

Update Tenant Tier

Assign one tenant to a tier or clear its tier membership.

ActionTry it

Update Thread Attributes

Change one thread priority, customer, external ID, tenant, or tier attribute.

ActionTry it

Update Thread Field Schema

Update mutable properties of a thread-field schema.

ActionTry it

Update Thread Title

Tool to update a thread's title. Use when renaming a thread after confirming its ID.

ActionTry it

Update Tier

Update selected fields on an existing support tier.

ActionTry it

Update Tier SLA

Update a legacy tier SLA without changing its SLA type.

ActionTry it

Upsert Customer

Tool to upsert (create or update) a customer. Use when syncing or ensuring a customer record exists before subsequent actions.

ActionTry it

Upsert Customer Group

Idempotently create or update a customer group using machine-user-safe calls.

ActionTry it

Upsert Tenant

Create or update a tenant while synchronizing its stable external ID.

ActionTry it

Upsert Tenant Field

Set one typed custom field value for a tenant.

ActionTry it

Upsert Tenant Field Schemas

Create or update tenant-field schemas keyed by source and external field ID.

ActionTry it

How the Plain integration works

The Plain integration connects your Dench AI CRM directly to Plain, so agents can read and act on your Plain data as part of everyday work — answering questions in chat, keeping your CRM in sync, and running automations without anyone copying data between tools.

120 actions are available for agents to invoke on your behalf, and 11 triggers can start a Dench automation the moment something changes in Plain. Every call runs through Plain's own authorization, scoped to the account you connect.

Set up Plain in Dench

  1. 1

    Sign in to your Dench workspace and open Integrations.

  2. 2

    Find Plain and click Connect — you'll authorize access through Plain's own sign-in flow. No API keys or code required.

  3. 3

    Ask an agent to use Plain in chat, or wire a Plain trigger into an automation.

  4. 4

    Manage or disconnect the connection any time from workspace settings.

Frequently asked questions

How does the Plain integration work with Dench?

The Dench Plain integration connects your AI CRM to Plain, so AI agents can work with your Plain data as part of chats, automations, and CRM workflows. You connect your account once, and every agent in your workspace can use it — governed by your workspace permissions.

What actions can AI agents perform with Plain via Dench?

The Plain integration currently exposes 120 actions, including Add Customer To Group, Add Customer To Tenants, Add Generated Reply, Add Labels To Thread, Add Members to Tier, and Apply or Clear Thread SLA Policy. Agents invoke them on your behalf from chat or from automations.

Can Dench react to events in Plain automatically?

Yes. The Plain integration provides 11 triggers — such as Customer Event, Customer Group Changed, Customer Group Membership Changed, and Thread Created — that can start a Dench automation the moment something happens in Plain.

Do I need to write code to connect Plain to Dench?

No. You connect Plain from your Dench workspace using Plain's own sign-in and authorization flow — no API keys to copy, no glue code to maintain.

Is the Plain integration secure?

Connections are authorized through Plain's own authentication flow, and Dench stores only the authorization needed to act on your behalf. You can review and disconnect the Plain connection from your workspace settings at any time.

Plain | Dench AI CRM