assignCustomerToUserchangeCustomerStatuschangeCustomerStatusAsyncunnasignAllCustomercreateIssueresolveIssuereopenIssuechangeIssuePrioritychangeIssueTypedeleteIssue
customer.customer_status_transitionedcustomer.customer_changedtimeline.timeline_entry_changed
Once you have fully migrated across, please let us know and we will enable a feature flag for your
workspace giving you the full benefits of threads within Plain.
New data model
In the old version of Plain:- A customer had a single timeline
- A customer had a status of Active, Snoozed or Idle
- A customer could be assigned
- All emails and comms and everything else would be in one customer timeline
- A customer could have issues in their timeline
- Each issue was of a specific issue type (e.g. “Bug report”) and was either open or resolved
- Each issue had a priority
- A customer has multiple threads
- A thread can be assigned
- A thread has a status which is either
Todo,SnoozedorDone - A thread has labels (e.g. “Bug report”)
- A thread has a priority
- All emails and comms belong to a specific thread
Breaking API changes
Custom Timeline Entries
Custom Timeline Entries are deprecated and replaced by two purpose made APIs:createThread and createCustomerEvent.
If you are calling upsertCustomTimelineEntry off the back of a contact form or if you are calling it with changeCustomerStatusToActive set to true, then you need to migrate this code to create a thread instead.
If you are calling upsertCustomTimelineEntry to just log an event which doesn’t require an action from anyone in your team but is just context on the customer, then you need to migrate this code to create a customer event.
Issue APIs
Issues are completely deprecated and instead replaced light-weight labels on threads. If you were previously creating an issue off the back of something happening in your systems you can now create a thread and specify the labels you want on creation. Depending on your use case you can also separately add labels to a thread or remove labels from a thread. If you were using any issue APIs to update or change the prority on issues you can now instead set the priority directly when creating a thread.Assigning/unassigning customers
Assignment has moved from the customer to their threads. This means that if you were previously changing the assignment of a customer you now instead need to assign or unassign a thread. Check out the thread assignment documentation to migrate.Changing customer statuses
Customers no longer have a status. If you were snoozing or changing the customer’s status you need to migrate that code to change the thread’s status instead.Breaking webhook changes
customer.customer_status_transitioned
The customer no longer has a status so this webhook event has been deprecated. Depending on your intentions you may want to swap this out for the thread status transitioned event.
timeline.timeline_entry_changed
This event reported all timeline entry changes and made it very challenging to do even simple things like build an autoresponder. It was far too easy to misunderstand and create faulty integrations.
As a result we’re fully deprecating this event and have replaced it with a list of smaller and simpler events to follow and parse:
- Email received
- Email sent
- Thread priority change
- Thread labels change
- Thread assignment transitioned
- Thread status transitioned
customer.customer_changed
This event was deprecated and ‘unbundled’ into smaller, more specific events:
If you have any questions or need additional information or are running into issues please reach out to us via the in-app support on Plain or at help@plain.com

