Plain
Customer support platform for customers, threads, events, labels, teams, and support conversations.
Supports customer support work across customers, threads, customer events, labels, groups, and lifecycle updates.
Use Plain with Snow
Snow is a personal AI assistant that builds real apps for you, and they can put Plain to work.
What Snow can do with Plain
These are the Plain operations Snow and the apps you build with it can run. Sign in to choose which ones Snow may run without asking.
Reads11
Look at your data without changing 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.
- Fetch Issues
Fetches external issue tracker links (Jira, Linear, GitHub, etc.) associated with a customer's threads. Returns a flattened list of all issue links across the customer's threads, including the thread context for each issue. Useful for getting a complete view of all external issues related to a customer. With defaults, returns up to threadFirst×linkFirst (2,500) total issue links; results are truncated if limits are exceeded, so reduce threadFirst or linkFirst for large datasets.
- Fetch Tier
Tool to fetch a tier by its ID. Use when you have a tier ID and need its metadata before proceeding. Example: "Fetch tier with ID tier_123".
- Get Customer By Email
Fetch customer details by email address. Returns customer information if found, or null if no customer exists with that email.
- Get Customer By ID
Tool to retrieve details of a specific customer by their unique ID. Use after obtaining the customer's ID to fetch their complete record.
- Get Customers
Tool to fetch a list of customers. Use when retrieving multiple customer records with pagination, filtering, or sorting.
- Get Thread By ID
Fetches comprehensive details of a specific thread by ID, including customer info, status, priority, labels, and assignments. Returns null if thread not found.
- 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.
- List Customer Groups
Tool to list all customer groups. Use when you need to retrieve group metadata with optional pagination or filters.
- List Threads
Tool to retrieve a paginated list of threads. Use when you need to list threads with optional status filtering.
Creates3
Add something new to your account.
- 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.
- Create Thread
Tool to create a new thread. Use after obtaining valid customer identifier.
- Send Message
Tool to send a new message within a thread. Use after identifying the thread and preparing message content.
Updates5
Change something that is already there.
- Add Customer To Group
Tool to add a customer to one or more customer groups. Use when you have a customer and groups ready.
- Run GraphQL Query
Execute any GraphQL query or mutation against Plain API. Use when no specific action exists or for complex operations like thread timelines, advanced filtering, and custom data retrieval. Supports queries, mutations, fragments, and variables.
- Update Company
Upserts (creates or updates) a company in Plain. Provide either companyId (for updating an existing company by ID) or companyDomainName (for upserting by domain). Use this to create new companies, update existing company details (name, domain, contract value), or assign account owners.
- Update Thread
Tool to update a thread's title. Use when renaming a thread after confirming its ID.
- Upsert Customer
Tool to upsert (create or update) a customer. Use when syncing or ensuring a customer record exists before subsequent actions.
Deletes3
Remove something. This often cannot be undone.
- Delete Customer
Tool to delete a customer from the system. Use when you need to remove a customer by their ID.
- Delete User
Tool to delete a user from the system. Use when you need to remove a user by their ID after confirming existence.
- 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 either their Plain internal ID (customerGroupId) or their unique key (customerGroupKey). 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
Triggers
These are the trigger events currently available for Plain.
- 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`.
- Customer Group Changed
Fires when a customer group is created, edited or deleted in Plain.
- 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.
- Thread Created
Fires when a new support thread is opened in Plain.
- Thread Custom Field Updated
Fires when one of your own thread fields is set, changed or cleared on a Plain thread.
- 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.
- 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.
- 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.
- 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.
- 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.
Related integrations
Ready to put Plain to work?
Sign up free, build an app by chatting, and connect Plain in minutes. No credit card required.