Plain is a collaborative support platform for B2B support teams, offering a modern, AI-powered interface to consolidate support channels and assist customers efficiently.
Plain is a collaborative support platform for B2B support teams, offering a modern, AI-powered interface to consolidate support channels and assist customers efficiently. On Nagent, Plain is exposed as a fully-configurable customer support integration that any agent can call — 23 actions, and API key authentication. No code is required to wire Plain into your workflow — connect it once via the External Integrations panel and reuse it across every agent you build.
Agent builders use Plain to automate the kinds of tasks customer support teams previously handled manually. Concrete examples — each one is a single agent step in Nagent — include:
Every action and trigger is paired with a structured input/output schema (visible in the sections below), so when you wire Plain into Helix — our agentic agent builder — the editor knows exactly what each step expects and produces. Configure once, deploy anywhere across your Nagent agents.
Every operation an agent can call against Plain, with input parameters and output schema. Drop these into any step of an agent built in Helix.
PLAIN_ADD_CUSTOMER_TO_GROUPTool to add a customer to one or more customer groups. Use when you have a customer and groups ready.
Input parameters
ID of the customer to add to groups.
List of customer group identifiers. Must contain at least one identifier.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_CREATE_CUSTOMER_GROUPCreates 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.
Input parameters
Unique identifier key for the customer group. Must be unique across all customer groups in your workspace. Use lowercase with underscores (e.g., 'vip_customers').
Display name of the customer group (e.g., 'VIP Customers', 'Free Tier'). Used for organization and display purposes.
Hex color code for the group (e.g., #FF5733). Must be a valid 6-digit hex color starting with #.
Optional external ID to link this customer group with an identifier from your system (e.g., Stripe plan ID, internal database ID).
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_CREATE_THREADTool to create a new thread. Use after obtaining valid customer identifier.
Input parameters
Title of the new thread
Optional user assignment for the thread
Optional list of content components for the thread
Optional list of label type IDs to assign
Identifier object for the customer
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_DELETE_CUSTOMERTool to delete a customer from the system. Use when you need to remove a customer by their ID.
Input parameters
Unique identifier of the customer to delete, as returned by the Plain API.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_DELETE_USERTool to delete a user from the system. Use when you need to remove a user by their ID after confirming existence.
Input parameters
Unique identifier of the user to delete, as returned by the Plain API.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_FETCH_COMPANYTool 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.
Input parameters
Plain's internal ID of the company to fetch, e.g., 'cmp_01H1P4TE62AS5KZ4CZFC0578ED'.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_FETCH_ISSUESFetches 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.
Input parameters
Maximum number of issue links to fetch per thread. Must be between 1-100. Defaults to 50.
The unique identifier of the customer whose external issue tracker links (Jira, Linear, etc.) are to be retrieved.
Maximum number of customer threads to fetch. Must be between 1-100. Defaults to 50.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_FETCH_TIERTool 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".
Input parameters
The unique identifier of the tier to fetch (e.g., 'tier_123')
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_GET_CUSTOMER_BY_EMAILFetch customer details by email address. Returns customer information if found, or null if no customer exists with that email.
Input parameters
Email address of the customer to fetch
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_GET_CUSTOMER_BY_IDTool to retrieve details of a specific customer by their unique ID. Use after obtaining the customer's ID to fetch their complete record.
Input parameters
The unique identifier of the customer to retrieve.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_GET_CUSTOMERSTool to fetch a list of customers. Use when retrieving multiple customer records with pagination, filtering, or sorting.
Input parameters
Number of customers to fetch before the 'before' cursor. Must be ≥ 1.
Cursor for forward pagination. Use with 'first'.
Number of customers to fetch after the 'after' cursor. Must be ≥ 1.
Cursor for backward pagination. Use with 'last'.
Sorting instructions for the customers list.
Filters to apply when fetching customers.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_GET_THREAD_BY_IDFetches comprehensive details of a specific thread by ID, including customer info, status, priority, labels, and assignments. Returns null if thread not found.
Input parameters
Unique thread identifier in format: prefix_26chars (e.g., th_01ABC...). Use LIST_THREADS or CREATE_THREAD to obtain valid IDs.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_GET_USER_BY_IDFetch 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.
Input parameters
Unique identifier of the workspace user/team member to fetch (format: u_XXXXXX)
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_LIST_CUSTOMER_GROUPSTool to list all customer groups. Use when you need to retrieve group metadata with optional pagination or filters.
Input parameters
Number of groups to fetch before the 'before' cursor. Must be ≥ 1.
Cursor for forward pagination. Use with 'first'.
Number of groups to fetch after the 'after' cursor. Must be ≥ 1.
Cursor for backward pagination. Use with 'last'.
Filters to apply when fetching customer groups.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_LIST_THREADSDEPRECATED: Use PLAIN_PLAIN_QUERY_THREADS instead. Lists all threads (support conversations) in Plain. Returns thread summaries including ID, reference, title, status, and priority. Use this action to: - Get an overview of all 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 all threads.
Input parameters
Number of threads to fetch in backward direction. Use for fetching the last N threads or N threads before 'before' cursor. Cannot be used with 'first'.
Cursor for forward pagination. Get threads after this cursor. Use with 'first'. Obtain from pageInfo.endCursor of previous response.
Number of threads to fetch in forward direction. Use for fetching the first N threads or N threads after 'after' cursor. Cannot be used with 'last'.
Cursor for backward pagination. Get threads before this cursor. Use with 'last'. Obtain from pageInfo.startCursor of previous response.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_LIST_TIERSTool to retrieve a list of tiers with pagination. Use when you need to browse available tiers after determining pagination cursors. Example: 'List tiers with first=25'.
Input parameters
Number of items to fetch in backward pagination; must be ≥ 1.
Cursor for forward pagination, used together with 'first'.
Number of items to fetch in forward pagination; must be ≥ 1.
Cursor for backward pagination, used together with 'last'.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_QUERY_THREADSTool to retrieve a paginated list of threads. Use when you need to list threads with optional status filtering.
Input parameters
Cursor for pagination returned by a previous call. Omit for first page. Use the cursor from each response to fetch the next page; omitting it resets to the first page.
Filter threads by status. Supported values: TODO, SNOOZED, DONE.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_REMOVE_CUSTOMER_FROM_GROUPRemoves 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
Input parameters
Plain customer ID (format: 'c_01ABC...') of the customer to remove from groups.
List of customer group identifiers to remove the customer from. Must contain at least one identifier. Each identifier must specify either customerGroupId or customerGroupKey.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_RUN_GRAPHQL_QUERYExecute 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.
Input parameters
A valid GraphQL query or mutation string for Plain API. Use this for any operation not covered by specific actions. Supports queries, mutations, inline fragments, and variables. DateTime fields (e.g., createdAt, updatedAt) are objects requiring subfield selection: use createdAt { iso8601 } — omitting subfields causes GRAPHQL_VALIDATION_FAILED. For paginated connections, request pageInfo { hasNextPage endCursor } and pass endCursor as the cursor argument in subsequent queries.
Variables for the GraphQL operation. Keys must match variable names in the query (without '$'). Use empty dict {} if no variables needed. Date range filter values must be UTC-normalized; non-UTC timestamps in createdAt or updatedAt filters silently exclude boundary records.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_SEND_MESSAGETool to send a new message within a thread. Use after identifying the thread and preparing message content.
Input parameters
Unique identifier of the thread to reply to
Plain text content of the message. If you want to send markdown-formatted content, provide the same content here and in markdownContent.
Impersonate a customer when sending the message
Optional markdown-formatted content of the message. If provided, textContent should contain the plain text version of the same content.
Channel-specific options such as email CC/BCC recipients
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_UPDATE_COMPANYUpserts (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.
Input parameters
Name for the company.
Existing company ID to update (format: 'co_...'). Provide either companyId OR companyDomainName.
Domain name for the company (e.g., 'acme.com').
Optional contract value in cents. Must be non-negative.
Company domain name for lookup/upsert (e.g., 'acme.com'). Provide either companyId OR companyDomainName.
ID of the user to assign as account owner.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_UPDATE_THREADTool to update a thread's title. Use when renaming a thread after confirming its ID.
Input parameters
New title for the thread
Unique identifier of the thread to update
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
PLAIN_UPSERT_CUSTOMERTool to upsert (create or update) a customer. Use when syncing or ensuring a customer record exists before subsequent actions.
Input parameters
Details for creation if not found.
Details for update if found.
Selector for existing customer.
Output
Data from the action execution
Error if any occurred during the execution of the action
Whether or not the action execution was successful or not
No publicly available marketplace agent is found using this tool yet. There are 72 agents privately built on Nagent that already use Plain.
Build on Nagent
Connect Plain to any Nagent agent in minutes — no API key management, no boilerplate. Just configure and deploy.
The five questions agent builders ask before adopting a new integration.
Open the External Integrations panel inside Nagent (app.nagent.ai/externalIntegration), find Plain, and click "Connect Now." You'll authenticate with an API key — Nagent handles credential storage and refresh automatically. Once connected, Plain is available to any agent in your workspace.
No. Nagent provides no-code integration for every tool. Once Plain is connected, you configure its 23 actions directly in the agent builder UI — no API calls, no boilerplate, no schema management.
Helix — Nagent's agentic agent builder — lets you drop Plain steps into any workflow visually. Pick an action (e.g., one of those listed above), fill in the inputs (Helix knows the required vs. optional schema for each parameter), and connect it to upstream/downstream steps. Triggers run as the entry point of an agent, so when a Plain event fires, the agent kicks off automatically.
Every Plain action and trigger ships with a fully-typed schema — input parameters with name, type, required flag, and description, plus the output payload shape. The schemas are documented in the sections above. Helix uses these schemas to validate your configuration at build time and to type-check the data flowing between steps.
Yes. While Plain ships with 23 pre-built customer support actions, you can layer custom logic around them inside Helix — pre/post-processing steps, conditional branches, retries, or stitching Plain together with other connected tools. For deeper customization, talk to our team about Nagent's Agentic AI Lab — forward-deployed engineers who build Plain-based workflows tailored to your business.