How developers support their users

Meet the support platform that works the way you work with your customers. Incredibly fast, integrated with Linear and Slack, and a powerful API for everything else.

Loved by next-generation teams

Loved by next-generation teams

Problem

Support tooling is broken.

Modern support is troubleshooting, sales and success all mixed into one. It doesn’t just happen on email anymore, but wherever your customers are. It's no longer just about response time SLAs, but about shipping a bugfix within 30 minutes. Support has changed, but support tools have not.

It’s support, success and sales all mixed into one. It doesn’t just happen on email anymore, but wherever your customers are. Delight is no longer just a quick response, it’s shipping a bug-fix within 30 minutes. It’s no longer just one size fits all, it’s tailored to each company and each customer. Existing tools are not built for this kind of support.

Not made for technical products

carla@getresolve.io

Re: SDK example code

Hi Carla, here is a code snippet that should get what you’re after:

import { [APIName] } from '[APINameSDKPackage]';

// Initialize the [API Name] SDK with your API key or authentication credentials

const [apiInstance] = new [APIName]({

apiKey: '[Your API Key]',

// Add any other required authentication parameters here

});

// Define the customer ID you want to fetch

const customerId = '[Customer ID]';

// Fetch the customer data
[apiInstance].getCustomer(customerId)
.then((customer) => {
console.log('Customer Data:', customer);
})
.catch((error) => {
console.error('Error fetching customer data:', error);
});

One-size-fits-all data structure

Tags

Company_StripeUK

Prod Account - DO NOT TOUCH

Aug2023 Pricing

Bug4931_ProfileImage

Company_StripeEMEA (do not use)

Slow tools

Loading customers.

This might take a while...

Countless communication channels

Simon Rohrbach

15:47

@mitchell can you message Carla from Resolve about the new version of the API?

Hard to build with

customApp.js

async function getSupportDeskData(customerID: string) { const nameData = await fetchCustomerData(NAME_MODULE_ID, customerID); const emailData = await fetchCustomerData(EMAIL_MODULE_ID, customerID); const addressData = await fetchCustomerData(ADDRESS_MODULE_ID, customerID); if (nameData && emailData && addressData) { return { name: nameData.name, email: emailData.email, address: addressData.address }; } else { console.error('Failed to compile complete SupportDesk customer data.'); return null; } }

Meet Plain

Plain is made for modern, high-performance support.

Matched to you and your customers.

Plain works how you do. Get live Slack notifications about incoming queries, create and track Linear issues directly from conversations, and provide technical help with code syntax highlighting in emails.

Native Linear Integration

Slack notifications

Discord notifications

Syntax highlighting

Zoe Downe

17h ago via email

To karl@getresolve.io

Hey Karl, here's a test webhook payload you can test against:

{

"timestamp": "2023-02-21T13:27:33.811Z",

"workspaceId": "w_01GST2GVS0BD0X09D1A4DHDDR1",

"payload": {

"changeType": "UPDATED",

"eventType": "customer.customer_changed",

"customer": {

"id": "c_01GST2GWV8YX7141MNS8QKMN5Y",

"email": {

"email": "jasmin.brekke1fvr9@example.com",

"isVerified": false,

"verifiedAt": null

}

}

}

}

{

"timestamp": "2023-02-21T13:27:33.811Z",

"workspaceId": "w_01GST2GVS0BD0X09D1A4DHDDR1",

"payload": {

"changeType": "UPDATED",

"eventType": "customer.customer_changed",

"customer": {

"id": "c_01GST2GWV8YX7141MNS8QKMN5Y",

"email": {

"email": "jasmin.brekke1fvr9@example.com",

"isVerified": false,

"verifiedAt": null

}

}

}

}

Linear issue

Add webhook for testing

changed to

Done

K

Alex Goodwin

5mins ago via email

To support@atrium.so

Oh awesome, thanks Zoe!

Made for high-context problems.

View real-time customer information from your own database — no custom apps required. Track key events about your product usage right within Plain. Better route queries with labels and priorities.

Real-time customer data

Events

Powerful API

A

Annie Atkins

Email

annie@getresolve.io

ID

u_01B3J8NS2BTF8N21CPBPP

Groups

Enterprise

Other threads

Feature request: Webhooks

1d ago

Workspace

Tier

Enterprise / Annual

Roles

DNS manager, logs read-only

Stacks

production_us-east-1

s_01ARZ3NDEKTSV4RRFFQ69G5FAW

View in Cloudwatch

staging_us-east-2

s_01FMRA9FYWZDD5XDPZ3P8F80RM

View in Cloudwatch

Debug Info

AuthID

au_qwNjLMG2_ux_w4Di6_hsM7PHoTSXiK

User ID

u_4Di6_hsM7PQtqwNjLMG2_HoTSXiKU

Created 2 mins ago

Jump to Admin

Built to handle serious volume.

Organise your customers with groups, manage your conversations with labels and priorities, message multiple people with bulk replies, and handle complex operations with our powerful API.

Customer groups

Bulk messages

Multiple email inboxes

Labels

Priorities

Channels

For your free tier, your enterprise customers, and anyone in between.

Plain makes it easy to meet your customers where they are. In your product, on email, or any other channel you choose – thanks to our powerful and flexible API.

Email

Bring up to 5 shared email addresses to Plain

From

support@atrium.so

To

annie@getresolve.com

Re: Pricing plans

Reply to Annie,

[

for snippets

Send reply

Native contact forms

Offer a premium support experience, natively integrated into your own product interface

Get in touch

esc

Bug report

Feedback

Question

What did you find?

When I...

This is urgent

Check this if the bug is preventing you from using our app.

Submit bug report

In-app interface

Centralise all your support touchpoints

Need help?

Psst... Discord is great if you'd like help from our community!

Join on Discord

View documention

Get in touch

Custom channels

If it has an API, Plain supports it

Hubspot

1h ago

Sent by Ben Braithwaite (ben@getresolve.com)

Source URL

https://atrium.so/contactus

Message

Hi,

I love what I’ve seen from your product so far, but I’m not sure which plan is right for our team. We have 7 users at the moment but will likely need another 3-4 seats in the next few months. What do you recommend?

Thanks,

Ben

Speed

Don’t lift a finger. Literally.

From incredibly fast performance to the powerful command palette and comprehensive keyboard shortcuts, every part of Plain is designed and engineered for speed.

Incredibly fast

Fly through that queue. Almost every interaction in Plain renders in 100ms or less.

Cmd+K for everything

Move around Plain without moving your mouse. Every action is available via command palette.

Search...

Snooze thread...

Mark thread as Done

Change priority...

Add labels...

Assign to me

Designed for the keyboard

Every shortcut added in, no shortcuts taken. Use Plain entirely with your keyboard.

P

L

A

I

N

Programmability

Built to be an API – not just have one.

For others, an API is a feature. For us, it's our foundation. Thanks to Plain's API-first architecture, you can build whatever Plain doesn’t bring. Extend nearly any workflow, connect your own systems with ours, and build anything you need to scale your support.

Typescript SDK

Make an API call in minutes, with full error handling and type annotations and much more.

Floating contact form

Quickly add a floating contact form bubble to your NextJS app

Advanced contact form

Build out a complex form which pre-triages and categorises all of your support requests

example/get-customer.ts

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import { PlainClient } from '@team-plain/typescript-sdk';

const client = new PlainClient({
  apiKey: 'plainApiKey__tmRD_xF5qiVH0457LkaLCC2maN5hLsBIbyOgjqEP9k',
});

const result = await client.getCustomerById({ customerId: 'c_01GHC4A28A9D49P30AIWR3BN5P' });

if (result.error) {
  console.log(result.error);
} else {
  console.log(result.data.fullName);
}

Typescript SDK

Floating contact form

Advanced contact form

example/get-customer.ts

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import { PlainClient } from '@team-plain/typescript-sdk';

const client = new PlainClient({
  apiKey: 'plainApiKey__tmRD_xF5qiVH0457LkaLCC2maN5hLsBIbyOgjqEP9k',
});

const result = await client.getCustomerById({ customerId: 'c_01GHC4A28A9D49P30AIWR3BN5P' });

if (result.error) {
  console.log(result.error);
} else {
  console.log(result.data.fullName);
}

Typescript SDK

Floating contact form

Advanced contact form

example/get-customer.ts

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

import { PlainClient } from '@team-plain/typescript-sdk';

const client = new PlainClient({
  apiKey: 'plainApiKey__tmRD_xF5qiVH0457LkaLCC2maN5hLsBIbyOgjqEP9k',
});

const result = await client.getCustomerById({ customerId: 'c_01GHC4A28A9D49P30AIWR3BN5P' });

if (result.error) {
  console.log(result.error);
} else {
  console.log(result.data.fullName);
}

You’re 1m 37s away from better support.

That’s how fast it is to get started on Plain. And yes, we’ve timed it.

Things we worked hard for

Backed by

© 2023 Not Just Tickets Limited

Plain and the Plain logo are trademarks and tradenames of Not Just Tickets Limited and may not be used or reproduced without consent.

Things we worked hard for

Backed by

© 2023 Not Just Tickets Limited

Plain and the Plain logo are trademarks and tradenames of Not Just Tickets Limited and may not be used or reproduced without consent.

Things we worked hard for

Backed by

© 2023 Not Just Tickets Limited

Plain and the Plain logo are trademarks and tradenames of Not Just Tickets Limited and may not be used or reproduced without consent.