You can reply to a thread using the replyToThread mutation, as long as the thread’s communication channel is either API, CHAT, EMAIL, SLACK or ‘MS_TEAMS’. This information is available in the thread as the channel field.
If it is not possible to reply to a thread, you will get the mutation error code cannot_reply_to_thread and a message indicating why.
This operation requires the following permission:
import { PlainClient } from '@team-plain/typescript-sdk';
const client = new PlainClient({ apiKey: 'plainApiKey_xxx' });
const res = await client.replyToThread({
threadId: 'th_01HD1G6649R1DK061W27VBT7QB',
textContent: 'The plain text version of your reply goes here.',
markdownContent: 'The markdown **version** of your _reply_ goes here.',
});
if (res.error) {
console.error(res.error);
} else {
console.log(res.data);
}
Where res.data is:
Impersonation
Impersonation is exclusively available in our Grow plan. You can see all available plans in our
pricing page.
This feature allows you to bring native messaging between your customers and Plain, straight into your own product](https://plain.support.site/article/headless-portal-overview).
With impersonation, you can reply to a thread on behalf of one of your customers: impersonated messages will show up as if they were sent by the customers themselves.
In order to impersonate a customer, provide the impersonation parameter in the replyToThread mutation, specifying the identifier of the customer you want to impersonate. You can pick any of the available customer identifiers (emailAddress, customerId or externalId)
{
"impersonation": {
"asCustomer": {
"customerIdentifier": {
"emailAddress": "blanca@example.com"
}
}
}
}
Impersonation is only possible for API, CHAT, EMAIL and SLACK threads (based on the thread’s channel field).
The customer message will be processed differently based on the thread’s channel:
SLACK: the message will appear in Slack as a new message from the impersonated customer, including their name and any other customer details
API and EMAIL: the message will be sent as an email with the impersonated customer’s email address as the “From” address, making it appear as if they sent the email directly
CHAT: the message will appear in the thread as coming directly from the impersonated customer, with their name and avatar displayed
When replying to an EMAIL or API thread, you can optionally add ‘Cc’ and ‘Bcc’ recipients by using the channelSpecificOptions parameter:
{
"channelSpecificOptions": {
"email": {
// For CC'd recipients
"additionalRecipients": [
{
"email": "peter@example.com",
"name": "Peter"
},
],
// For BCC'd recipients
"hiddenRecipients": [
{
"email": "finance@example.com"
}
]
}
}
}
This operation requires the following permissions:
thread:reply
customer:impersonate
import { PlainClient } from '@team-plain/typescript-sdk';
const client = new PlainClient({ apiKey: 'plainApiKey_xxx' });
const res = await client.replyToThread({
threadId: 'th_01HD1G6649R1DK061W27VBT7QB',
textContent: 'Hi, I ran out of compute credits, how can I top them up?',
markdownContent: 'Hi, I ran out of compute credits, how can I top them up?',
impersonation: {
asCustomer: {
customerIdentifier: {
emailAddress: 'blanca@example.com',
},
},
},
additionalChannelOptions: {
email: {
hiddenRecipients: [
{
email: 'customer-success@company.org',
},
],
},
},
});
if (res.error) {
console.error(res.error);
} else {
console.log(res.data);
}