> This is part 1 of 3 of the full documentation (pages 1–100 of 219).
> The content is paginated: fetch every part to see all of it.
> Next part: https://docs.usepylon.com/pylon-docs/llms-full.txt/1
> Page index: https://docs.usepylon.com/pylon-docs/llms.txt

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
This site has an agentic ask interface you may use to query the documentation dynamically by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.usepylon.com/pylon-docs/index.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

---

# Introduction

Pylon is the first agentic support platform built for B2B.

Track customer issues across any channel and orchestrate agents and Automations to investigate, take action, and resolve customer issues.

{% @navattic/embed demoId="cmr42hylm003o04jv0vqh0hvy" url="<https://capture.navattic.com/cmr42hylm003o04jv0vqh0hvy>" %}

#### What is Agentic Support?

Agentic Support is a new way of working where people and AI work together across the entire support operation.

Instead of doing every task yourself, agents can work directly with customers, while Automations run repeatable workflows when specific events happen or on a recurring schedule. Skills define how agents handle specific scenarios and take action.

Your team stays in control, providing the judgment and direction while AI handles more of the repetitive work.

{% content-ref url="/pages/40bA5IO4AP8YGv8S3T8p" %}
[Assist Agent](/pylon-docs/agents/assist-agent)
{% endcontent-ref %}

{% content-ref url="/pages/iXCTGZmTYIYTUS0nbvCn" %}
[Automations](/pylon-docs/agents/automations)
{% endcontent-ref %}

{% content-ref url="/pages/ibWCb6gCftydV4yy3HMk" %}
[Skills](/pylon-docs/agents/skills)
{% endcontent-ref %}

{% content-ref url="/pages/LzEtasNFGr6UICNRqK31" %}
[Connectors](/pylon-docs/agents/connectors)
{% endcontent-ref %}

{% content-ref url="/pages/LWGur62n3R26PeOQF3h0" %}
[Support Agent](/pylon-docs/agents/support-agent)
{% endcontent-ref %}

{% content-ref url="/pages/J7ACPwt7DQc05zYR1KgM" %}
[Omnichannel Support](/pylon-docs/support-workflows/omnichannel-support)
{% endcontent-ref %}

{% content-ref url="/pages/GDKWHKtiQoLpGd2o75Pd" %}
[Customer Portal](/pylon-docs/customer-portal/overview)
{% endcontent-ref %}

{% content-ref url="/pages/sZbhXfeObTH2q2Lj2HU2" %}
[Chat Widget](/pylon-docs/chat-widget/overview)
{% endcontent-ref %}

{% content-ref url="/pages/BIN1KMSZgNTThtCsuCgm" %}
[Triggers](/pylon-docs/platform/triggers)
{% endcontent-ref %}

{% content-ref url="/pages/o4SPiARnwp9Vm1hVteJj" %}
[Account Intelligence](/pylon-docs/account-intelligence/customer-overview)
{% endcontent-ref %}

{% content-ref url="/pages/2uAV0IcaRZ2xKbb9eApQ" %}
[Product Intelligence ](/pylon-docs/product-intelligence/feature-requests)
{% endcontent-ref %}

{% content-ref url="/pages/tb61kx4Si7ld72zQwKfS" %}
[Reporting & Analytics](/pylon-docs/reporting-and-analytics/analytics)
{% endcontent-ref %}

{% content-ref url="/pages/y5YDxx6qUKhoEvO0e97n" %}
[Broadcasts](/pylon-docs/broadcasts/overview)
{% endcontent-ref %}

{% content-ref url="/pages/Mduk4mNR4ujyAU6sm78d" %}
[API](/pylon-docs/developer/api)
{% endcontent-ref %}


# Quick Start

Check out the [Getting Started](https://app.usepylon.com/get-started) page in Pylon to help get setup.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fw6rC57lGf2BBlnU1QSbY%2Fimage.png?alt=media&amp;token=2a45e92c-3102-467c-addd-8c576412379f" alt=""><figcaption></figcaption></figure>


# Setup

## Sign in to Pylon

1. Go to [Pylon](https://app.usepylon.com/) ([https://app.usepylon.com](https://app.usepylon.com/)) and enter your email to sign in.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F8IjRKMGBxEtGqp4QG3nz%2FCleanShot%202026-07-22%20at%2020.43.36%402x.png?alt=media&amp;token=7b21fd09-24b0-4f2f-8876-4e04b2e983a3" alt=""><figcaption></figcaption></figure>

2. Sign in with your Slack workspace or another sign-in method your admin has turned on. Admins choose the sign-in methods for new users in [**Settings > Workspace > Access**](https://app.usepylon.com/settings/access) and can change an existing user's method on the [Users](https://app.usepylon.com/settings/users) page. See [Sign-in, SSO, and SCIM](/pylon-docs/platform/roles-and-user-management#sso).<br>

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F4h2OyxMrZDUX5cz9Dzjf%2Fslack-setup-2.png?alt=media&amp;token=ec55c19e-78ef-4e2f-85ad-1514aa4a5b03" alt=""><figcaption></figcaption></figure>

3. Click `Allow`

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FvtoKxdIsQSXXjoTUqAZT%2Fslack-setup-3.png?alt=media&amp;token=24632419-20b6-46e5-89b2-b583d6fa17a2" alt=""><figcaption></figcaption></figure>

### Getting Started

Follow the steps on the [onboarding](https://app.usepylon.com/get-started) page to get Pylon setup.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FBJMWlXBjYk8aDoBGplDK%2FCleanShot%202026-07-22%20at%2020.47.26%402x.png?alt=media&amp;token=549ec543-66f3-401c-bebc-e1cbfbf41d78" alt=""><figcaption></figcaption></figure>


# Channel Configuration

To integrate Pylon seamlessly with Slack, there's two main steps to configuration: setting up your Internal Threads workflow, and then actually connecting individual channels in Pylon.

## Step 1: Setting up Internal Threads

Internal threads are a dedicated threads in Slack to discuss and collaborate on new customer issues internally. All discussion in these threads will be synced back to Pylon! We recommend setting this up prior to connecting any other channels so they'll be ready to sync as soon as you pull data into Pylon.

### For Small Teams

Make one public channel called *#customer-alerts*.

### For Larger Teams

If you have multiple team members handling accounts, we recommend opening up one channel per person on your team that's responsible for handling account messages.

For example, if you have three CSMs Alex, Sabrina, and John:

* *#alex-customers*
* *#sabrina-customers*
* *#john-customers*

{% hint style="info" %}
If you’re in a public workspace, or just want to make your internal threads in a private channel, add Pylon to the channel following the below instructions, but choose `Triage Channel`.
{% endhint %}

Go to Settings > Internal Threads (under Workflows) and select the first template.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FfwrLdNxG8JvRupHziE3a%2FCleanShot%202024-10-21%20at%2000.23.39%402x.png?alt=media&amp;token=acb37921-7e3b-4074-9807-e1a18826a59e" alt=""><figcaption></figcaption></figure>

Under "Send To", pick the channel(s) you created above! You can always change where internal threads are created, or segment issues by account owner or other properties to create internal threads in different places for more complex team structures.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Ftx3aSsVbg0zJMIwA8xkq%2FCleanShot%202025-01-08%20at%2008.13.07.png?alt=media&amp;token=2b5f763b-ec21-495d-ade9-5a8a19b0336c" alt=""><figcaption></figcaption></figure>

## Step 2: Enabling Channels

Channels in Pylon are bucketed into three categories:

1. Customer Channels, where you're talking directly with your customers
2. Community Channels, which typically contain users from many different companies
3. Internal Channels, where users within your company are asking questions to other team members

Each type of channel can be enabled in a slightly different way.

### Enable a Customer Channel

Pylon can be enabled in customer channels by one of 3 methods:

* Bulk updating via the Accounts dashboard in Pylon
* Manual enablement directly from a Slack channel
* Autolinking via standard naming conventions

{% hint style="info" %}
**Private** customer channels must be enabled directly in Slack.
{% endhint %}

#### Accounts Dashboard

Select "Accounts" in the sidebar, and then click the purple "Add Account" button in the top right of the screen (which should bring you to the menu below). Pick "Slack" to bulk enable Pylon in relevant customer channels.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FYjPX3PUK9ilazPVSLGtK%2FScreenshot%202026-01-16%20at%2010.01.03%E2%80%AFAM.png?alt=media&amp;token=4ac8c737-df6c-40a6-a730-72efbc021458" alt=""><figcaption></figcaption></figure>

#### Slack

Pylon will have function in customer channels that you explicitly enable it in. If you want it to be enabled in channels automatically, you can use our [CRM widget](/pylon-docs/integrations/crm/salesforce#channel-creation-from-salesforce) to create and setup channels automatically.

1. Go to your customer channel
2. Type `/invite @Pylon` (or whatever you set as the Pylon [bot display name](/pylon-docs/integrations/chat/slack#bot-display-name)) and press enter.

   <figure><img src="https://mintlify.s3-us-west-1.amazonaws.com/pylon/images/enable-1.png" alt=""><figcaption></figcaption></figure>
3. You’ll get a prompt to enable Pylon in the channel. Select `Customer Channel`.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FbnY36j5W3fWItTYOqxeg%2FCleanShot%202025-01-08%20at%2008.08.37%402x.png?alt=media&amp;token=b052103f-835f-482e-a96b-fb29a0522536" alt=""><figcaption></figcaption></figure>

4. Fill out the modal with your preferences, including selecting the desired triage channel (these will be saved for the next time)

<div data-full-width="false"><figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FnUfO99ShBdk6UZhiWWTO%2FCleanShot%202025-01-08%20at%2008.09.06%402x.png?alt=media&amp;token=af22623b-608b-4498-b933-6bdf45ae317e" alt="" width="563"><figcaption></figcaption></figure></div>

#### Autolink Channels

If you have a common pattern to your slack channels (i.e. putting `ext-` at the beginning of all external channels), you can autolink them with Pylon. Head over to the [Account Configuration page](https://app.usepylon.com/settings/account-configuration) and find the 'External Slack channel linking' section. You'll be able to configure the pattern of your Slack channels there so they will sync automatically moving forward.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FdORz4NlIwaLJQfJkuFE5%2Fimage.png?alt=media&amp;token=330fc52f-8e8e-46c5-b3a6-8fdbceb330c0" alt=""><figcaption></figcaption></figure>

Microsoft Teams has a separate automatic linking configuration for new standard and shared channels. See [Microsoft Teams](/pylon-docs/integrations/chat/microsoft-teams#automatically-link-new-channels-to-accounts) for eligibility and account-matching rules.

### Enable a Community Channel

A community channel is a channel with users from many different companies, typically in a community workspace.

Link this channel the same way you would a customer channel, but choose `Community Channel` once inviting Pylon to the channel.

### Enable an Internal Channel

An internal channel is a channel where users from within your company are asking questions, typically to the support or customer-facing team.

You should link these types of channels only from the Pylon dashboard. You can [see here](https://support.usepylon.com/articles/4140972198-can-i-link-an-internal-channel-with-pylon) how to do this.


# User Guide

Common tips and tracks on how to setup and use Pylon!

Pylon is a pretty powerful platform with lots of customization to make your day-to-day productive and fun. Here are some of the things you'll want to get setup or learn about to help you get the most value out of Pylon.

## Keyboard Shortcuts

All keyboard shortcuts can be found in-app by choosing "Keyboard Shortcuts" from your profile menu at the bottom left corner of the screen.

## General Navigation

To quickly navigate around Pylon, view recently visited pages, or search for specific customer issues, knowledge base articles, accounts, etc use [Command Search](/pylon-docs/platform/command-search) by hitting `Cmd-K` or `Ctrl-K` from anywhere in Pylon.

## Managing Issues

Issue keyboard shortcuts are available when you are viewing an issue.

| Shortcut                                  | Action                                                      |
| ----------------------------------------- | ----------------------------------------------------------- |
| `j` and `k`                               | Navigate between issues                                     |
| `s`                                       | Change the status of an issue                               |
| `z`                                       | Snooze an issue                                             |
| `a`                                       | Assign an issue                                             |
| `f`                                       | Toggle fullscreen mode                                      |
| `m`                                       | Run a [Macro](/pylon-docs/platform/macros)                  |
| `Esc`                                     | Exit out of an issue                                        |
| `Cmd-j`                                   | AI Copilot                                                  |
| `Cmd-Enter` or `Ctrl-Enter`               | Send a message                                              |
| `Cmd-Shift-Enter` or `Ctrl-Shift-Enter`   | Send a message and close the issue                          |
| `Cmd-Option-Enter` or `Ctrl-Option-Enter` | Send a message, close the issue, and move to the next issue |

## Dark Mode

Toggle dark mode from your [Profile](https://app.usepylon.com/settings/profile) page in Settings or by typing `Cmd-k` and then `Dark Mode`.

## Notification Preferences

Under the [Notifications](https://app.usepylon.com/settings/notifications) page, customize which notifications you'd like to receive and where you'd like to receive them. You can also access them from both the profile and settings menus in the bottom left corner of your screen.

Notifications are grouped into tabs: **Issues**, **Projects & tasks**, **Knowledge base**, **Feature management**, and **Connectors & tools**. For each event, choose whether to be notified **In-app**, in **Slack**, with a **Desktop** notification, or by **Email**. Turn on **Enable Sound** to play a sound for in-app notifications.

Issue notifications you can configure:

* I'm assigned an issue by a teammate
* I'm assigned an issue by triggers or assignment rules
* I'm mentioned in an internal note
* New customer message on an issue I follow
* New message from your team on an issue I follow
* Issue that I follow is unsnoozed
* Issue that I'm assigned to breached SLA

In-app notifications will show up under your notifications tray, accessible via. the Bell icon on the top left. The tray has **All**, **Unread**, and **Mentions** tabs, and a **Mark all read** button.

{% hint style="info" %}
If Desktop notifications are on but you aren't seeing them, check that your browser allows notifications from Pylon.
{% endhint %}

## Signatures

If you'll be sending emails from Pylon, consider setting up an email signature on your [Profile](https://app.usepylon.com/settings/profile) page. The signature will get automatically appended in the editor when you're replying to emails.


# Assist Agent

Get your questions answered and perform actions anywhere

{% hint style="info" %}
This feature is currently in beta, with access limited to those participating in the beta.
{% endhint %}

Assist Agent is an interactive AI teammate that helps your team investigate questions, draft replies, and take action with the context already available in Pylon.

### On Issues

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FfL9SOIRUgRnTINLscfBi%2Fimage.png?alt=media&amp;token=8f26ef5b-10c5-48b8-a10f-22fce9da664c" alt=""><figcaption></figcaption></figure>

Message the Assist Agent to:

* Investigate issues more deeply
* Draft replies
* Perform actions
* Access external data or take action via Connectors

Learn more about what the Assist Agent can do [here](https://support.usepylon.com/articles/8245939244-how-does-the-assist-agent-work?lang=en).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FsDgxoGq7F5s48mlEaN0A%2Fimage.png?alt=media&amp;token=e235464d-136b-407c-a905-30691401b2d4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FFzrysBMThKft8llh6Qkt%2Fimage.png?alt=media&amp;token=481c1cf8-f7bd-4abd-b6dd-d60ef3d7865f" alt=""><figcaption></figcaption></figure>

### Across Pylon

The Assist Agent is accessible from the hexagon bubble in the bottom right corner.&#x20;

Use it to:

* Create and explain triggers
* Update knowledge base articles
* Create analytics charts
* Ask questions about your customers

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FFOxitMHoqqqPoQdDJmxE%2Fimage.png?alt=media&amp;token=e5b9704d-a083-4d6f-9ec1-7dde7d05231d" alt=""><figcaption></figcaption></figure>

### On Agents Page

The fullscreen [Agents](https://app.usepylon.com/agent-chats) page, you can orchestrate multiple agents as well as see all your Agent sessions in one place.

### Guardrails

Any actions taken through the Assist Agent are attributed to the user who took them.&#x20;

Admins can configure what tools the agent has access to [here](https://app.usepylon.com/settings/ai-controls/agents/agent/assist).

{% hint style="info" %}
Assist Agent is human-in-the-loop. It proposes drafts and suggests actions for a teammate to review, so your team remains responsible for what is sent or changed.
{% endhint %}


# Automations

Automate repeatable support work with workflows that investigate issues, classify and route work, update fields, create tickets, and more.

{% hint style="info" %}
Automations that run AI instructions require access to Agentic features or Skills. Availability depends on your workspace's plan — contact your account team if you don't see them. Creating or editing the AI instructions also requires edit access under **Support agents** in your role's permissions.
{% endhint %}

Automations connect a trigger to work you want Pylon to perform automatically.

For example, an Automation can run when a new issue arrives, investigate the issue using relevant context and connected tools, and surface its findings for your team.

<img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Ffc3e3p2jOe6CxSRHzZRC%2Funknown.png?alt=media&amp;token=284ce090-c3cf-4786-b801-b3c90794c6a7" alt="" height="395" width="624">

### How Automations work

1. **Choose a kickoff event.** Define when the Automation should run, such as when a new issue is created or on a recurring schedule.
2. **Define the work.** Add AI instructions or a Skill that tells Pylon what to do.
3. **Connect tools and context.** Give the Automation the context and connected tools it needs to complete the work.
4. **Review and enable.** Confirm the automation and turn it on.

Once enabled, the Automation runs whenever its trigger conditions are met.

### Example: Investigate new issues

<img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FIaLAkPMjfvT2WFJMKB4h%2Funknown.png?alt=media&amp;token=1e13458b-908b-498d-9314-39d8087fb15a" alt="Create an Automation that runs whenever a new issue arrives. Pylon can investigate the issue, gather relevant context and evidence, and prepare its findings for your team." height="393" width="624">

### Example: Triage, classification & tagging

<img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FGDLb1VnoeLnUg96AdDuz%2Funknown.png?alt=media&amp;token=28e1705c-425f-48b5-bcfc-c9e2a652bbca" alt="Create an Automation that runs when a new issue arrives or its status changes. It can classify the issue and apply the appropriate tags or custom fields." height="393" width="624">

### Context

Automations can use relevant context from Pylon and your connected systems to complete their work, including:

* The triggering issue, account, or other object
* Knowledge base articles and connected documentation
* Past issues
* Account fields and notebooks
* Connected codebases and logs
* MCP connectors and other enabled tools
* Skills

The context and tools available to an Automation determine what it can understand and what actions it can take.


# Slack Agent

Answer product and customer questions and take action directly from Slack.

{% hint style="info" %}
This feature is currently in beta, with access limited to those participating in the beta.
{% endhint %}

Slack Agent brings Pylon's agentic capabilities into Slack so internal teams can answer product and customer questions and take quick actions without leaving Slack.

{% hint style="info" %}
If your organization renamed the Pylon Slack app, Slack Agent appears under that custom name.
{% endhint %}

### Start a conversation

1. **Mention the app in an internal channel.** Type `@Pylon` followed by your question. If the app is not in the channel, Slack prompts you to add it.
2. **Send the app a direct message.** Find Pylon in the **Apps** section of Slack and open a DM. An administrator may need to reinstall or reauthorize the Slack app to enable the latest functionality.

### Ask about your product

Slack Agent can answer questions using sources available to your workspace, such as your knowledge base, documentation, past issues, and connected tools.

The rest of your team across sales, customer success, product, engineering, and more can now self-serve answers to product questions.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FDaKeRoASf8UpkqiccIi5%2Fimage.png?alt=media&amp;token=28e5cb87-29ef-4988-9391-0dc40ec52eb7" alt=""><figcaption></figcaption></figure>

### Ask about customers

Slack Agent can use the Pylon data available to the person asking, including issues, calls, emails, internal conversations, CRM data, and account context.

For example, ask it to summarize an account, list open issues before a meeting, find a key contact, or recap recent activity.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FJ0MQpUChIvdtsWh8cW5P%2FCleanShot%202026-07-13%20at%2014.36.21%402x.png?alt=media&amp;token=096e33e6-e8dd-406a-bd91-1f056ebdfaf4" alt=""><figcaption></figcaption></figure>

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F929ydWI9zcWEqYHNyINw%2FCleanShot%202026-07-13%20at%2014.40.51.png?alt=media&amp;token=e9c6b784-d745-41ae-9f5d-e5d551956585" alt=""><figcaption></figcaption></figure>

### Take action from Slack

When the required tools are enabled, Slack Agent can:

* Create or update a knowledge base article
* Update an issue's status, assignee, or fields
* Log account context
* Run skills
* Search any connected systems, like looking in your codebase

Available actions depend on the tools, skills, and connection permissions configured for Slack Agent.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Frm4lv5Jllly19GLrBAsv%2Fimage.png?alt=media&amp;token=569e9043-5f61-465e-8792-30ae28bc1066" alt=""><figcaption></figcaption></figure>

### Configure Slack Agent

You can customize which users can use the Slack Agent and what tools and skills it has access [here](https://app.usepylon.com/settings/ai-controls/agents/agent/slack).

### Guardrails

* **Internal channels only:** Slack Agent does not run in Slack Connect channels and cannot be triggered by external users.
* **Role-aware:** It respects the Pylon access level of the person asking.
* **Configurable tools:** Administrators control which tools and actions are available.
* **Attributable actions:** Work performed through a teammate's connection uses that teammate's permissions.


# Skills

Reusable instructions that define how agents handle specific scenarios and take action.

{% hint style="info" %}
Skills are available to workspaces with Agentic features or Skills access. Availability depends on your workspace's plan — contact your account team if you don't see them.
{% endhint %}

Skills are reusable instructions that teach Pylon agents how to handle specific workflows consistently.

### Creating Skills

The easiest way to create a Skill is with Assist Agent:

1. Work through a real issue or workflow.
2. Refine the investigation steps and desired output.
3. Ask Assist Agent to **turn this into a Skill**.
4. Review the generated instructions.
5. Attach the Skill to the agents that should use it.

You can also create a Skill from the [Skills page](https://app.usepylon.com/settings/ai-controls/skills) or import an existing skill markdown file from another AI tool.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FgUu8WctZ3X0xlCsuJbV7%2Fimage.png?alt=media&amp;token=3c560e19-11a7-4058-a2cc-b1fdd09a6c77" alt=""><figcaption></figcaption></figure>

### Using Skills

Once created, Skills can be used across all of Pylon's agents:

* [Assist Agent](https://support.usepylon.com/articles/8245939244-how-does-the-assist-agent-work?lang=en) — invoke a Skill on-demand by typing `/` followed by the Skill name, or just ask the Assist Agent to run it.
* Automations — run Skills automatically when specific events happen or on a recurring schedule.

Agents can also invoke Skills automatically when they detect a matching scenario. Within each agent, you can control which Skills are available.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F6wNXzqC6gZmOXXBhSIuQ%2Fimage.png?alt=media&amp;token=87071a73-e57c-4be1-ba49-527675be91c6" alt=""><figcaption></figcaption></figure>

#### Visibility & Permissions

Skills can be scoped to the entire org or specific teams or team members.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FueLTGYQGeSCWzAEGUOWX%2FCleanShot%202026-07-13%20at%2011.47.41%402x.png?alt=media&amp;token=b22d10fa-ccf0-4497-ab54-ec96dffe27e8" alt=""><figcaption></figcaption></figure>

#### Examples

{% hint style="info" %}
Keep Skills small and scenario-specific. Several focused Skills are easier to select, test, and maintain than one large Skill covering unrelated workflows.
{% endhint %}

* A Skill to escalate an issue to engineering by summarizing reproduction instructions and post into a Slack channel or creating a Linear issue
* A Skill to call certain [Connectors](/pylon-docs/agents/connectors) to do a deeper investigate for a specific kind of issue
* A Skill to summarize whether a certain feature request got shipped and what the changes included in it were


# Connectors

Connect Pylon to any tool that you use

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FkAxekBsTbMah0ycgmPu2%2FCleanShot%202026-07-13%20at%2011.10.30%402x.png?alt=media&amp;token=857414e6-c5d8-4615-8dee-59351f70c18d" alt=""><figcaption></figcaption></figure>

Connectors give Pylon agents access to external tools so they can search for context, retrieve information, and take action outside Pylon.

Connectors can expose tools through the Model Context Protocol (MCP) or a custom API. Administrators decide which connectors are available and which tools each agent can use.

### Connection types

| Connection   | Best for                                                         | Identity used                                        |
| ------------ | ---------------------------------------------------------------- | ---------------------------------------------------- |
| **Personal** | Assist Agent, Slack Agent, and other human-in-the-loop workflows | The individual teammate's external account           |
| **Shared**   | Team-wide or fallback access for human-in-the-loop workflows     | An organization-level shared account or access token |
| **Agent**    | Automations and other approved autonomous workflows              | A dedicated agent or service account                 |

### Custom MCP server

Administrators add custom MCP connectors from the [Connectors](https://app.usepylon.com/settings/ai-controls/connectors) page. Once connected, MCP tools can be invoked from an agent, used by [Skills](/pylon-docs/agents/skills), or restricted to specific agents and roles.

If a system does not provide an MCP server, an administrator can define a [Custom API tool](https://app.usepylon.com/settings/ai-controls/connectors) that agents can use to call a public HTTP or HTTPS API endpoint. Private-network and loopback addresses are not supported.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FM1GZZDDItQuTQfVSryYs%2FCleanShot%202026-07-13%20at%2011.09.21%402x.png?alt=media&amp;token=82c36a66-53b9-4c98-a2e9-554ccbae136c" alt=""><figcaption></figcaption></figure>

### Permissions and data access

Connecting a tool does not automatically ingest all of that system's data into Pylon. It makes specific tools available for an agent to call when needed.

Pylon controls which tools agents can call. The connected system remains responsible for enforcing its own permissions and tenant boundaries.

{% hint style="info" %}
Admins can disable and enable tools globally directly on the connector level. Additionally, each agent has it's own tool configuration.
{% endhint %}


# User Memories

Pylon AI remembers how you work so you don't have to repeat the same context and preferences.

{% hint style="info" %}
This feature is currently in beta, with access limited to those participating in the beta.
{% endhint %}

User Memories are personal notes that tell Pylon AI how you work. They capture durable preferences, conventions, and context so you do not need to repeat the same instructions in every conversation.

For example, you might have Pylon AI remember which field to use when searching for logs for a specific customer.

{% hint style="info" %}
Your memories are personal and are not visible to other people in your workspace.
{% endhint %}

### Create a memory

You can ask the [Assist Agent](/pylon-docs/agents/assist-agent) to create a memory while you work. For example:

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F2xW4uX2pNtvjmIjZakNY%2FCleanShot%202026-07-30%20at%2010.58.31%402x.png?alt=media&amp;token=4f5071bd-e8fa-42b7-9caf-a95f3c773052" alt="" width="357"><figcaption></figcaption></figure>

You can also create a memory manually from the [memories](https://app.usepylon.com/settings/memories) page and import memories to bring in  memories from another AI tool you use.

After some conversations, [Assist Agent](/pylon-docs/agents/assist-agent) may suggest to save something as memory. Select the suggestion, review and edit the proposed summary and memory, then select **Save to Memory**.&#x20;

### Examples

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fqv7V8XYMOv7E6XW8UU8w%2FCleanShot%202026-07-30%20at%2010.55.35%402x.png?alt=media&amp;token=404a609d-e1ec-47e7-98fe-6cf6423e3e39" alt=""><figcaption><p>Instead of going through these steps each time, Assist Agent know knows how to fetch an organization ID consistently</p></figcaption></figure>

## How memories are used

When you start your next conversation with Pylon AI your saved memories are available as personal context. It applies a memory when it is relevant to your request, investigation, or action.

Memories make Pylon AI faster and more consistent.


# Support Agent

Support Agents can deflect customer questions using content, gather internal context for your team, and take action.

{% hint style="info" %}
This feature is currently in beta, with access limited to those participating in the beta.
{% endhint %}

{% content-ref url="/pages/5sicgbuOpQLhRc53NvTU" %}
[Build](/pylon-docs/agents/support-agent/build)
{% endcontent-ref %}

{% content-ref url="/pages/psbURqgp8pbHYLRJRlel" %}
[Test](/pylon-docs/agents/support-agent/test)
{% endcontent-ref %}

{% content-ref url="/pages/ooJYoWmLGtoGWUhev9Dd" %}
[Deploy](/pylon-docs/agents/support-agent/deploy)
{% endcontent-ref %}

{% content-ref url="/pages/DHeDJp1TbSUjAUBeJ4Dr" %}
[Monitor & Iterate](/pylon-docs/agents/support-agent/monitor-and-iterate)
{% endcontent-ref %}

You can think about Support Agents as an extension of your team, users who can be assigned to issues. They can be used for many things, including:

* Handling of questions based on knowledge base or documentation content
* Initial information collection from customer
* Gathering of context internally for your team
* End-to-end resolution of issue

You can use these agents to attempt to automate the pieces of your workflow you want to - **expect it to be an iterative process** to identify the best workflows to automate, and to build [Skills](/pylon-docs/agents/skills) your agents should follow.


# Build

Build your swarm of AI Agents to help augment your team.

## Persona & Settings

We recommend starting with the default persona, then tuning the settings in order to get the behavior you want. These instructions can do everything from requesting a different tone of voice to allowing the agent to ask follow up questions.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FV2N7L96tnLIIxFTxx0ig%2FCleanShot%202025-06-05%20at%2022.49.39%402x.png?alt=media&amp;token=b6e7e00c-a7e3-462b-8e99-7979402c0b64" alt=""><figcaption></figcaption></figure>

## Training

Agents can be loaded with Resources or [Skills](/pylon-docs/agents/skills).

Resources are forms of knowledge including your Pylon knowledge base, external web pages, or files. You can connect more

{% content-ref url="/pages/55LMxjNj9P2tA9DYAwaa" %}
[Resources](/pylon-docs/platform/training-data)
{% endcontent-ref %}

Skills are instruction manuals for how the agent can handle various specific scenarios. Skills also allow the agent to take action.

{% content-ref url="/pages/ibWCb6gCftydV4yy3HMk" %}
[Skills](/pylon-docs/agents/skills)
{% endcontent-ref %}

## Agent Workflows

### Assignment

To assign issues to an agent, visit the Assignment tab of its configuration. There are two toggles here:

* Agent Enabled should always be toggled if you want to the AI agent to be able to perform actions when assigned an issue.

Once you've set up these toggles, you can set up rules via [Triggers](/pylon-docs/platform/triggers) just like you would for any other human teammate or manually assign relevant issues on a one-off basis.

Common assignment triggers include:

* Assign AI agent to low tier customer issues
* Assign AI agent to off-hours issues

### Greeting

Configure what your AI Agent should do when it first responds to a customer request.

### Resolution

Configure what your AI Agent should do when the user indicates the agent has answered their request.

### Escalation

Configure what your AI Agent should do when it does not have an answer to a customer request.


# Runbooks

Give your agents manuals to execute complex procedures.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FKAUr5l2VyllGLrC3BzEy%2FCleanShot%202025-06-05%20at%2016.10.13.png?alt=media&amp;token=b496783f-2145-4de4-ba64-534603eb3d69" alt="" width="563"><figcaption><p>A runbook for handing hardware failure issues</p></figcaption></figure>

Write instructions in natural language to help your AI Agent handle specific scenarios. When your AI Agents are assigned to issues, they will determine the most relevant runbook they have access to and start executing it.

You can think of Runbooks as having the power of programming, but with the simplicity of writing a document with steps.

## Actions

Agents have the ability to perform actions inside and outside Pylon. On the [Actions](https://app.usepylon.com/settings/ai-controls/actions) page in Settings, view all the actions available to the agent and configure additional custom actions, like API calls.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FDWLnvmYUjnPWQ7dTWiQK%2FCleanShot%202025-02-16%20at%2010.47.02%402x.png?alt=media&amp;token=d59243d8-db57-4870-9ac7-2465c4f48302" alt=""><figcaption><p>Example of GET API call definition</p></figcaption></figure>

By default, AI Agents have a whole set of Pylon actions available to them, including responding to customers, leaving internal notes, setting custom fields, and more.

## Variables

Actions and Runbooks allow scoped variables available to make your Runbook execution as flexible as possible. These variables can exist only in the Runbook or come from other fields in Pylon. For example, you can use variables in the body of API calls or as a way to pass information between steps in a Runbook. Use the `{{` characters to see available variables or create a new one.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FcKfVL6etPIZsiXOgH7RQ%2FCleanShot%202025-02-16%20at%2010.51.04%402x.png?alt=media&amp;token=41b923b6-3879-467b-956c-91c9f6c65b24" alt="" width="375"><figcaption></figcaption></figure>

## Steps

Runbooks consist of a sequence of steps that each use actions, variables, and natural language.&#x20;

Chain together steps to create an end-to-end workflow for how an Agent should handle a certain scenario.

{% hint style="info" %}
Runbooks can involve customer interaction or be fully internal facing!
{% endhint %}

Here's an example of a Runbook step:

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FCZdY1Q0O2Sq4RijY0cFy%2FCleanShot%202025-02-16%20at%2011.06.39%402x.png?alt=media&amp;token=9bae5a0e-c057-4586-9e4e-eb6fb0260e0f" alt=""><figcaption></figcaption></figure>

Note that since the step is in natural language, mentioning the account ID is a 5 digit alphanumeric value means we get natural enforcement and validation from the AI. For example, if the user provides something 6 digits long, the AI will re-prompt them with a suggestion for the correct prompting.&#x20;

{% hint style="info" %}
It will take some iterating to prompt the AI in the manner that's best for the workflow you are trying to create!
{% endhint %}

## Testing

Runbooks can also be tested in isolation of AI agents using the tester on the runbook page.&#x20;

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FusyMtX7Iv3dhARIZPTzo%2FCleanShot%202025-06-05%20at%2023.31.53.gif?alt=media&amp;token=f7cda460-c730-472d-a036-f9b4182d9f22" alt=""><figcaption></figcaption></figure>

## Human-guided Runbooks

Runbooks can not only be executed directly by AI agents, but also by humans on your team directly. Runbooks are accessible in the [Copilot](/pylon-docs/support-workflows/issues/copilot) tab of the issue sidebar, and will be suggested by [Copilot](/pylon-docs/support-workflows/issues/copilot#issue-suggestions).

A team member can then directly step through exection of steps in the runbook, guided by the AI copilot.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FAke4F1xheGO2aBRVHUgw%2FCleanShot%202025-06-06%20at%2020.59.40.gif?alt=media&amp;token=ef411b34-bda9-4327-9c59-4fbaa3b67e13" alt=""><figcaption></figcaption></figure>


# Bring Your Own Agent

Bring your own agent to connect into Pylon.

An alternative to building an agent directly in Pylon is to bring your own custom agent.

### First Party

If you are developing an in-house agent, you can connect the agent directly into your Pylon workflows using one of several approaches.

**Skills**

If you'd like to combine Pylon's agent with your own agent (for example, have Pylon's agent just handle simple questions and orchestration), you can use [Skills](/pylon-docs/agents/skills). You can specify handoffs from Pylon's agent to your agent via. MCP or custom API actions.

**Webhooks, APIs, and MCP**

Using a combination of [Webhooks](/pylon-docs/developer/webhooks), [API](/pylon-docs/developer/api), and/or [Pylon MCP](/pylon-docs/integrations/pylon-mcp), you can connect your agent to ticketing workflows in Pylon.

For example, you can setup webhooks to listen for new issues, messages, and other ticket events and post replies or make metadata changes via. API.

### Third Party

A number of third party agents directly integrate with Pylon. If you're already using an agent that you'd like to connect into Pylon, please reach out directly to your account rep for help getting the connection setup.


# Test

Testing makes sure you can be confident your AI Agent will behave as you want it to.

## Custom Chat

Simulate an interaction with the AI and see how it handles different questions. Either choose from one of the sample questions or ask a question directly.&#x20;

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FdIzYezXMyqjxCdEiJTcc%2Fplayground_single.gif?alt=media&amp;token=d23be15e-6a6b-4d1d-b013-99c0c5bf985c" alt="" width="563"><figcaption></figcaption></figure>

To test agent behavior for a specific customer or channel, you can select your desired values for Channel, Account, and Contact.

## Existing Issues <a href="#supported-knowledge-sources" id="supported-knowledge-sources"></a>

Create a set of test cases of past issues to run your AI agent against to see how it would have performed on a set of old issues.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FsNwmNy4Hw6Sa58jimrba%2FCleanShot%202025-06-05%20at%2016.59.51.png?alt=media&amp;token=571b50b6-077f-4074-a770-e6efbba68a04" alt=""><figcaption></figcaption></figure>


# Deploy

Unleash your AI Agent!

Consider your new AI agent as a member of your team. You can assign them to issues you'd like them to take a look at. This means you have full control of which customer issues your AI agent interacts with.

## Manual Assignment

You can also assign an individual issue to your AI agent, the same way you might normally assign an issue to a team member.

## Automated Assignment

You can use a feature like [Triggers](/pylon-docs/platform/triggers) to granularly scope which issues your AI agent interacts with.

As defined by your setup, if your AI agent is unable to answer a question, it will follow your escalation workflow and reassign the issue.&#x20;

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FaZvqAJXTn56mTODoUg0A%2FCleanShot%202025-06-09%20at%2023.22.38.png?alt=media&amp;token=df14b57b-1cdc-407b-ad8f-758cf484e569" alt=""><figcaption></figcaption></figure>


# Monitor & Iterate

Inspect why the AI acted in a certain way, view analytics, and continue to improve your flywheel.

Each agent has a **Performance** section in its settings. Go to **Settings > AI controls > Agents**, open the agent, and use **Issue logs** and **Analytics**.

## Issue Log

**Issue logs** lists every issue the agent has been assigned to, with its **Outcome**, **Reason**, whether the agent responded, and any AI feedback. Use it to see where the agent can be improved or better tuned.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FhAYMTG8pGWbSnDJ349NH%2FCleanShot%202025-06-05%20at%2023.06.27%402x.png?alt=media&amp;token=98744a0d-d98c-42c7-991d-bdf511da5359" alt="" width="563"><figcaption></figcaption></figure>

## Analytics

Measure your agent's performance throughout the funnel to keep expanding its coverage.

The agent's **Analytics** page shows the same charts as the [Support agent dashboard](/pylon-docs/reporting-and-analytics/default-dashboards#support-agent) under **Analytics**, filtered to this one agent. The Support agent dashboard combines all of your Support Agents.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FKTEdU5SOekNnKyGn5YkL%2FCleanShot%202025-06-05%20at%2023.11.28%402x.png?alt=media&amp;token=a14817bf-0798-4d6e-a9bb-bb467b0c9191" alt=""><figcaption></figcaption></figure>

## Metric definitions

Every Support Agent metric is a count of **issues**, not messages or conversations. Pylon tracks three things for each issue the agent is assigned to.

### Assigned

An issue counts as **assigned** if the agent was assigned to it at any point. It stays assigned even after it's reassigned to a teammate.

### Assisted

An assigned issue counts as **assisted** if the agent did something on it:

| Assist status | Meaning                                                   |
| ------------- | --------------------------------------------------------- |
| Responded     | The agent sent at least one public reply to the customer. |
| Ran Runbook   | The agent ran a runbook but didn't reply.                 |
| Both          | The agent replied and ran a runbook.                      |
| No Assist     | The agent was assigned but did neither.                   |

### Outcome

Each assigned issue has one current outcome. **Escalated** means the outcome is Reassigned or Unassigned.

| Outcome         | What counts                                                                                                                                                                                                                           |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Resolved**    | The issue moved to a Closed status while it was still assigned to the agent. This counts no matter who closed it: the agent, a teammate, or a trigger. It also counts if the customer stops replying (see "Customer drop-off" below). |
| **Reassigned**  | The agent was removed from the issue and someone else was assigned.                                                                                                                                                                   |
| **Unassigned**  | The agent was removed from the issue and no one was assigned.                                                                                                                                                                         |
| **In progress** | The agent is still working on the issue.                                                                                                                                                                                              |

The **Reason** column in Issue logs, and the **Breakdown of agent escalations** chart, explain each outcome:

| Issue logs                     | Dashboard                      | Meaning                                                                                              |
| ------------------------------ | ------------------------------ | ---------------------------------------------------------------------------------------------------- |
| User validated                 | Resolved                       | Resolved: the issue was closed while assigned to the agent.                                          |
| User drop-off                  | Customer Dropoff               | Resolved: the conversation stayed assigned to the agent with no new messages for 24 hours.           |
| User escalated                 | Customer Escalated             | Escalated: the customer asked for a human.                                                           |
| Agent escalated                | Agent Escalated                | Escalated: the agent didn't have enough information to respond, or couldn't respond on that channel. |
| Runbook escalated              | Runbook Escalated              | Escalated: a runbook told the agent to hand off.                                                     |
| Interrupted                    | Interrupted                    | Escalated: a teammate or trigger reassigned or unassigned the issue.                                 |
| Agent error                    | Agent Error                    | Escalated: the agent hit an error and couldn't finish.                                               |
| Conversing / Executing runbook | Conversing / Executing Runbook | In progress.                                                                                         |

**Customer drop-off:** If an issue is still assigned to the agent and has had no new messages for more than 24 hours, Pylon records it as Resolved with the drop-off reason. Pylon checks for this every few hours, so the outcome can update up to a few hours after the 24-hour mark. The issue's status doesn't change. If the customer replies later, the outcome goes back to In progress.

### Rates

**All issues** means every issue in the dashboard's date range and filters, whoever it's assigned to. On an agent's own Analytics page, the numerators count only that agent's issues, but **all issues** still covers your whole workspace.

| Metric                                       | Numerator                                                  | Denominator                                                                                                 |
| -------------------------------------------- | ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| Assign rate                                  | Issues assigned to the agent                               | All issues                                                                                                  |
| Assist rate                                  | Assigned issues the agent assisted                         | Assigned issues (**Assigned Tickets** chart and **Assist rate** tile) or all issues (**All Tickets** chart) |
| Resolution rate — **Assigned Tickets** chart | Assigned issues with a Resolved outcome                    | Assigned issues                                                                                             |
| Resolution rate — **All Tickets** chart      | Assigned issues with a Resolved outcome                    | All issues                                                                                                  |
| Resolution rate — **Resolution rate** tile   | Assisted issues with a Resolved outcome                    | Assisted issues                                                                                             |
| Escalation rate — **Assigned Tickets** chart | Assigned issues that were Reassigned or Unassigned         | Assigned issues                                                                                             |
| Escalation rate — **All Tickets** chart      | Assigned issues that were Reassigned or Unassigned         | All issues                                                                                                  |
| Escalation rate — **Escalation rate** tile   | Assisted issues that were Reassigned or Unassigned         | Assisted issues                                                                                             |
| Satisfaction rate                            | CSAT responses scoring 4 or 5 on issues the agent resolved | All CSAT responses on issues the agent resolved                                                             |

Your workspace shows either the weekly **Support Agent Resolution Rate** charts or the single-number tiles, depending on its Support Agent version. Check the denominator before you compare two numbers. For the same issues, the tile's resolution rate is usually higher than the chart's, because the tile leaves out issues the agent never assisted.

Pylon has no separate deflection rate. To see the share of all incoming issues the agent handled without a teammate, use the resolution rate on the **All Tickets** chart.

### Time attribution

* Each issue counts toward the week, and the date range, in which the **issue was created**. It doesn't count toward the week in which it was resolved or escalated. The default range is the last 90 days.
* **Satisfaction rate over time** is grouped by the date the CSAT response was submitted.
* Outcomes show each issue's **current** state, so recent weeks keep changing. In-progress issues later resolve or escalate. A resolved issue goes back to In progress if the customer replies, or if it's reassigned back to the agent.

### Things to watch for

* Resolution rate and escalation rate don't add up to 100%. Issues that are still in progress stay in the denominator, and so do assigned issues the agent never assisted (except on the tiles).
* A teammate or trigger closing an issue that's still assigned to the agent counts as a resolution by the agent. To keep these out of the agent's numbers, reassign the issue before you close it.
* Removing the agent from an issue that's already closed doesn't change its outcome.
* The satisfaction charts only appear if one of your triggers sends a [CSAT survey](/pylon-docs/support-workflows/csat).


# Omnichannel Support

Pylon can support you wherever you interact with your customers.

Select the channels your team uses to talk to customers to learn more.

{% content-ref url="/pages/4BasT0RUHYUf1yxe0nw3" %}
[Slack](/pylon-docs/integrations/chat/slack)
{% endcontent-ref %}

{% content-ref url="/pages/fxT0UnZE21EcWV9TyOp2" %}
[Microsoft Teams](/pylon-docs/integrations/chat/microsoft-teams)
{% endcontent-ref %}

{% content-ref url="/pages/Jrs8puDAPbw3JFLySt2B" %}
[Discord](/pylon-docs/integrations/chat/discord)
{% endcontent-ref %}

{% content-ref url="/pages/bXl0CgAJbu1mlwyuMWjg" %}
[Telegram](/pylon-docs/integrations/chat/telegram)
{% endcontent-ref %}

{% content-ref url="/pages/WionqQ2y8UkI7McZEFVw" %}
[Whatsapp](/pylon-docs/integrations/chat/whatsapp)
{% endcontent-ref %}

{% content-ref url="/pages/7WEtZQDX7q6LDRZgsEYk" %}
[SMS](/pylon-docs/integrations/chat/sms)
{% endcontent-ref %}

{% content-ref url="/pages/sZbhXfeObTH2q2Lj2HU2" %}
[Chat Widget](/pylon-docs/chat-widget/overview)
{% endcontent-ref %}

{% content-ref url="/pages/jwetb3nvmxMrKbOz8CaJ" %}
[Email](/pylon-docs/support-workflows/email)
{% endcontent-ref %}

{% content-ref url="/pages/NS9Nch8A1HboK0RreU0L" %}
[Ticket Forms](/pylon-docs/support-workflows/ticket-forms)
{% endcontent-ref %}

{% content-ref url="/pages/GDKWHKtiQoLpGd2o75Pd" %}
[Customer Portal](/pylon-docs/customer-portal/overview)
{% endcontent-ref %}

{% content-ref url="/pages/Z3QbZX34Ru7eDJg12RdS" %}
[Phone Support](/pylon-docs/support-workflows/phone-support)
{% endcontent-ref %}

{% content-ref url="/pages/Mduk4mNR4ujyAU6sm78d" %}
[API](/pylon-docs/developer/api)
{% endcontent-ref %}

## Google Chat

Bring customer conversations in Google Chat spaces into Pylon. Google Chat is available on the Enterprise plan.

Connect it from **Settings > Integrations > Google Chat**. Pylon reads and sends messages in your spaces as a Google Workspace admin you choose, called the integration user. Pylon adds that user to each space you link. Link each space to an account from the Accounts page. You can then create [proactive issues](/pylon-docs/support-workflows/issues/proactive-issues) in the linked space. For setup steps, see [How do I connect the Google Chat integration?](https://support.usepylon.com/articles/3458673215-how-do-i-connect-the-google-chat-integration)

## Ongoing chats

Microsoft Teams chats, WhatsApp, Telegram, and SMS conversations don't have separate threads for each request. With issue conversation view on (the default), Pylon uses AI to add each new message to the right open issue, or creates a new issue when the message is about something else. See [Issue conversation view](/pylon-docs/support-workflows/issues/statuses#issue-conversation-view).


# Issues

Track, manage, and act on all your customer requests in a single place

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FC5FJlWf9DVKD5nH4ftdm%2FCleanShot%202024-10-06%20at%2020.55.57.png?alt=media&amp;token=307cc88c-1f6d-4cae-8ee3-a8ef5e096a2d" alt=""><figcaption></figcaption></figure>

Explore all the core features of issues management:

{% content-ref url="/pages/R3Visp7h5csahWbhp3uA" %}
[Views](/pylon-docs/support-workflows/issues/views)
{% endcontent-ref %}

{% content-ref url="/pages/68SwQCyl9EYBeH0QIEIS" %}
[Statuses](/pylon-docs/support-workflows/issues/statuses)
{% endcontent-ref %}

{% content-ref url="/pages/UUrPsgcF03VhwosU8Eg1" %}
[Message Editor](/pylon-docs/support-workflows/issues/message-editor)
{% endcontent-ref %}

{% content-ref url="/pages/80TKZ95ol8CtS6jDyKir" %}
[Copilot](/pylon-docs/support-workflows/issues/copilot)
{% endcontent-ref %}

{% content-ref url="/pages/bhQbWlcw2ednN12JD1qq" %}
[Internal Threads](/pylon-docs/support-workflows/issues/internal-threads)
{% endcontent-ref %}

{% content-ref url="/pages/LVNJMUZG1EwOlZvrJ7cs" %}
[Proactive Issues](/pylon-docs/support-workflows/issues/proactive-issues)
{% endcontent-ref %}

### Agentic Support

{% content-ref url="/pages/40bA5IO4AP8YGv8S3T8p" %}
[Assist Agent](/pylon-docs/agents/assist-agent)
{% endcontent-ref %}

{% content-ref url="/pages/iXCTGZmTYIYTUS0nbvCn" %}
[Automations](/pylon-docs/agents/automations)
{% endcontent-ref %}

{% content-ref url="/pages/LWGur62n3R26PeOQF3h0" %}
[Support Agent](/pylon-docs/agents/support-agent)
{% endcontent-ref %}

{% content-ref url="/pages/ibWCb6gCftydV4yy3HMk" %}
[Skills](/pylon-docs/agents/skills)
{% endcontent-ref %}


# Views

Customize how you view and act on issues. Pick a default view or save your own, then change the layout, filters, and columns.

## Default views

The Support sidebar starts with views every teammate has:

* **Inbox**: new issues assigned to you or unassigned, plus issues that are On you and assigned to you
* **All issues**: every issue
* **My issues**: issues assigned to you, plus unassigned issues
* **Following**: issues you follow
* **Snoozed**: issues that are snoozed

Below them are **Scheduled**, which lists messages scheduled to send later (see [Message Editor](/pylon-docs/support-workflows/issues/message-editor)), and **Drafts**, which lists unsent reply drafts and saved drafts of new issues.

You can change the filters and layout of a default view and click **Save to View** to keep your version. Your changes only apply to you. To go back to the original, open the view's **...** menu and choose **Reset to default**. From the same menu, **Create view from current** turns your changes into a new view, and **Set as Default View** makes it the view you land on.

## Custom views

Click **Create view** to save your current filters and layout as a new view. Under **Who can view?**, choose **Anyone**, **Some members** (specific users and teams), or **Only me**. Use **Who can edit?** to choose who can update the saved view. Editors must also be included in its viewing audience. Views can be starred and organized into folders.

Editors can rename a view, update its icon, change its sharing settings, and delete it. If you can edit a shared view and click **Save to View**, Pylon asks whether to save the changes for everyone or duplicate the view instead.

If you can only view a shared view, you can still change filters and layout temporarily or create a separate view from your changes. You can't overwrite the shared view. Personal changes to built-in views remain separate from shared-view permissions.

## Inbox

The Inbox layout shows a list of issues next to the open issue, so you can work through a queue without leaving the page.

* **Pin issues**: hover over an issue and click **Pin**, or choose **Pin issue to inbox** from an open issue's **...** menu. Pinned issues stay at the top of your Inbox in a collapsible **Pinned** section, and you can drag them to reorder. Pins are personal.
* **Card options**: in the layout menu, choose whether cards show the requester name and issue number, and what message preview to show.

Inbox is a layout, so you can also switch any other view to it.

## Kanban

The Kanban view allows you to see issues laid out in a grid. Pylon's standard Kanban view organizes issues by status.

* Drag an issue between columns to change its status. Select several cards first to drag them together.
* Change the assignee directly from the kanban view by clicking on the assignee avatar
* Greyed out cards indicate issues that have already been viewed by your user
* Cards with a red dot indicate new activity since you last viewed an issue

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FiHDu7N96YtHWi94tPJzv%2FCleanShot%202024-10-06%20at%2021.23.03.png?alt=media&amp;token=6b64fee7-41d3-41f2-b30b-256083ff538d" alt=""><figcaption></figcaption></figure>

## List

The List view allows you to view issues in a list with columns.

* Customize the columns that are visible in the list view
* Change the assignee directly from the list view by clicking on the assignee avatar
* Greyed out rows indicate issues that have already been viewed
* Rows with a red dot indicate new activity since you last view that issue

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F2BIEwBJouHtklgd0p2pK%2FCleanShot%202024-10-06%20at%2021.20.23.png?alt=media&amp;token=998dc194-c55e-4fe2-b980-df886d1e9805" alt=""><figcaption></figcaption></figure>

## See who's viewing an issue

Kanban cards, Inbox cards, and List rows show avatars of teammates who currently have the issue open. Check them before replying so two people don't answer the same customer.

## Filters

Select filters to apply to narrow down the set of visible issues. Issues can be filtered by a variety of default fields across issues, accounts, or contacts as well as any custom fields you've created. By default, filters are AND'ed together, meaning only issues meeting all specified filters conditions will appear.

Filters can also be combined in advanced ways using Filter Groups. With Filter Groups, different groupings of filter conditions can be combined with AND or OR operators.

To hide the child issues of [issue groups](/pylon-docs/support-workflows/issues/issue-groups) from a view, filter on **Parent Issue Group** · **has no value**.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FMX1eI3qLh5K0TmUhS4bi%2FCleanShot%202024-10-06%20at%2021.10.56.png?alt=media&amp;token=a0429a62-4379-4ed5-ae83-2334363e85f0" alt=""><figcaption></figcaption></figure>

## Layouts

Use the layout menu to change the structure of your view. You can customize:

* Display as: Inbox, Kanban, or List
* Sort by: the order issues appear in within each group
* Columns: For Kanban, the vertical dimension you want issues to be displayed by. For List, the data properties that are visible. (Not used in Inbox.)
* Grouping: For Kanban, a second dimension to visualize issues by. For List, the primary dimension you want to view issues by
* Show unreads only: only display issues with unread activity
* Show requester name, and in Inbox, show issue number
* Preview: choose what message preview appears on cards
* Timestamp: pick what timestamp you want displayed on the cards

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FZ8OShFdwj0IsybSFkOyr%2FCleanShot%202025-03-07%20at%2019.56.36%402x.png?alt=media&amp;token=fb286fe4-5873-4384-8643-8007fa2f7f51" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F0YDGpzseCfyTj8yCiPid%2FCleanShot%202024-10-06%20at%2021.15.23.png?alt=media&amp;token=6b2826b7-1370-415f-a16b-df94b54cee36" alt=""><figcaption><p>Example of a Kanban layout with Issue Status as the Column and Priority as the Grouping</p></figcaption></figure>

## Export to CSV

To download the issues in a view, click the export button in the view header, then **Export to CSV**. Large exports run in the background. You can leave the page, and the file will appear in your notifications when it's ready. Past files are listed under **Recent exports**.


# Statuses

An overview of issue statuses in Pylon.

Pylon has 5 statuses for issues: `New`, `On You`, `On Customer`, `On Hold`, and `Closed`. Each has special behavior in how it functions individually and interacts with other aspects of Pylon.

## Categories

### New

New indicates that an issue has not yet had a response by your team since it has started being tracked in Pylon.

When you receive a new email issue, Chat Widget issue, etc. it will almost always start in New.

### On You

On You indicates the next action on the issue needs to be taken by your team.

Pylon automatically uses AI to determine whether next action is needed by your team or by the customer when there is new activity on an issue. This means if a team member responds to a customer issue directly in Slack, email, etc, Pylon will still move the issue to the appropriate status without them taking manual action. Admins can turn this off (see [AI status settings](#ai-status-settings)).

### On Customer

On Customer indicates that the next action on the issue needs to be taken by the customer. Issues are typically in this status when you are waiting for a response, acknowledgement, or additional information from the customer.

Pylon automatically uses AI to determine whether next action is needed by your team or by the customer when there is new activity on an issue. This means if a team member responds to a customer issue directly in Slack, email, etc, Pylon will still move the issue to the appropriate status without them taking manual action.

### On Hold

On Hold indicates that an issue is pending an action external to Pylon. Issues are typically in this status when they are waiting on a bug fix from engineering.

If using Pylon's [ticketing integrations](/pylon-docs/integrations/ticketing), issues will automatically be moved to on hold when a corresponding unfinished engineering ticket is linked to a Pylon issue. Issues are also automatically moved to on hold when they are snoozed.

Issues are automatically moved out of on hold when there is new public activity on the issue.

### Closed

Closed indicates an issue has been resolved. In Pylon, closed issues can be reopened if there is new activity on the issue, for example, a customer in Slack sending a new message into a thread.

***

## Custom Statuses

Use custom statuses to further personalize issue workflows to your business. For example, you can make a "Waiting on Engineering" status in the On Hold category to give more details to anyone viewing the Kanban board.

Custom statuses can be used anywhere statuses are used — they show up as separate Kanban columns/List rows, and can be set with keyboard shortcuts in macros, triggers, and more.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fff3l4S9JA3h9TXAI5OKx%2FCleanShot%202024-11-06%20at%2015.32.35.png?alt=media&amp;token=3e86a04b-5aa2-4b07-bff6-c7df302d2ebc" alt="" width="495"><figcaption></figcaption></figure>

Custom statuses + their icon colors can be adjusted under **Settings > Issue data > Statuses**.

Note: issue custom statuses can only be created in the 'On Hold' and 'Closed' categories. Custom statuses in the 'New', 'On you', and 'On customer' categories are not currently supported.

To retire a custom status, archive it. Issues that already have the status keep it. Archived statuses are listed under each category, where you can restore them. There's a limit on active custom statuses, so you may need to archive one before you can add or restore another.

## AI status settings

Admins can control AI status changes under **Settings > Issue data > Statuses**:

* **Automatically set issue status with AI**: lets AI change an issue's status based on new messages, such as moving it between On you and On customer. Turn this off if you want status changes to happen only manually or through triggers.
* **Close issues with AI**: lets AI close an issue when a message shows it's resolved, for example when a customer replies "Thanks for your help." This requires the setting above. AI closure may skip required fields.

## Issue conversation view

Microsoft Teams chats, WhatsApp, Telegram, and SMS are ongoing conversations rather than separate threads. With **Enable issue conversation view** turned on, Pylon uses AI to match each new message in one of these chats to the right open issue. A chat can have several open issues at once, and each issue shows the conversation history from the chat. If a new message doesn't match any open issue, Pylon creates a new issue.

Issue conversation view is on by default. Admins can turn it off under **Settings > Issue data > Statuses**.

## Setting Status

The status of an issue can be set explicitly by your team by:

* Dragging the issue card on the Kanban Board
* Selecting issue cards or rows and bulk setting their status
* Clicking on the status to choose from the dropdown when a specific issue is open
* Using the keyboard shortcut `s` when an issue is open

You can also use features like [Triggers](/pylon-docs/platform/triggers) or [Macros](/pylon-docs/platform/macros) to automatically set the status of an issue as part of a workflow.


# Message Editor

Pylon's message editor can be used to reply to customer issues (synced to their source system) or to leave internal notes for your team.

The editor supports all forms of rich text, including:

* Bolding, italics, strikethrough, and links
* Inline code and multiline code blocks
* Emojis
* Mentions of teammates or customers
* Attachments

## Macros

Through the editor, you can also run [Macros](/pylon-docs/platform/macros) by clicking the :zap: icon in the text formatting toolbar. You can also press `m` when you're not typing, or `Cmd-M` / `Ctrl-M` while your cursor is in the editor. A macro can add templated pre-filled texted into the editor and also queue up a series of actions to be executed.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fpn05vXZFhYPLBCDfKcBo%2FCleanShot%202024-09-29%20at%2017.44.47.gif?alt=media&amp;token=0835dd06-035d-4e25-afce-e77c671ccba8" alt="" width="563"><figcaption></figcaption></figure>

## Reply

Selecting `Reply` indicates that the message will go directly to the customer wherever they originally reached out to you.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FIPpEqn65RrXlPmYziye3%2FCleanShot%202025-03-20%20at%2021.20.21%402x.png?alt=media&amp;token=9d312fe0-4196-42ca-a791-6b4a0a35d634" alt="" width="375"><figcaption></figcaption></figure>

## Internal Note

Selecting `Note` indicates that the message will not be visible to the customer. Depending on your configured settings and integrations, the message will either only be visible in Pylon, or be visible in Pylon and posted to the issue thread in your [Internal Threads](/pylon-docs/integrations/chat/slack/editor).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F7b2iitbDHRODMmUnsZwE%2FCleanShot%202025-03-20%20at%2021.22.04%402x.png?alt=media&amp;token=29200a34-058e-428f-be90-cfb5f4641f0c" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
You'll know you are leaving an internal note when the background changes color to yellow / orange.
{% endhint %}

### Also send to the Slack channel

On Slack issues, check **Also send to #channel** before sending a thread reply to also post it in the main channel. For internal notes, the option only appears when the issue is in an internal Slack channel.

## Send and set status

Click the arrow next to **Send** to send your message and change the issue's status in one step:

* **Closed**: send and close the issue (`Cmd-Shift-Enter` / `Ctrl-Shift-Enter`)
* **Closed and next**: send, close the issue, and open the next one (`Cmd-Option-Enter` / `Ctrl-Option-Enter`)
* **Other status**: send and move the issue to any On hold or Closed status, including custom statuses

## Scheduled Messages

The same menu also lets you schedule replies and notes for later. The time shown is in your browser/machine time.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FfEqSLzzKB2ZDx00WD1o4%2FCleanShot%202025-02-08%20at%2017.37.08.gif?alt=media&amp;token=08e9a68d-0d25-4097-a22b-f939d6af2a24" alt=""><figcaption></figcaption></figure>

Scheduled messages are visible to all team members even before they're sent, and can be edited or canceled. You can find all your scheduled messages from the "Scheduled" view at the bottom of your Issues list in the left sidebar.

## Drafts

Pylon saves what you've typed in the editor as a draft. The **Drafts** view in the Support sidebar lists every issue where you have an unsent reply, along with new issues you saved as drafts.

## Message actions

Hover over a message in the conversation to act on it:

* **Edit**: change a message you sent. Press `Cmd-Shift-M` / `Ctrl-Shift-M` to edit your last message. Telegram messages can only be edited for 48 hours after they're sent.
* **React** with an emoji.
* **Reply in thread**, **Reply internally**, or **Reply to all via email**, depending on the channel.
* **Copy link to message**.
* **Split thread into new issue**. See Merge and split issues.

The **More actions** menu has more options:

* **Redact message**. See [Redact a message](#redact-a-message).
* **Block** the sender of a customer email. See [Email](/pylon-docs/support-workflows/email#block-from-an-issue).
* **Copy link to Slack thread** on Slack messages.
* **Forward to Telegram chat** on Telegram messages.

### Redact a message

Redact a message to remove sensitive information, such as a password a customer pasted. Inside Pylon, the message is replaced with "This message was redacted." For emails, Pylon also redacts matching copies quoted in other emails on the issue where it can.

* **Whole message**: choose **Redact message** from **More actions**. Redacting a whole message is available on the Enterprise plan.
* **Part of a message**: highlight the text and click **Redact**.

{% hint style="warning" %}
Redaction can't be undone. It only changes the message in Pylon. The original stays in the source system, such as Slack or the customer's inbox.
{% endhint %}


# Copilot

Use AI to help streamline your issue responses by clicking on the AI icon in the text formatting bar.

{% hint style="info" %}
Connect [Training Data](https://app.usepylon.com/settings/ai-controls/training-data) that is outside of Pylon to give the Copilot access to more resources!
{% endhint %}

{% hint style="info" %}
Use the `Cmd-J`or `Ctrl-J`keyboard shortcut from the editor to quickly pull up the command executor!
{% endhint %}

## Editor Copilot

### Draft Response

Allow Pylon AI to draft a response to your customer issue for you. Use the context of all your past issues, your [Pylon knowledge base](/pylon-docs/knowledge-base/overview), and any other connected documentation sources.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FgCxXm7ccJe8fwgsj00Ld%2Fmessage-copilot.gif?alt=media&amp;token=c216d0ba-bc03-4bf1-bcc8-86a4e4b4a579" alt=""><figcaption></figcaption></figure>

The sources used to construct the draft are also visible within Pylon.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F1FHgPM89NUbHhtSKXyfy%2FCleanShot%202025-01-21%20at%2017.57.10%402x.png?alt=media&amp;token=6a50b7af-b0ef-48e2-bbf0-979bf65c9927" alt=""><figcaption><p>Sources can be past issues, knowledge base articles, or external sites!</p></figcaption></figure>

### Custom Instructions

Give Pylon AI custom instructions to tune your response. Easily iterate on your tone or formatting, translate your response to another language and more!

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FNyzkX4eZ7WUpHxHUImaj%2FCleanShot%202024-12-15%20at%2016.29.41.png?alt=media&amp;token=96a2ebe1-1646-46bd-8725-8243ca250b20" alt=""><figcaption><p>Pylon Ask AI menu</p></figcaption></figure>

On your [Profile](https://app.usepylon.com/settings/profile) page, you can also customize the general tone instructions for the copilot to follow.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FMpAxGEAg6Q9lYwSHez6M%2Fimage.png?alt=media&amp;token=795ac0ad-6e77-441e-afd6-8a85ffbee81d" alt=""><figcaption></figcaption></figure>

Once a response is drafted (either by you or AI), you can highlight it and provide additional feedback to edit the draft.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F62OBdKKwosTNs1siOF1d%2Fmessage-copilot-custom-instructions.gif?alt=media&amp;token=304d45e6-05c0-4cb5-9088-063b4884e217" alt=""><figcaption></figcaption></figure>

## Sidebar Copilot

You can also find an AI copilot in the sidebar on the far right-hand side of the issue.

### Ask AI

Ask AI allows you to ask open-ended questions to help you troubleshoot issues. All answers will also pull up citations to related content to help you draft your response to the customer.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FzZjcczHXrSImsfBWHNES%2FCleanShot%202025-03-05%20at%2021.04.04.gif?alt=media&amp;token=3665df18-ff8b-43e9-897f-16bea7f21c1f" alt=""><figcaption></figcaption></figure>

### Summary

The "Summary" tab in the sidebar AI Copilot provides an always-up-to-date issue summary. Use this to handoff long and complex issues, share context with the broader team, or quickly review issues!

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FgYNcJcUzUyM1qbTKSDWL%2FCleanShot%202025-02-09%20at%2012.35.28.png?alt=media&amp;token=c214790f-b46f-48ef-a112-8870a5402323" alt=""><figcaption></figcaption></figure>

## Issue Suggestions

See suggestions on resources to help you solve an issue including related issues and documentation.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FAmI6BcOmR4Rf925QH5HJ%2FCleanShot%202025-05-14%20at%2022.55.15%402x.png?alt=media&amp;token=21cab6ca-a1fb-4fde-95d5-77ff679d4f5c" alt=""><figcaption></figcaption></figure>


# Sidebar

Everything you need to know about the issue sidebar.

## Customization

Customize the ordering of modules the order and visibility of fields within the issue sidebar from the [Issue Sidebar](https://app.usepylon.com/settings/issue-sidebar) settings page.

Hovering over a particular field will allow you to hide it entirely from the sidebar and dragging fields or modules will allow you to reorder them.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FLUKzPrtRJX6L9uOH5Nc3%2FCleanShot%202025-05-22%20at%2014.35.49%402x.png?alt=media&amp;token=2c279924-6642-45ed-b5bc-378831a145e0" alt=""><figcaption></figcaption></figure>


# Internal Threads

Have internal discussions on customer issues

## Usage

Tabs on the top of the issue view show all conversations related to a given customer issue. The first tab contains the external conversation, overlayed with all internal conversations (distinguished visually by a yellow/orange background and a note on where it's posted).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fpk45xfbU0j9pvrRE85UZ%2FCleanShot%202024-11-06%20at%2012.15.20.png?alt=media&amp;token=01c380c8-4b47-47cb-9f22-46918cc307fb" alt=""><figcaption></figcaption></figure>

Tabs contains conversations related to the issue from internal slack channels, product ticketing systems (Linear, Jira, etc.) and more.

### Creating an Internal Thread

An internal thread can be created from an issue by hitting the "+ Internal Thread" tab along the top of the issue or from the "Reply" dropdown on the top right of the editor. Internal threads can be discussions in Pylon or Slack, and represent separate conversation related to customer issue.

Each issue can have multiple internal threads related to it, but each internal thread can only be related to a single Pylon issue.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FwiOukLTxmUO8i91Xx8pn%2FCleanShot%202024-11-06%20at%2013.24.30%402x.png?alt=media&amp;token=2f1c96a0-6d85-4474-89b3-af29f34a79ee" alt=""><figcaption><p>An internal thread in Slack</p></figcaption></figure>

When an internal thread is posted to Slack, context about the issue is posted and any comments in the thread will be synced back to Pylon.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FAn3tWY8hUPeaGpkm0PZ6%2FCleanShot%202024-11-06%20at%2013.26.34.gif?alt=media&amp;token=d0b15a1d-7066-452f-8da7-7cfde2fb37ec" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Internal threads are useful for looping in additional people and teams onto issues, while still tracking all the context in one place. Use it to:

* Loop in engineering in a #bugs channel
* Kickoff a feedback discussion about a feature request into a #project channel
* Have a quick internal pricing negotiation discussion&#x20;
* Looping in a 3rd party vendor over email
  {% endhint %}

You can also create internal threads automatically using [Triggers](/pylon-docs/platform/triggers). For example, set up a Trigger to automatically open up internal threads for all new issues, or just for issues marked as high priority. You can do this from the [Internal Threads](https://app.usepylon.com/settings/internal-threads) page in settings.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FAyC59KoKPSEXskvUX1Mv%2FCleanShot%202024-11-06%20at%2016.06.04.png?alt=media&amp;token=339bb972-2f04-4824-998d-84c28110c423" alt=""><figcaption></figcaption></figure>

### Syncing an existing Internal Thread

If you already have an ongoing thread in Slack and would like to sync it to an existing Pylon issue, you can use the "Sync internal thread" shortcut in Slack. To do this:

1\) Hover over a message thread in Slack

2\) Click the 3 dots on the far right that say "More Actions"

3\) Select the "Sync internal thread" shortcut. If it's not immediately visible in the menu, click on "More message shortcuts..." the first time you are using it!

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FFeYQ6UGNfSnA0MjHm6h2%2FCleanShot%202024-11-06%20at%2013.21.37%402x.png?alt=media&amp;token=328a2cbf-ea80-4708-8e21-5e69ba404457" alt=""><figcaption></figcaption></figure>


# Proactive Issues

Initiate conversations from Pylon to customers proactively

## Usage

Create a tracked issue from Pylon by clicking the Create Issue button in the top right of the issues page.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fbd6MBCDWmFrhwBdxCCJm%2FCleanShot%202025-03-06%20at%2018.41.42%402x.png?alt=media&amp;token=57338ca9-b76e-45ec-a006-63ad08d57c5f" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Macros are available to use as part of the issue creation flow! Hit the `m` keyboard shortcut to bring up the macro menu.
{% endhint %}

{% hint style="info" %}
Use our [POST /issues API](/pylon-docs/developer/api/api-reference/issues) to programmatically create a proactive issue in any channel!
{% endhint %}

Once you select where to create the issue and fine tune your message (details below), click the "Create Issue" button again in the top right to finalize and post.

Options that aren't available for the selected account are greyed out. For example, Slack is unavailable if the account has no linked Slack channel.

To finish later, click **Save as Draft**. Saved drafts appear in the **Drafts** view in the Support sidebar.

If the requester's language is different from yours, check **Translate my message to** their language to send your message translated. This option isn't available for WhatsApp or internal issues. See [Translation](/pylon-docs/support-workflows/issues/translation).

#### Internal Only

Create an issue that is only visible internally to your team. Manually set the account of the issue as the customer account to attribute work to the proper customer.

This is best used when:

* Tracking work from a customer call
* Tracking fully internal work on behalf of a customer, i.e. requests made from internal team members

#### Email

Kick off an email to a customer or set of customers that will be tracked as an issue in Pylon. Use CC and BCC to loop in relevant additional stakeholders.

#### Slack

Kick off a proactive issue into a shared Slack channel. This will post a message into your configured shared channel with the customer and start an issue tracked in Pylon.

#### Microsoft Teams

Kick off a proactive issue into a Teams channel. This will post a message into your configured Teams channel with the customer and start an issue tracked in Pylon.

#### Google Chat

Kick off a proactive issue into the Google Chat space linked to the account. Google Chat is available on the Enterprise plan.

#### WhatsApp

Send to a contact or to a WhatsApp group. For a contact, choose the WhatsApp number to send **From** and pick an approved **Message template**. A **Template preview** appears before you send. WhatsApp only allows template messages until the customer opens a customer service window by messaging you.

#### SMS

Choose the number to text **From**, then search for contacts or enter phone numbers, including the country code.

#### Telegram

Kick off a proactive issue into the Telegram chat linked to the account.

#### Phone call

Choose the number to call **From**, pick a contact or enter a phone number, and click **Start Call**. Pylon places the call and creates an issue for it. See [Phone Support](/pylon-docs/support-workflows/phone-support).

#### Chat Widget

Kick off a proactive issue to a user over chat. This will pop your message out from the user's chat, allowing them to click and respond.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FTBL5kgl1mV5MRKkdK7cl%2FCleanShot%202025-03-07%20at%2019.49.50%402x.png?alt=media&amp;token=347c9def-601b-448f-bab8-8436cd274ed9" alt=""><figcaption></figcaption></figure>


# Translation

Automatically detect language for and translate inbound and outbound messages.

Based on your personal language preferences, Pylon can detect incoming messages that are in a different language, and auto translate them. Your responses can then be in your native language and Pylon will translate replies into the customer's language!

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Ff7SORRJObqYyfTYsGhBn%2FCleanShot%202025-03-06%20at%2015.20.07.gif?alt=media&amp;token=64867247-f9a6-45df-b95b-f54adfa40920" alt=""><figcaption></figcaption></figure>

## Set your language

Set your **Message language** on your [profile page](https://app.usepylon.com/settings/profile). Messages in other languages are translated into this language.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fmv7Sgmv6qLPbBs0eUjJC%2FCleanShot%202025-03-06%20at%2015.26.46%402x.png?alt=media&amp;token=758251aa-672c-4837-a9e2-8cd9585b7d80" alt=""><figcaption></figcaption></figure>

## Read translated messages

When an issue is in another language, a banner reads **Translated from** followed by the language. Click **Show original** to see the customer's original text, and **Show translated** to switch back. If a translation looks wrong, hover over the message and click **Regenerate translation**.

## Reply in the customer's language

The translation banner includes a **Translate my reply to** checkbox, which is on by default. While it's checked, your reply is translated into the customer's language before it's sent. Pylon remembers your choice for later replies.

When you [create a proactive issue](/pylon-docs/support-workflows/issues/proactive-issues), check **Translate my message to** to translate the first message into the requester's language.

## Set a contact's language

Set a customer's preferred language in the **Language** field on the contact. Pylon uses it when you translate a proactive message to that contact.

{% hint style="info" %}
Translation is part of Pylon's AI Assistant features and is available on select plans. Contact your account team to learn more.
{% endhint %}


# Bulk actions

Take bulk actions to manage issues

Select multiple issues in the Kanban or List view to take bulk actions on them. Issues can be selected using the checkbox on the top right of the card in Kanban or on the left of the row in List view.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F1G5WJ5ac93JJfwdvvxfI%2FCleanShot%202025-04-27%20at%2012.21.17.png?alt=media&amp;token=0f2873a2-d222-41fb-b721-ab4b993caf09" alt=""><figcaption></figcaption></figure>

Then take action on all these issues at once using the action bar at the bottom of the page.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F6K8MVnBBecDvnPW4C7SY%2FCleanShot%202025-04-27%20at%2012.18.19.png?alt=media&amp;token=aa7fc53d-d1a8-469f-b2dd-010d54830345" alt=""><figcaption></figcaption></figure>

To select every issue in a Kanban column or group, click **Select all** in its header. In List view, use the checkbox in the header row.

Actions include:

* Change status
* Set assignee
* Set team
* Set tags
* Edit field: set a custom field on every selected issue. For multi-select fields, you choose how the values are applied.
* Change customer portal visibility
* Follow and Unfollow
* Snooze
* Bulk reply
* Group issues (see [Issue Groups](/pylon-docs/support-workflows/issues/issue-groups))
* Merge issues (see Merge and split issues)
* Mark Spam: deletes the selected email issues and blocks their senders (see [Email](/pylon-docs/support-workflows/email#block-from-an-issue))
* Delete

In Kanban, you can also drag selected cards to another column together to change their status.


# Merge and split issues

Combine duplicate issues into one, or split a conversation into a new issue.

## Merge issues

Merge duplicate issues when a customer has asked about the same thing more than once.

1. Open the main issue's **...** menu and choose **Merge issue**. You can also select several issues in a view and choose **Merge issues** from the [bulk actions](/pylon-docs/support-workflows/issues/bulk-actions) bar.
2. Under **Main issue**, confirm which issue to keep. To switch, hover over a duplicate and choose **Make primary issue**.
3. Click **Add Issue** to add each duplicate issue.
4. Click **Merge**.

When you merge:

* All threads from the duplicate issues move into the main issue.
* Only the main issue's fields (status, assignee, tags, custom fields, and so on) are kept.
* The duplicate issues are deleted.

{% hint style="warning" %}
Merging can't be undone.
{% endhint %}

### Which issues can be merged

* Issues must belong to the same account.
* Issues with no account must have the same requester.
* Chat widget issues can only be merged with other chat widget issues from the same requester and the same chat widget.

## Split a thread into a new issue

If a customer raises a new topic in an existing conversation, split it into its own issue. Hover over the message, choose **Split thread into new issue**, and confirm with **Continue**. On email and form issues, you can split from any message. On other issues, you split a whole thread.

Splitting is available when an issue has more than one thread, or for email and form issues, more than one message. It isn't available for SMS, phone, Telegram, or WhatsApp issues.

{% hint style="warning" %}
Splitting can't be undone.
{% endhint %}


# Issue Groups

Group related issues together during incidents

Issue groups introduce a parent-child relationship between issues and a new interface to manage the parent issue, including:

* Seeing all the associated child issues and being able to navigate to them
* Sending a bulk reply to all child issues, for example an outage resolution message
* When closing an issue group, optionally close all child issues at once.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fy0ePU2Z28ZkLdGFGNFZp%2FCleanShot%202025-05-08%20at%2000.59.43%402x.png?alt=media&amp;token=dc8a8736-1811-4653-b350-51baca296caa" alt=""><figcaption></figcaption></figure>

## Filter issue groups in views

| Filter                     | What it matches                                                                                                          |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| **Is Issue Group**         | Issue groups themselves.                                                                                                 |
| **Number of Child Issues** | Issue groups, by how many child issues they have.                                                                        |
| **Parent Issue Group**     | **has any value** matches child issues. **has no value** matches everything else, including the issue groups themselves. |

To keep child issues out of a view while still seeing each issue group, add **Parent Issue Group** · **has no value**. To hide the issue groups as well, also set **Is Issue Group** to **No**.


# Anomaly Detection

Automatically detect outages and issues across your customer base.

{% hint style="info" %}
Use Anomaly Detection to find outages and major problems in real-time.
{% endhint %}

Based on your incoming customer issues, Pylon automatically detects anomalies and surfaces groups of related issues for your review.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FnOWOm2d2z1beQRGhyXgL%2FScreenshot%202025-08-28%20at%203.28.34%E2%80%AFPM.png?alt=media&amp;token=97b1c08f-aad0-4835-a86e-8310d37539b7" alt=""><figcaption></figcaption></figure>

Available actions when an anomaly is detected:

* **Create an Issue Group**\
  Take advantage of [Issue Groups](/pylon-docs/support-workflows/issues/issue-groups) to organize and manage all issues related to this anomaly.
* **Mark as False Alarm**\
  Flag the anomaly as a false alarm to help Pylon improve future detection accuracy.
* **Dismiss for All**\
  If no further action is needed, you can dismiss the anomaly banner for everyone on your team.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fhm9IILYCtlTI7bTY1VFF%2Fanomaly.png?alt=media&amp;token=2811135d-b2a3-46e1-a21b-e2e3fe668868" alt=""><figcaption></figcaption></figure>


# SLAs and Timers

Set differentiated service level agreement timers on customer issues.

SLAs (Service Level Agreements) define how quickly you want to respond to, follow up on, and resolve customer issues.

Pylon supports four types of issue SLAs:

1. First Response Time: How long the customer waits for the first qualifying customer-visible reply. For tickets, timing normally begins when the ticket is created. For conversations, it begins with the first qualifying customer message. Replies from Pylon AI Agents count as a first response. Internal notes, private messages, and trigger-generated automatic messages do not count.
2. Next Response Time: How long the customer waits for a subsequent reply after the first response. Timing begins when the customer sends another qualifying message and ends when a team member sends a qualifying customer-visible reply.
3. Follow-up Time: How long it takes your team to send another customer-visible update when your team was the last to respond. Unlike Next Response Time, Follow-up Time is proactive and it measures whether your team follows up without waiting for another customer message. Internal notes do not count.
4. Resolution Time: How long it takes to resolve an issue. Closing the issue finalizes resolution time. Pylon measures it through the latest qualifying customer-visible reply from your team. If there is no qualifying reply, it uses the time the issue was closed. For a team SLA, Pylon uses that team’s latest qualifying reply or falls back to the close time.

Changes to SLA rules and support-hour settings apply going forward. Completed historical metrics are not recalculated.

Pylon also tracks **active time** — how long teammates actually spend working an issue. It has no target and cannot breach, so it is not an SLA, but it appears alongside the SLA timers on the issue and shares their [counting settings](#counting-settings).

## Setup <a href="#setup" id="setup"></a>

1. Visit the [SLAs page](https://app.usepylon.com/settings/slas) (**Settings > Workflows > SLAs**) and click **Add Issue SLA**
2. Select from one of the available templates for common SLA configurations for a good starting point

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FSwDlear76JtoX64aVVc3%2FCleanShot%202025-06-03%20at%2021.34.25%402x.png?alt=media&amp;token=7148a437-c1af-4270-ab30-0b02c54021b4" alt=""><figcaption></figcaption></figure>

3. Modify the trigger with the conditions and values that make sense for your business. SLAs can be applied based on many factors, including the priority of the issue, the type of customer who raised it, etc.

### Notification <a href="#sla-alerts" id="sla-alerts"></a>

To setup notifications for SLAs, choose the "Send Slack notification on SLA breaches" template. Update the channel to your preferred one, or the action to a different notification type (such as email).

When an issue violates an SLA

1. The configured action will be taken, for example notifying a Slack channel
2. Users can also subscribe to notifications for SLA breaches on issues they are assigned to on the [notifications page](https://app.usepylon.com/settings/notifications).

### Support Hours <a href="#support-hours" id="support-hours"></a>

If you want SLAs to only increment during your working hours, you can configure Support Hours on the [Settings Page](https://app.usepylon.com/settings/support-hours). This makes sure that weekends and evenings will not inflate your count of SLA breaches.

### Counting Settings

Counting settings control when SLA and metric timers run. Find them under **Settings > Workflows > SLAs > Counting settings**. Changes apply to new issues only.

For each metric, choose the statuses in which **Time counts when**:

| Metric              | Timer runs while                                                       |
| ------------------- | ---------------------------------------------------------------------- |
| First response time | The issue is in a selected status                                      |
| Next response time  | The customer was last to respond and the issue is in a selected status |
| Follow-up time      | Your team was last to respond and the issue is in a selected status    |
| Resolution time     | The issue is in a selected status                                      |

`New` and `On You` always count, and closed statuses never do. Add other statuses, including your custom statuses, to keep the timer running in them. Leave a status out to pause the timer while an issue sits in it. For example, leave out `On Hold` so resolution time pauses while you wait on an engineering fix.

Without counting settings, first and next response time count in `New` and `On You`. Follow-up and resolution time also count in `On Customer`.

#### Start counting time when the conversation becomes a ticket

When this is enabled, timers still run while an issue is a conversation, but they restart when the conversation becomes a ticket. A reply sent before the conversation became a ticket no longer counts as the first response; the first reply after it does.

{% hint style="info" %}
Counting settings are available on the Enterprise plan.
{% endhint %}

### Team SLAs

Team SLAs allow setting SLAs on how long a team is assigned to an issue. These run independently from issue SLAs. Create them with **Add Team SLA** on the **Team SLAs** tab of the [SLAs page](https://app.usepylon.com/settings/slas) or from [trigger templates](https://app.usepylon.com/settings/slas/create?groupID=b929bfac-4b9a-475d-9075-0e13074d79f3\&category=teamSla). Team SLAs are visible in [analytics](https://app.usepylon.com/analytics?tab=general).

Team SLAs are available on the Enterprise plan.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FHZuGLkerHusj1HEJLqxi%2FCleanShot%202025-11-09%20at%2016.20.55%402x.png?alt=media&amp;token=6b8f81df-d6af-47eb-a717-6359fcbc42de" alt="" width="375"><figcaption></figcaption></figure>

### SLAs vs Team SLAs

The key difference is what each SLA measures. Issue SLAs measure the customer’s overall experience. For tickets, timing normally begins when the conversation becomes a ticket; for non-ticket conversations, it begins with the first qualifying customer message. Team SLAs measure a specific team’s performance and start when the SLA is applied or the issue is assigned to that team, whichever happens later. This prevents a team from being penalized for\
time before it owned the issue.

Issue SLAs should be used when:

* You want to measure the overall customer experience from issue creation to resolution.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FMEAFs15mrhVEfnGeTsSR%2FScreenshot%202025-11-12%20at%2011.06.19%E2%80%AFAM.png?alt=media&amp;token=35f95a4c-ad54-4fd4-89c0-adcc760653a7" alt=""><figcaption></figcaption></figure>

Team SLAs should be used when:

* You want to measure individual team performance separately from the overall customer experience.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FsPTn5EzHXpgI0KosxQTo%2FScreenshot%202025-11-12%20at%2011.01.21%E2%80%AFAM.png?alt=media&amp;token=1c864699-0852-4231-9b12-789a92791a35" alt="" width="311"><figcaption></figcaption></figure>

### Active Time

Active time measures hands-on effort per person, per issue, rather than elapsed time. It is configured in the same place as SLA counting, **Settings > Workflows > SLAs > Counting settings**, and appears in the SLAs sidebar module on every issue. Active time is available on the Enterprise plan. See [Active Time](/pylon-docs/support-workflows/slas-and-timers/active-time) for the full behavior.


# Active Time

Active time measures how long a teammate actually spends working an issue, tracked per person, per issue. Unlike time to resolution, it ignores the hours an issue sits idle waiting on someone.

{% hint style="info" %}
Active time is available on the Enterprise plan.
{% endhint %}

### How it's counted

Active time accrues for a teammate while all of these hold:

* The issue is open in Pylon, in a visible and focused tab.
* They have interacted with the page — mouse, keyboard, scroll, or touch — in the last minute.
* The issue is in a counting status (see below).
* They can reply to the issue. Read-only viewers accrue nothing.

Switching tabs or windows pauses the clock immediately. Going idle pauses it after a minute, and that minute is itself counted — someone who reads a long thread for five minutes without touching anything is credited about one. Scrolling and mouse movement count as interaction, so ordinary reading keeps it running.

Each issue records both total active time and the portion that fell inside its [Support Hours](/pylon-docs/support-workflows/support-hours).

{% hint style="info" %}
Active time is only tracked in the Pylon web app. Replies sent from Slack or your email client are not counted.
{% endhint %}

### Choosing which statuses count

By default the clock runs while an issue is **New** or **On you**. Add more statuses in the **Active time** card under **Settings > Workflows > SLAs > Counting settings**. Two rules are fixed: New and On you always count, and closed statuses never do.

Status is evaluated continuously, so the clock stops the moment an issue moves to a status that does not count.

### On the issue

Active time appears in the **SLAs** sidebar module as **Total active time** — the sum across everyone who worked the issue, in business hours. Expand it for the per-person breakdown; without the Active Times permission you see only your own row. The figure is issue-wide, so per-team blocks do not carry it.

Turn on **Show timer on issue** in the same settings card to give each person a live timer of their own current session. Nobody else sees it.

With full access to Active Times you can correct someone's figure through **Edit Active Time** on their row. An edit replaces their current total rather than adding to it, and later work accrues on top.

### Reporting

| Dataset | Columns                                                                   |
| ------- | ------------------------------------------------------------------------- |
| Users   | Active time, Active time in business hours — per user, per issue          |
| Issues  | Total active time, Total active time in business hours — across all users |

The [Workforce dashboard](/pylon-docs/reporting-and-analytics/default-dashboards) charts it by teammate.

[Warehouse sync](/pylon-docs/integrations/data-warehouse) offers `active_time_seconds`, `active_time_business_hours_seconds`, and `active_time_by_user` on the issues table. They are not added to existing syncs automatically — edit the sync's column selection.

The [API](/pylon-docs/developer/api/api-reference/issues) returns the same three fields on issues, with the per-user breakdown limited to the caller's own time without the Active Times permission.

### Permissions

The **Active Times** role permission under **Settings > Workspace > Users > Manage User Data > Roles** governs other people's figures: view to see them, full access to edit them. Your own is always visible.

### Things to know

* Active time cannot be backfilled prior to it being tracked.
* Two people reading the same issue both accrue, so the issue total can exceed the wall-clock time it was open.


# Support Hours

Set schedules your company's operates on.

## Setup

From the [Support Hours page](https://app.usepylon.com/settings/support-hours) (**Settings > Workspace > Support hours**), build schedules for support hours. Support hours has support for:

* Multiple schedules, each in different timezones
* Default and custom holidays
* Assignment rules that decide which schedule applies to which accounts and issues

To start a new schedule from an existing one, open the schedule's menu and choose **Duplicate**.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FUFyI1lB3Ahm9uQa4U9QM%2FCleanShot%202025-05-21%20at%2017.54.43%402x.png?alt=media&amp;token=c0c0ac80-647a-4aed-b519-26198e24f495" alt=""><figcaption></figcaption></figure>

### Holidays

Add default holidays or create a custom holiday from a schedule. A custom holiday can happen once (**Repeats: Never**) or repeat weekly, monthly, or annually.

Holidays are shared across schedules. Editing a holiday updates every schedule that uses it. From a schedule, **Remove holiday** takes it off that schedule only, while **Delete holiday** removes it from all schedules.

### Assignment Rules

The **Assignment rules** tab decides which schedule applies to an issue. Each rule pairs a schedule with Account and Issue filters:

* **Account filters** match account fields, such as tier or owner. Select a rule to preview the accounts it matches.
* **Issue filters** match issue fields, such as source, chat widget, or ticket form. For example, give chat widget issues a 24/7 schedule and email issues business hours.

Rules are evaluated top-down, and the first matching rule wins. Drag rules to reorder them. Issues that match no rule use **Default support hours**.

Changes to issue rules apply to matching issues after you save. Historical metrics are not recalculated.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F9XycZBLwCSQdugqATKf4%2FCleanShot%202025-05-21%20at%2017.56.54%402x.png?alt=media&amp;token=70fdda0e-8c0d-4a72-bbf4-f687d6c808d9" alt=""><figcaption><p>Assign support hours to specific accounts or sets of accounts</p></figcaption></figure>

### User Schedules

Support hours can also be assigned to teammates, from **Settings > Workspace > Users** (select users, then **Assign Support Hours**) or from a team. A teammate with a schedule becomes `Active` during their hours and `Away` after hours, so [Assignment Rules](/pylon-docs/support-workflows/assignment-rules) only routes issues to people who are working. See [User Status](/pylon-docs/support-workflows/assignment-rules/user-status).

## Usage

### SLAs

Support hours affect how [SLAs and Timers](/pylon-docs/support-workflows/slas-and-timers) are calculated. When an SLA is configured to use support hours, its timer increments only during open support hours and excludes associated holidays. Otherwise, it uses calendar time.

### Triggers

Within [Triggers](/pylon-docs/platform/triggers), a Support Hours filter is available. This can be used to setup workflows like auto-responders when customers submit requests outside of your working hours.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FzLvwWQVXpTykkjaxW7Ke%2FCleanShot%202024-10-06%20at%2019.33.30.png?alt=media&amp;token=7d5a27c2-9820-4a2c-af5c-f91767403229" alt=""><figcaption></figcaption></figure>

### Analytics

Many analytics, like time to first response or time to resolution, can be viewed including and excluding support hours.


# CSAT

Pylon has a built-in tool to help you collect satisfaction scores from customers!

CSAT is one of Pylon's [Surveys](/pylon-docs/platform/surveys). It asks the customer to rate their support experience after an issue.

## Setup

1. Go to **Engagement > Surveys > CSAT** (also linked from **Settings > Communications > CSAT**) and click **Create Survey**.
2. On the **Configuration** tab, customize the survey's wording and follow-up question.
3. On the **Send method** tab, click **Add a Trigger** and set the conditions for when the survey is sent.
4. Optionally, turn on **Enable cooldown period** in the same tab so a customer who responded doesn't receive the survey again for a set time.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FgM4YKdLWrGd7bb6iIvCJ%2Fimage.png?alt=media&amp;token=ce79ef08-0438-4dc8-94d6-ace7b7b0a37f" alt="" width="286"><figcaption></figcaption></figure>

Customize when CSAT is sent out within the trigger. For example, easily disable CSAT for certain customers that express fatigue with surveys, or for certain types of issues.

### Supported channels

CSAT surveys are sent on the issue's channel:

| Issue source            | How the survey is delivered                                     |
| ----------------------- | --------------------------------------------------------------- |
| Slack                   | A message in the issue's thread that only the requester can see |
| Chat widget             | In the chat widget conversation                                 |
| Email and ticket forms  | Email to the requester                                          |
| Issues created in Pylon | Email to the requester, if they have an email address           |

CSAT surveys are not currently sent for other channels, including Microsoft Teams and customer portal issues.

### Behavior <a href="#how-it-works" id="how-it-works"></a>

* The CSAT survey is sent to the customer who opened the issue.
* Pylon sends at most one CSAT survey per issue. If a trigger fires again on the same issue, no second survey is sent.
* Email surveys are not sent to contacts who have unsubscribed from surveys.
* CSAT surveys are on a 1-5 point scale with an optional space for free form feedback.

CSAT data is visible on a dedicated tab within Analytics and on the survey's **Results** tab. CSAT for an individual issue is also available on the page for that issue.


# Ticket Forms

Let your customers submit structured tickets across different channels.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FeYpBFHks8aBQbNNiU7oS%2Fimage.png?alt=media&amp;token=20473eb2-f9e3-494c-8189-85a0efeb8798" alt=""><figcaption><p>Web form example</p></figcaption></figure>

## Setup <a href="#setup" id="setup"></a>

1. Visit the [Ticket forms page](https://app.usepylon.com/settings/ticket-forms) (**Settings > Communications > Ticket forms**) and create a form. To start from an existing form, open its menu and choose **Duplicate**.
2. On the **Form fields** tab, choose the form's **Allowed platforms** and add fields. Supported platforms are:
   * **Web**: public link, customer portal, knowledge base, and chat widget
   * **Slack**
   * **Microsoft Teams**

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FTT8uDZayVilXSVki0RyH%2FScreenshot%202025-06-23%20at%201.51.34%E2%80%AFPM.png?alt=media&amp;token=331035f4-b1d6-49ca-b511-04bf9f0941a6" alt=""><figcaption></figcaption></figure>

3. Now that your form is configured, configure its usage within your desired channels.
   1. [Customer Portal](https://app.usepylon.com/customer-portal?page=forms): Under **Settings > Customers > Customer portal > Ticket forms**, choose which sets of forms are visible to which sets of users.
   2. Public: Share the public link to your form. You can also embed it on your site or app if you put the form link in an iframe. In the form's **Web settings**, turn on "Allow anyone on the internet to access URL" under **Enable public access**.
   3. [Chat Widget](https://app.usepylon.com/settings/chat-widget): Under **Settings > Communications > Chat widget**, open your widget and go to the **Modules** tab. In the **Ticket forms** section, create form sets and use filters to decide which forms each set of users sees.
   4. Slack: Use [Triggers](/pylon-docs/platform/triggers) to configure when a form gets sent out in Slack. Use our default recipe as a starting point!

      <figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fu89H2BMjTS6Ers2prX3T%2FCleanShot%202025-02-15%20at%2018.16.55.png?alt=media&amp;token=986d1c57-bb9a-4fae-9e31-5ca52828c7c9" alt=""><figcaption></figcaption></figure>
   5. Microsoft Teams: Use [Triggers](/pylon-docs/platform/triggers) with the **Send form** action and a Microsoft Teams source condition to send the form in Teams channels and chats. The form appears as an Adaptive Card. Only forms with **Allow on Microsoft Teams** turned on can be sent.

### Fields

* **Default fields**: name and email (always on web forms), plus subject, description, and CCs. You can also add any issue field.
* **File upload** lets customers attach files to web form submissions. A form can have more than one file upload field. File upload isn't supported on Slack, so a form with a file upload field can't also be allowed on Slack.
* Slack forms collect the customer's name and email automatically. Required fields are optional when a form is sent over Slack.
* Microsoft Teams forms show the form's supported issue fields. Adjust how they appear on the **Microsoft Teams settings** tab.

### Web Settings

The **Web settings** tab controls how the form behaves on the web:

* **Email**: the email address that web submissions are forwarded to. Required for web forms.
* **Description**: optional text shown to customers above the form.
* **Form slug**: the slug used in the form's URL and in chat widget forms.
* **Enable public access**: lets anyone with the link open the form.
* **AI search**: suggests answers based on the form's Subject or Description field. The form must include at least one of those fields.
* **Email notifications**: emails the customer when they submit the form and when an agent replies.
* **Submission email**: sends the customer an email immediately after they submit. Email notifications must be on.

### Submission Email

When **Submission email** is on, customize the email under **Submission email settings**:

* **Subject**, **Title**, and **Description**. Type `{` to insert variables.
* **Hide form fields in email**: send a generic confirmation with a link to the portal instead of the submitted answers. This prevents the form content from being used for phishing.

A preview of the email appears next to the settings.

### Conditional Fields

For web-based forms, you can add conditional fields. This allows you to prompt the user for additional information based on their answer to a given question.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FbuO5RwCFSo4qTthUzSfx%2FCleanShot%202025-03-08%20at%2012.43.16%402x.png?alt=media&amp;token=7ca4917a-a7ca-4a69-b1a1-a4cf3db95f1e" alt=""><figcaption></figcaption></figure>

### AI Form Suggestion

AI Form Suggestions can automatically suggest relevant knowledge base articles to users as they fill out ticket forms. Turn this on with the **AI search** setting in the form's **Web settings**.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F8wyMj1pdpUWjTJrNeZBB%2FAI%20Form%20suggestions.png?alt=media&amp;token=b5ab3ef3-dcc9-4116-90c7-bd6edc6bd278" alt="" width="563"><figcaption></figcaption></figure>

## How submissions are matched to contacts and accounts

Pylon files each web submission under a contact and account based on where the form was submitted:

* **Public link or embedded form**: Pylon uses the email entered on the form.
* **Customer portal**: Pylon uses the signed-in contact and the account they're viewing in the portal.
* **Chat widget**: Pylon uses the widget user's `email`, plus `account_id` or `account_external_id` if you pass them. See [How Pylon matches widget users to contacts and accounts](/pylon-docs/chat-widget/chat-setup#how-pylon-matches-widget-users-to-contacts-and-accounts).

If a contact already has the email, Pylon uses it and files the issue under the contact's account. Otherwise, Pylon creates a contact in the account whose domains include the email's domain. If no account matches, Pylon creates an account from the domain. It doesn't do this for personal email domains like gmail.com, or when **Suppress automatic account creation** is on in **Settings > Customers > Account configuration**. In those cases the contact has no account.


# Assignment Rules

Setup assignment rules to make sure issues make their way to the right person.

As your team grows, assignment rules will allow you to make sure that issues are being handled by the right person.

## Setup

### Individual Assignment

Individual assignment rules can be setup using the "Set issue assignee" action in [Triggers](/pylon-docs/platform/triggers).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FsHpqPKXRW19CeSbMp0zi%2FCleanShot%202024-10-19%20at%2018.28.29.png?alt=media&amp;token=85befacc-7694-4192-b1b7-0d2e4d45cbe6" alt="" width="448"><figcaption></figcaption></figure>

### Team Assignment

First create [Teams](/pylon-docs/platform/teams) that model groups of people. Then, create assignment strategies to automatically assign issues to individual members of a team. When an issue is assigned to a team, the individual owner of the issue can be determined by the team's assignment policy. Use **Only assign issues to users whose status is** to choose which statuses can receive assignments. New teams start with **Any status**. See [User Status](/pylon-docs/support-workflows/assignment-rules/user-status).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FCm80gZVKAF0IHxzSME0L%2FScreenshot%202025-10-08%20at%2010.27.10%E2%80%AFPM.png?alt=media&amp;token=d447257a-2c42-4e51-950a-4d8957032386" alt=""><figcaption></figcaption></figure>

#### Round Robin

Rotate between each team member equally when assigning issues.

#### Recurring

Set up a daily or weekly repeating schedule. Based on the time of day, issues that are assigned to a team will fall onto the appropriately individual’s plate.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F4993iKaVN8gvUHeGDdyc%2FScreenshot%202025-11-24%20at%2010.13.41%E2%80%AFAM.png?alt=media&amp;token=0ea15717-817c-418d-8500-59f2bae55500" alt=""><figcaption></figcaption></figure>

#### Skill-Based Routing

Skill-based routing prioritizes available team members by the combined levels of the skills they have that match the issue (such as languages, product areas, or other custom fields). Team members don't need to match every selected skill, and a higher level in one skill can outweigh lower levels across several skills. Skill blocks are checked in order, and each one narrows the candidates to those with the highest combined level. Each block's **If no skilled members are available** setting decides what happens when no available member matches it: **Move to next strategy** passes every candidate on unchanged, and **Wait for next available skilled member** leaves the issue in that block's queue.

Examples:

* If a customer submits an issue in French, it is automatically routed to a team member who has the French skill configured.
* Bugs related to the Payments system are routed to employees with the “Payments” skill.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FOOuxjMivRujaAUk8E9Br%2FScreenshot%202025-10-08%20at%2010.34.17%E2%80%AFPM.png?alt=media&amp;token=bc7290fd-0950-45db-af5f-4b25f67ff16b" alt="" width="375"><figcaption></figcaption></figure>

#### Capacity Rules

Even if a user has the right skills, they will not be assigned issues if their status isn't allowed by the team's **Only assign issues to users whose status is** setting or they have already reached their configured capacity. In those cases, routing continues to the next eligible user or falls back to other strategies.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FXDJjoZW3P6pL9axiFcp8%2FScreenshot%202025-10-08%20at%2010.35.30%E2%80%AFPM.png?alt=media&amp;token=65d5f850-540b-48e8-9474-658700a18a49" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="info" %}
The capacity calculation for round robin assignment counts issues in both `New` and `On You` status'.
{% endhint %}

#### Queueing

When no team member is able to take on an issue assigned to the team, the issue can be left in the team queue. Issues in the team queue will automatically be assigned as team members become available.

By default the queue is first in first out by issue priority. This means that `Urgent` issues are always dequeued first, followed by `High`, `Medium`, and `Low` priority issues. Each team can replace this with its own sort — see **Queue sort order** below.\
\
Issues can also be left in skill block queues which will require someone with a matching skill to be available before that issue can be assigned.

This also applies when you reassign an issue that *already has an assignee* to a team with **Override existing assignee** enabled: if no team member is currently available (for example, all members are at capacity), the previous assignee is cleared and the issue joins the queue, then is assigned automatically once a member becomes available.

An issue stays in the queue until it's assigned, closed, or moved to another team. If a team leaves issues unassigned instead of queueing them, Pylon doesn't try to assign those issues again later. Unassigning an issue on a round robin, recurring, or skill-based team doesn't return it to the queue.

{% hint style="info" %}
Switching a team to leave issues in the queue, or to pull-based assignment, doesn't add issues that are already unassigned on that team to the queue. Assign those issues by hand.
{% endhint %}

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FlmtwxpmDVbF7Wa6PO0yb%2Fimage.png?alt=media&amp;token=932e29a8-02ee-4414-b870-426a648d9d41" alt=""><figcaption></figcaption></figure>

#### Queue Sort Order

Each team can replace the default priority ordering with its own sort. Go to **Settings > Workspace > Teams > \[your team] > Assignment**. The **Queue sort order** section appears once the team is configured to leave issues in the queue.

Choose up to four fields. They apply in the order listed, so the first field decides the ordering and the ones below it break ties. Rows can be dragged to reorder them. **Time entered queue** is always the final tiebreaker and cannot be changed or removed.

You can sort by:

* **Issue** — boolean, number, date, and select custom fields on the issue.
* **Account fields —** the same field types, read from the issue's account.
* **SLAs** — `Issue Response SLA`, `Issue Resolution SLA`, `Team Response SLA`, `Team Resolution SLA`, or `Next upcoming SLA`. These sort by when the SLA is due to breach, so the most urgent issue comes first.

Each row sorts ascending or descending, and what that means depends on the field. Ascending puts `false` first, the lowest number first, the oldest date first, and the SLA closest to breaching first. Descending reverses each of those. Unset values are always last.

{% hint style="info" %}
A **select** field sorts by the order its options are defined in on the field itself, not alphabetically. Ascending puts the *first* option at the front of the queue.

Priority is a select field whose default options are defined `Urgent`, `High`, `Medium`, `Low`, which is why sorting by priority **ascending** puts `Urgent` issues first. If you have reordered or renamed the priority options, check the field's option order prior to choosing a direction.

To change it, flip that row to descending, or reorder the options on the custom field. Reordering the options affects every team that sorts by that field.
{% endhint %}

Issues with no value for a sort field are always placed last, whichever direction the field is sorted in. A team with no queue sort configured keeps the default priority ordering.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FXDT1JyZxYFIQtbvIvUSv%2Fimage.png?alt=media&amp;token=da0af1b8-a030-4dcc-a661-b84b5fe52ca1" alt=""><figcaption><p>Add</p></figcaption></figure>

#### Pull-Based Assignment

Pull-based assignment flips the model: instead of Pylon pushing each new issue to a team member, members claim the next issue themselves. To enable it, go to **Settings > Workspace > Teams > \[your team] > Assignment** and set the assignment strategy to `Pull-based`, then configure the Queue sort order so the team agrees on what "next" means (for example, a custom priority field first, then the next upcoming SLA). Unassigned issues routed to the team wait in the team queue in that order, and Pylon never assigns them automatically. An issue that already has an assignee keeps it unless **Override existing assignee** is enabled. Each team sets its own strategy, so a subteam of a pull-based team is only pull-based if you set it to be. The highest pull-based team in a chain of subteams sets the queue sort order for every pull-based team below it. Members of a pull-based team see a `Take new issue` button in the top right of their issue views, and clicking it assigns them the highest-ranked issue across every pull-based team they belong to. `Take new issue` skips any team where the member is already at capacity. Because queues are combined per user, all of a member's pull-based teams must share the same sort order. **Skip Issue** returns an open issue assigned to you to its team's pull queue, before you've sent a customer-visible reply. It excludes the issue from your queue for 24 hours while leaving it available to other members. If every eligible team member skips it, the skips reset sooner so the issue can be offered again. Unassigning an issue on a pull-based team also returns it to the queue. Admins can also restrict a role to only see its own or unassigned issues, so agents work exclusively through `Take new issue` rather than browsing the `New` column. Pull-based assignment is available on the Enterprise plan.

### Usage

Put team assignment policies into affect by creating [Triggers](/pylon-docs/platform/triggers) that automatically assigns issues to a certain team.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FFQetr78wcnoYGNzyMDFk%2FCleanShot%202024-10-19%20at%2018.23.03.png?alt=media&amp;token=f1ceb924-c6d4-4495-a467-15ffeb2cce66" alt=""><figcaption><p>A recipe for a common workflow</p></figcaption></figure>

You can setup any number of workflows to make sure issues get to the right people. Some examples might be:

* Routing high priority issues straight to Tier 3 support
* Routing bugs about a specific topic to the subject matter expert for that product area
* Reassigning issues that have had their SLA breached
* Routing pre-sales issues from important accounts to your sales engineering team
* Routing issues from named accounts to their CSM

{% hint style="info" %}
By creating subteams, you can effectively model complex assignment workflows, since each subteam can have its own assignment policy. If subteams are a part of a team assignment schedule, they will need an assignment policy set at the subteam level to work properly.
{% endhint %}


# User Status

Allow users to set their status to active, away, or out of office

## Statuses

Pylon has three built-in statuses: `Active`, `Away`, and `Out of office`.

### Custom Statuses

Admins can add workspace-specific statuses, such as "In a meeting" or "Lunch". Each custom status inherits the behavior of a built-in status. Assignment settings list each custom status separately (see [Status and assignment](#status-and-assignment)).

1. Go to **Settings > Workspace > Users** and click **Manage User Data**, then open the **Statuses** tab.
2. Click **Add Status** in the **Available** section for statuses that behave like `Active`, or in the **Unavailable** section for statuses that behave like `Away`.
3. Drag statuses to reorder them, then click **Save**.

Archive a custom status to hide it from the status picker. Archived statuses can be restored from **Archived statuses** in their section. Only workspace admins can edit statuses; other users with access to user settings can view them.

## Setting Status

Users can set their status by clicking their profile and then selecting Change status. Depending on the status they select, they will have additional options they can configure, like how long they will be in that status as well as whether to reassign their issues.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FYH71zrqOKHfrJUuAbIVB%2FCleanShot%202024-11-16%20at%2017.39.03.gif?alt=media&amp;token=e5382a5d-873f-4c29-bf23-cf703ce3d663" alt="" width="326"><figcaption></figcaption></figure>

Admins can also set status on behalf of users from **Settings > Workspace > Users**. To change several users at once, select them in the table and use the **Status** action in the bar that appears.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FVVqXHE3MrNL3fWVCsnTR%2FCleanShot%202024-11-16%20at%2017.42.29.png?alt=media&amp;token=c4a4c174-18b7-4b7e-b777-5bc47c5039cc" alt=""><figcaption></figcaption></figure>

An assignee's status can also be used as a filter in triggers, views, etc. This can allow you to control specific behavior for workflows when a user is active, away, or out of office.

## Status and assignment

Two settings control which statuses can receive automatic assignments. Each one opens a list of every status, including custom statuses, and you pick the ones that are allowed.

| Where                                                                                                                                           | Setting                                         | Default for new teams and actions         |
| ----------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- | ----------------------------------------- |
| **Settings > Workspace > Teams > \[your team] > Assignment**                                                                                    | **Only assign issues to users whose status is** | **Any status**                            |
| The **Set issue assignee** and **Set task assignee** [trigger actions](/pylon-docs/platform/triggers/conditions#assigning-to-unavailable-users) | **Assign only if the user's status is**         | Every status in the **Available** section |

With **Any status**, users are eligible whatever their status. Once you pick specific statuses, a user in a custom status is only eligible if that custom status is selected; selecting the built-in status it's based on doesn't include it. If you select exactly the statuses in the **Available** section, available statuses added later are included too.

When the team setting rules out every team member, the team's [assignment rules](/pylon-docs/support-workflows/assignment-rules) decide what happens next, for example leaving the issue in the team queue.

## Status Logs

Open a user from **Settings > Workspace > Users** to see their **Status Logs**: each status change, when it happened, and who set it. Changes made automatically by a synced calendar show the calendar as the source.

## Automatic User Status

User status can automatically switch between `Active` and `Away` via [Support Hours](/pylon-docs/support-workflows/support-hours). Assign or create a new support hours to individual users via **Settings > Workspace > Users** or via **Settings > Workspace > Teams**.

Once assigned a support hours schedule, users will automatically become `Active` during their enabled support hours, and will become `Away` after hours.

By default all new users will be assigned `All Hours` and will not automatically switch until a support hours has been selected.

Automatic switching between statuses is overridden when a user manually sets their status to `Away` or `Out of office` indefinitely. To clear the manual override they should return to `Active`.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fb270WYTCUxchowc3xi28%2Fimage.png?alt=media&amp;token=a084a47e-3200-4da6-af96-52d87e1d6fec" alt=""><figcaption></figcaption></figure>

`Out of office` can also be automatically synced via the [Calendar](/pylon-docs/integrations/calendar) integration on a per user basis

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F08gQdCXIN5ccUMrsmVGR%2Fimage.png?alt=media&amp;token=925fc777-5d65-4e2e-8ce2-b1cb187b852b" alt=""><figcaption></figcaption></figure>


# Email

Connect your email addresses with Pylon to track and respond to support requests over email.

{% hint style="info" %}
You can connect as many different email addresses with Pylon as you'd like!
{% endhint %}

Manage email from **Settings > Integrations > Email**. The page has these tabs:

* **Connected emails**: every mailbox connected to Pylon, with its sync status
* **Blocked emails**: rules that stop unwanted senders from creating issues
* **Suppressed emails**: addresses Pylon won't send to because earlier emails bounced
* **Email privacy**: only shown to workspaces with HIPAA compliance enabled (see [Email privacy](/pylon-docs/support-workflows/email#email-privacy))

## Connect an email address

Click **+ Add Email** and choose the type of account.

### Individual email account (Gmail or Outlook)

Use this for a standard mailbox with SSO, like `name@company.com`. Select **Gmail** or **Outlook Mail** and sign in to authorize Pylon. Before you connect, choose:

* **Which emails do you want synced to Pylon?** Pick **Only customer emails** (recommended) or **All emails**.
* **Create issues from new customer emails**: when this is off, emails are synced for logging and AI only and no issues are created.
* **Allow Pylon to send from this email on behalf of others**: lets teammates reply from this address. It's required for form confirmations, customer portal replies, and using the address as the workspace's default sender. When it's off, only you can send from the address.

To pull a personal inbox's history into account activity, see [Personal Email Integration](/pylon-docs/account-intelligence/accounts/personal-email).

### Shared email account (forwarding)

Use this for a group inbox or alias without SSO, like support@, billing@, or help\@.

1. Choose **Shared email account** and enter the address.
2. Copy the Pylon forwarding address shown for that email.
3. Set up automatic forwarding from your inbox to that address. For Google Workspace, follow [Google's forwarding instructions](https://support.google.com/a/answer/4524505#address-map-forwarding).
4. Click **Test Forwarding** to confirm emails are reaching Pylon.

### Manage connected emails

Each connected email has an options menu with these actions:

* **Resync**: pull in emails again
* **Reauthorize**: reconnect a Gmail or Outlook mailbox
* **Disable** / **Enable**: pause or resume syncing
* **Test Forwarding**: check a forwarded address
* **Delete**: disconnect the email

A **Failed** badge means the connection may not be pulling in emails. Reauthorize or resync it to fix this. **Forwarding unverified** means Pylon hasn't received a forwarded test email yet.

## Mailbox settings

Click a connected email to open its settings. The settings you see depend on whether the address is an individual mailbox or a shared address.

### Preferences

* **Create issues from new customer emails**: when this is off, emails are synced for logging and AI only.
* **Create issues from automated emails** (shared addresses): when this is off, auto-replies and system notifications don't open new issues.
* **Custom alias name**: send emails using a shared name such as "Support Team" instead of the agent's name. Check **Set alias as the default name for replies** to use it on every reply by default.
* **Reply-To Address** (shared addresses): send customer replies to a different address. Leave it blank to use this inbox. The other mailbox must forward incoming emails to this email's Pylon forwarding address.
* **Email signature** (shared addresses): added to the end of every email sent from this address. You can use variables such as `{{ actor.name }}`, `{{ issue.number }}`, `{{ issue.requester.first_name }}`, and `{{ issue.account.name }}`.
* **Reply to requester by default**: new email replies default the To field to the issue's requester.
* **Autofill recipients** (shared addresses): set default **Auto-Cc recipients** and **Auto-Bcc recipients** for replies on email issues. Agents can still edit recipients before sending. The **Previous issue participants** entry keeps earlier Cc recipients on the issue. If you remove it, they're no longer added by default.

You can also upload an avatar to replace the default image for this email.

### Incoming emails

Shared addresses show the Pylon forwarding address to forward your inbox to. If you've set up a custom domain, this section lists the **MX records** to add instead.

When the custom domain includes it, add the **Tracking** CNAME record to track email opens and clicks.

Sent emails show who they were delivered to and opened by. Some email clients block open tracking, so a delivered email may not show as opened.

### Outgoing emails

By default, Pylon sends outgoing emails from a Pylon domain. To send from your own domain, turn on **Customize outgoing domain**. Add the DNS records shown to your domain, then click **Verify DNS**.

Under **Custom sending address**, you can enter a different from-address on your domain. Leave it blank to send from the receiving address.

## How emails are matched to contacts and accounts

When an email starts a new issue, Pylon picks the requester. It's the first address that isn't one of your connected email addresses or a teammate (a Pylon user, or an address on your workspace's domain). Pylon checks addresses in this order:

1. **Reply-To**
2. The original sender, when a group or alias relays the email
3. **From**
4. The only customer address in **To**, then **CC**, then **BCC**
5. An address in a forwarded message's body. If a teammate forwards a customer's email to your support address, the customer becomes the requester.
6. Any other recipient

Pylon then finds the requester's contact and account:

* **Existing contact**: if a contact has that email, Pylon uses it. If contacts on more than one account share the email, Pylon prefers the contact on a [partner account](/pylon-docs/account-intelligence/accounts/partner-accounts), then the one on the account that owns the email's domain.
* **New contact**: Pylon adds the contact to the account whose domains include the email's domain. If no account matches, Pylon creates an account from the domain. It doesn't do this for personal email domains like gmail.com, or when **Suppress automatic account creation** is on in **Settings > Customers > Account configuration**. In those cases the contact has no account.

The issue is filed under the requester contact's account. To send future emails from a domain to the right account, add the domain to that account.

## Blocked emails

Blocked email rules stop matching senders from creating new issues or syncing into Pylon.

1. Go to the **Blocked emails** tab and click **Add Blocked Email Rule**.
2. Choose a **Condition**:
   * **Is**: an exact address or a whole domain, like `example@domain.com` or `domain.com`
   * **Starts with**, **Ends with**, or **Contains**: any text
3. Optionally add **Exceptions**, which are addresses that are always let through. You can add up to 200 per rule.
4. Choose which connected emails apply the rule: **All connected emails** or **Choose specific emails**.

Generic email domains (like gmail.com) can't be blocked as a whole domain. Pylon warns you before you save a rule that would block your own workspace's emails or emails from Pylon.

To change the mailboxes for several rules at once, select them and click **Set Blocked By**. To remove rules, select them and click **Delete**.

### Block from an issue

* **Mark as spam**: on email and form issues, open the issue's **...** menu and choose **Mark as spam**, or press `!`. Pylon deletes the issue and blocks the sender across all connected emails. You can also select several email issues and choose **Mark Spam** from the [bulk actions](/pylon-docs/support-workflows/issues/bulk-actions) bar.
* **Block a sender**: hover over a customer's email message, open **More actions**, and choose **Block** followed by the sender's address. Future emails from that address won't create issues.

## Suppressed emails

When an email hard-bounces, Pylon suppresses that address and stops sending to it. The **Suppressed emails** tab lists each **External email**, the **Suppression reason** (including the bounce message from the recipient's mail server when one is available), and when it was suppressed.

To start sending to an address again, click **Remove Suppression** on its row. You can also select several rows and click **Unsuppress**.

### Unsuppress and resend from an issue

When a reply doesn't reach a recipient, the message shows a **Bounced** or **Suppressed** warning. Hover over the warning and click **unsuppress and resend email**. Pylon unsuppresses the address and adds the bounced email to the reply editor as a draft so you can send it again. This replaces any draft already in the editor.

## Email privacy

{% hint style="info" %}
Email privacy is only available to workspaces with HIPAA compliance enabled. Contact your account team to learn more.
{% endhint %}

The **Email privacy** tab has separate controls for chat widget notifications, matching accounts, and email apps:

* **Redact chat widget notifications by default**: replace chat widget notification emails with portal-link notifications. This is the chat widget default, not a default redaction mode for every outbound email.
* **Accounts**: set filters for accounts that must receive portal-link notifications. An empty filter matches no accounts. Matching accounts use portal-link redaction even when an email app uses another mode.
* **Email apps**: choose the redaction mode separately for outbound notification emails from each connected email app.

| Email app mode      | Behavior                                                                                                          |
| ------------------- | ----------------------------------------------------------------------------------------------------------------- |
| **TLS Conditional** | Include the message only if every recipient's mail server supports TLS encryption. Otherwise, send a portal link. |
| **Always**          | Always send a portal link and never the message body.                                                             |
| **None**            | Send the full message unless the account matches the **Accounts** filter.                                         |

Use **Portal issue notification link** to customize the link in redacted issue notification emails.


# Phone Support

***

### Phone Support in Pylon <a href="#undefined" id="undefined"></a>

Pylon's Phone feature enables your support team to handle inbound and outbound phone calls directly within your existing Pylon workflow. Rather than managing calls in a separate tool, phone conversations are treated as first-class issues — giving your agents full customer context, call transcripts, and AI-powered summaries alongside every other support channel.

***

### Overview <a href="#undefined" id="undefined"></a>

With Phone, you can:

* Receive and make calls directly from Pylon
* Automatically create and associate issues with phone calls
* Access call recordings and transcripts on each issue
* Handle callbacks, voicemails, and call transfers
* Set support hours to manage call routing outside business hours
* View phone call data in your analytics dashboards

***

### Set up Phone <a href="#undefined" id="undefined"></a>

If you do not see the following options in your organization, Phone & SMS most likely is not enabled for your organization. You must reach out to your AE or CSM to have the Phone functionality enabled for your organization.

Phone is an add-on feature ($35/user/month).

1. Go to **Settings** > **Phone & SMS**
2. In the upper-right-hand corner, click **Add Phone Number**
   1. You can port in an existing number or add a new number
3. Once you add a new number, you should be able to click into it and view this page

![Screenshot 2026-03-31 at 10.49.18 AM.png](https://assets.usepylon.com/6e227170-1068-46ce-9820-5286999d3672%2F1774979805739-Screenshot2026-03-31at10.49.18AM.png?Expires=253370764800\&Signature=Juwt1MwABQODHeIkd8qefjhP4mmwk0qBKMddfZ8yubKom7xXbpK9wjkhogGpYFxC21daRYis589D3Dst3jGR6Ev7fugM8pgjdbh0pDvrraNjGqb~dppEjLHCLbEFe909zUoYq3TpUB7R2zccdXec4iuSnBAWdDnktxdoMrXVMUApEek6QldownPQkPMQSUyxJlPh6zFE5Gf9RxOcrP7fLdaZ1K~6O-lo9JZowSx1NOmtgh575qtJYlAErh66oBotNnfGn0JQTameluRXxC3G5PiTPgUxSR13DsKQle0bg~k2Oc~Wo7kpLRmuyD~n9FoQh2WFvMuvdAH08T~Cms~vgw__\&Key-Pair-Id=K3NV4LZ47N8M46)

**Name:** What you have named the phone line (internal)

**Caller ID Name:** This is what will show up on customers phones when a Pylon user is calling them

**Enable Calling:** Whether you want this number to be able to make & receive calls

**Enable SMS text messaging:** Whether you want this number to be able to make & receive texts

SMS can be enabled on US local numbers and on mobile numbers you port in from outside the US and Canada. It can't be enabled on toll-free numbers in any country, including the US, or on local numbers outside the US. See **International Numbers** below.

* Note: Before you can turn on SMS for a number, you need to complete the 10DLC registration on the **Carrier registration** tab of **Settings** > **Phone & SMS**. 10DLC is not required for calling.

**Call Flow:** Where you set up the IVR

**Call Recording:** If you want your calls recorded, keep this option enabled. Disabling this option will not produce a voice recording, an automatic transcript, or an AI-generated summary.

**Port away number:** The ability to port away a number if necessary

### International Numbers <a href="#undefined" id="undefined"></a>

You can buy or port in numbers in these countries:

* United States
* Canada
* Australia
* New Zealand
* United Kingdom
* Philippines
* Netherlands

Set up requirements vary by country. Most countries require a local business address to provision a local number. If you don't have one, you can provision an international toll-free number instead, which doesn't require a local address.

International numbers support all the same features as US numbers, with one exception: SMS. Local and toll-free numbers outside the US are for voice calls only, including Canadian numbers. A mobile number you port in from outside the US and Canada can send and receive texts once you complete 10DLC registration. Mobile numbers can only be ported in, not bought through Pylon.

### Set up IVR <a href="#undefined" id="undefined"></a>

![Screenshot 2026-03-31 at 11.13.59 AM.png](https://assets.usepylon.com/6e227170-1068-46ce-9820-5286999d3672%2F1774981070853-Screenshot2026-03-31at11.13.59AM.png?Expires=253370764800\&Signature=iX1MxPhvQ4qfRjIGyo4IxsY5CqZiXxcXWgl30AiM50UyAgP7EWHIN7kmVODppV~ntE12tQ-ZuuTybG6ZiyvptZOnvddXdIDxUfOmnaYzbkAeW47f6urJJ7AYe44UTTpk~grwjZ1SAZ4BpZCtepGLmjbXSkmSV3~EeGddTr8Gw12hsKh30NeFwPb80YmwCrLOHyOIvt971odWLwUDc95vW~aSPBiAoyUIH7sAS1HyNoLiU0~P16rZv1zlletBujEDw0S8Yi7cdP3VkUBmAGrEF1afnSmK1B8-1zs-yOELS5b-C3u6QRgMcUDwoPD1uyP3-9lzS4LPBRThKJaEEepG7g__\&Key-Pair-Id=K3NV4LZ47N8M46)

The call flow operates similarly to Pylon's triggers.

**Support Hours:** You can filter what happens to calls whether they occur within configured support hours or outside support hours.

**Start IVR:** Route calls using basic IVR functionality. Use text-to-speech or audio files.

**Route calls to specific teams:** Configure your teams in Settings > Teams and route calls to them via round robin

**Send calls to voicemail:** Use text-to-speech or upload audio files.

### Inbound Calls <a href="#undefined" id="undefined"></a>

When a customer calls your support number, the call is routed to available agents in Pylon. An issue is automatically created for the call so your team can take notes, track actions, and follow up — all in one place.

By default, incoming calls ring in the browser. Individual users can instead route incoming calls to the phone number on their profile by going to **Settings** > **Profile** (<https://app.usepylon.com/settings/profile>) and enabling **Enable forwarding incoming calls to your mobile phone**.

![Screenshot 2026-03-31 at 11.22.08 AM.png](https://assets.usepylon.com/6e227170-1068-46ce-9820-5286999d3672%2F1774981441809-Screenshot2026-03-31at11.22.08AM.png?Expires=253370764800\&Signature=ZPTVck-0WNbTooaL~ev3ghfoEWzYWa9yQEul5EiQqqjGkG4qSUJqF1e0HHrIaeG6BWvV9go~5Xo46umz0ox3Ni2V9a3SP57vJ4L~58gTtjC6o1vkQl8KoNUSflknDxf22ikoTwYJhuWYue3usbvKfW31Hus6Qd~7tRBMU8MBuljoPlI0HYJYqdjiJUpb0qvNgulE7tNY4NxwFiWCKF85A0m76zOb4uk4FeFyYjBL-eKTvhltdvHGN4HSlMk90X4pQbBv472q6NHbIuQGprSS7zf-aJR4Q2-8UpGN4sMREmTlhHDjY2ZBxumoZB~S-gNspxs7VV1QKblGc6K0cJDtWg__\&Key-Pair-Id=K3NV4LZ47N8M46) ![Screenshot 2026-03-31 at 11.22.22 AM.png](https://assets.usepylon.com/6e227170-1068-46ce-9820-5286999d3672%2F1774981566557-Screenshot2026-03-31at11.22.22AM.png?Expires=253370764800\&Signature=B~b9MhTlcDcieQR7-HZZDNs7VteiLL5LG5P0q7TT4rC7~lTHzMq1G1zPcNxeyv9KJ8pdOh46eXcJrl0zwyY2azN1BCgRvO3ou5X4kvKEPmfKR1TGfBXvwknq3K31P9vDpBcc5A5beVFAag3h-ogeR2gnwqRPReapIMyu5URPkj6oHy10QYkoPFo3o5bLQHDb60vHiDAl9~VGZ-AXfJBGDhB5dua~eVdDXbb~AWD9JckjnlQSob3Wo90xvIRW7yFexT1vuLoYlc1SmCARpbw6X1i462hmCmuSHQtk6UdJd~ZxlDUDUYD7CzI3qy1sPNELGWwXWmSQ1dCcWGwRVZk6fA__\&Key-Pair-Id=K3NV4LZ47N8M46)

**Phone icon:** Allows you to put calls on hold

**Microphone icon:** Allows you to mute calls

**Arrow icon:** Allows you to transfer calls

#### Callback Flow <a href="#undefined" id="undefined"></a>

Agents can initiate a callback directly from an issue, letting customers request a return call rather than waiting on hold.

![Screenshot 2026-03-31 at 11.27.55 AM.png](https://assets.usepylon.com/6e227170-1068-46ce-9820-5286999d3672%2F1774981734283-Screenshot2026-03-31at11.27.55AM.png?Expires=253370764800\&Signature=o~CkZDgW1pCcCmfuVpBDhMgkoYKtX7QRLq4Cr~oXM~uiBRMRHUIuo4AAaa~7w8TEOfIYFHuAZCQMYwsrZ6er6uv53WmsaoQgIKpIOxhoWU~e4jENRC44otwMPJ1dqHm4CKc6oGSRbMesU0NCNNVKKngbKV4wEvV97g-e~9qeAbKdAYSy38qQujI7SYowEqhSe9OzKkAENdgZHDp62GKDWLunCdgk5MGbOIRyTwWlbYNXSJv0-oSjGT6j4zIBLjhJqeXfz02jxEQcS0aup7gll8vae3nxettVE68tkwRVpSYinuDOHflAym3agS5vEFoFSF-6TK0LY8RB2058SoF8Sg__\&Key-Pair-Id=K3NV4LZ47N8M46)

***

### Outbound Calls <a href="#undefined" id="undefined"></a>

Agents can place outbound calls directly from an issue in Pylon. This is useful for proactive follow-ups or cases where email or chat has gone unanswered.

![Screenshot 2026-03-31 at 11.29.23 AM.png](https://assets.usepylon.com/6e227170-1068-46ce-9820-5286999d3672%2F1774981775003-Screenshot2026-03-31at11.29.23AM.png?Expires=253370764800\&Signature=tpPWjclzvwVEiJEDyVGZJePPS-2avAbCqEucnTdpETe~jsQk-~VC1opsPSInj66TLcX2CPqtYk5DbBWu8OVYz9gl2DnfolD-wpfyZgTr9eBK850d9nuNbsLlttIdNPjKNsoE-m0eJCMLrszefl9Jag2nb2OPA25i7OEi2za8MAhVi7u2iZQc-EVXabVI1SByqofecqZsnzrZ2svgdApnsN4sR4Yoa0r5pneSWmg-4TDwcPzbndSRZhYPPK~HC5GH9wwpX5PHcpie5~k1h6P37sfCH66TFzzmnwwMyfvcYVyyUPcyT3TmD1j-xsXFPaem~X8EIiz7yuVkc2suSGT1~w__\&Key-Pair-Id=K3NV4LZ47N8M46)

***

### Call Recordings & Transcripts <a href="#undefined" id="undefined"></a>

When **Call Recording** is on for the number, calls are recorded and transcribed. The transcript and recording are attached to the issue created for that call, making it easy to review what was discussed and follow up on action items.

#### Recording consent

Some countries require a caller's explicit consent before a call can be recorded. When either phone number on a call is in Germany, Finland, or Mexico, or Pylon can't tell which country a number is in, Pylon asks the customer for consent before recording. This applies to both inbound and outbound calls:

* The customer is asked to press **1** to allow recording or **2** to continue without it. On calls involving a German number, the prompt plays in German first, then in English if the customer doesn't respond.
* The call is only recorded if the customer presses 1. Otherwise, it connects without a recording, transcript, or AI summary.
* The call card on the issue shows **Recording consent given** or **Recording consent not given**.

***

### Account Intelligence <a href="#undefined" id="undefined"></a>

Phone calls are automatically linked to the relevant account in Pylon. Customer context — including account history, previous issues, and account data — is surfaced to the agent during the call, so there's no need to switch between tools to look up who you're speaking with.

***

### Frequently Asked Questions <a href="#undefined" id="undefined"></a>

**Can I use my existing phone number?** Yes. You can port an existing number to Pylon or provision a new one.

**What happens if no agents are available?** Callers will be routed to voicemail if no agent is available or if the call comes in outside your configured support hours.

**Are calls recorded by default?** Yes, calls are recorded and transcribed if you have automatic call recording enabled. For calls involving numbers in Germany, Finland, or Mexico, Pylon asks the customer for consent first (see [Recording consent](/pylon-docs/support-workflows/phone-support#recording-consent)). Check your local regulations regarding call recording consent requirements.

**Can I have multiple phone lines?** Yes. Pylon supports multiple phone numbers, which can be assigned to different teams.

**Do phone issues show up in my regular issue queue?** Yes. Phone calls automatically create issues in Pylon, which appear alongside issues from all your other channels.

**Can Pylon support international calls?** Yes. Pylon supports international calling, and you can buy or port in phone numbers in the countries listed under **International Numbers**.

***

*Have questions? Reach out to Pylon support.*


# User QA

Apply rubrics to issues to make sure guidelines and process are being followed.

User QA uses AI to grade closed issues against rubrics you define, so you can check that guidelines and processes are being followed at both the issue and the teammate level. Find it under **Settings > Support > User QA**.

{% hint style="info" %}
User QA is available on select plans. Contact your account team to enable it.
{% endhint %}

## Rubrics

Create rubrics on the [User Rubric](https://app.usepylon.com/settings/ai-controls/qa?tab=userRubric) tab:

1. Click **Add Metric**.
2. Describe how the AI should evaluate this metric: what to look for, how to judge it, and how to score it.
3. Add the scoring **Options**.
4. Under **Applies to**, choose **Issue** to grade the issue as a whole, or **each Agent individually** to grade every teammate who worked the issue.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FfbQdqjdUKZTAOkr97xIe%2FCleanShot%202025-09-10%20at%2011.28.59%402x.png?alt=media&amp;token=0652e0da-f92b-497e-bf8c-56880373872e" alt="" width="563"><figcaption></figcaption></figure>

## Review

When issues are closed, they are evaluated against your rubrics. If an issue is reopened before grading finishes, it is graded the next time it closes.

* The [Issues](https://app.usepylon.com/settings/ai-controls/qa?tab=issues) tab lists evaluated issues. Filter by date and rubric results, for example to find issues not meeting expectations.
* The [Users](https://app.usepylon.com/settings/ai-controls/qa?tab=users) tab shows results per teammate for a date range. Open a teammate to see their results in detail.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FDrkuymT8rst79Zym568C%2FCleanShot%202025-09-09%20at%2015.10.51%402x.png?alt=media&amp;token=0ed7cb2f-5fdb-400a-8323-a97f30aceb53" alt=""><figcaption></figcaption></figure>


# Custom Fields

Set up custom fields to add structured data to your issues, accounts, and contacts.

Custom fields store structured data on your records. They can be filled in manually, synced from your CRM, autofilled with AI, set through APIs or workflows, or filled through customer submissions. Configure them under **Settings > Customers > Account data**, **Settings > Customers > Contact fields**, or **Settings > Support > Issue data**.

Custom fields can be used across the product in views, analytics, triggers, macros, and more.

## Overview

### Field Types

Pylon supports the following custom field types:

* Text
* Number
* Decimal
* Select
* Multi-select
* Boolean
* Date
* User
* Contact
* URL
* Email
* Datetime
* [Formulas](/pylon-docs/account-intelligence/fields/formulas)

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FVnr2GWcy5jC9nbXA7325%2FCleanShot%202024-09-29%20at%2021.34.57%402x.png?alt=media&amp;token=95cb3ef9-b440-4adf-bec5-5ec04c444d58" alt=""><figcaption><p>Example of a "Product Area" custom field</p></figcaption></figure>

***

## Usage

### Manually Fill

Custom fields can be manually filled from their individual record pages.

Issue fields: filled in via. the issue sidebar.

Account fields: filled in via. the accounts page.

Contact fields: filled in via. the contacts page.

### Who can fill a field value?

For editable account and issue fields created in Pylon, an Admin with access to the field's settings can configure **Who can fill the field value?** in the field's **Settings** tab. Choose **Anyone**, **Some members** (specific users and teams), or **Only me**. A user must also have permission to edit the record.

This setting controls who can fill values, rather than who can see the field. It isn't available for contact fields, CRM-synced fields, formulas, rollups, or web research fields. Configure customer access separately in [customer portal settings](/pylon-docs/customer-portal/styling-and-customization).

### Select and multi-select options

Choose **Custom**, **A to Z**, or **Z to A** to order a select field's options. With **Custom**, drag options into the order you want. The same ordering choices apply to multi-select fields.

For issue fields, you can also limit which options appear based on other field values. See [Field value visibility](/pylon-docs/platform/custom-fields/required-and-conditional-fields#field-value-visibility).

### :sparkles: AI Autofill

{% hint style="info" %}
AI autofilled fields can be manually updated when your record and field permissions allow it. Once manually updated on a record, they will not be overridden by AI in the future.
{% endhint %}

Custom fields can be autofilled using AI to reduce manual work.

Fields with a :sparkles: by their name are fields that are fields that are being automatically filled via. AI.

For account fields specifically, learn more here [AI Fields](/pylon-docs/account-intelligence/fields/ai-fields).

### Sync from CRM

Account and contact custom fields can be synced directly from your CRM. Multiple times a day these values will be updated from the latest data in your CRM.

To enable this, you should connect your CRM via the [Apps Directory](https://app.usepylon.com/apps). More details can be found in the [CRM](/pylon-docs/integrations/crm) articles.

### Fill via. API

Use our [PATCH /issues](/pylon-docs/developer/api/api-reference/issues), [PATCH /contacts](/pylon-docs/developer/api/api-reference/contacts), and [PATCH /accounts](/pylon-docs/developer/api/api-reference/accounts) API endpoints in order to set custom field values via. API.

For issues raised from the Chat Widget, our JavaScript API can set custom field values on issue submission.

### Fill via. Formulas

Use [Formulas](/pylon-docs/account-intelligence/fields/formulas) to automatically fill in field values uses calculations.

### Fill via. Triggers or Macros

Use the "Set custom field value" action on a trigger or macro in order to programmatically fill a custom field value.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F0ij95JINoKL5eCIv7u97%2FCleanShot%202024-09-29%20at%2021.39.53%402x.png?alt=media&amp;token=a750d6f5-b865-4854-a6ca-3d7d13ed0072" alt=""><figcaption></figcaption></figure>

### Fill via. End User Submission

Use [Ticket Forms](/pylon-docs/support-workflows/ticket-forms), collect data [directly in Slack](/pylon-docs/integrations/chat/slack/collect-data), or allow customers to set fields via. the customer portal to populate custom field values based on user input.


# Required and Conditional Fields

Different field types allow you to collect only the information relevant to the current Issue you're editing.

## Required Fields

Required fields must be filled in to save any change to an issue, from closing tickets to setting fields or assigning an issue. This is useful for making sure every issue is labeled for accurate analytics downstream as you grow your team. The set required fields will be applied on the[ issues page.](https://app.usepylon.com/issues/views/all-issues)

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F4Mkm0jReD54grV1bxj0y%2Fimage.png?alt=media&amp;token=42ff75a1-200d-4e44-8dfa-8b1bcd473349" alt=""><figcaption></figcaption></figure>

## Visibility Conditions

Conditionally show (and require!) fields based on the values in another field. For [issues](https://app.usepylon.com/settings/issue-sidebar?tab=configuration), this is useful for showing extra fields to gather information in different conditions (i.e. different details are needed for bugs vs. feature requests). Visibility conditions can also be used to conditionally show nested fields, such as a Sub-Product Area that shows only when a Product Area is provided.

For [accounts](https://app.usepylon.com/settings/account-sidebar?tab=configuration), use visibility conditions to selectively show fields based on the tier of customer or which products they have bought.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FxiGkflsbyuPOQGpipSV8%2Fimage.png?alt=media&amp;token=889b52bb-b65e-494a-af58-07e828705edb" alt=""><figcaption></figcaption></figure>

## Field value visibility

For issue **Select** and **Multi-select** fields, **Field value visibility** controls which options are available, while visibility conditions above control whether the whole field appears.

Open the field's **Settings** tab, add a condition under **When**, and use **Add Field Values** under **Display** to choose the options available when that condition matches. Each condition needs at least one field condition and one displayed value. Use **Add Condition** for additional cases.

* If several conditions match, the available options are the combined values from all matching conditions.
* If no condition matches, all options are available.
* Removing all conditions restores the full option list.

For example, show one set of Sub-product options when Product is A, and a different set when Product is B.


# Field History

Track how field values change over time to monitor trends and identify important shifts in your customer data.

### Overview

Field history tracks changes made to custom field values in Pylon, allowing you to view historical data and analyze trends over time. This is particularly valuable for monitoring key metrics like ARR, health scores, sentiment, and account engagement.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FP1qgzIGTR9pR50dANWVR%2FField%20History%20.png?alt=media&amp;token=76d83a8d-c96e-4074-b3dc-ed2d02ffe59d" alt="" width="280"><figcaption></figcaption></figure>

### Formulas

Track field history using account formulas: `GetValue`, `GetValueRelative`, `QueryChange`, and `QueryChangePct`. These formulas let you fetch point-in-time values or calculate changes over time. Learn more about formulas here.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F9Js9JsQP6GS2Ke8e4My0%2Fmeeting%20score.png?alt=media&amp;token=eaafc213-df51-44eb-bf00-934e3780957f" alt=""><figcaption></figcaption></figure>


# Tags

Use tags to quickly create labels to categorize issues and accounts, or to enable step-by-step workflows that fire throughout the lifecycle of an issue.

## Overview

Tags are labels that can be added to issues or accounts to group them together. Tags can be created dynamically directly from an issue or account by typing a new value into the tags field on an Account or Issue. Each tag has both a name and a color for easy visual categorization.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fsx2KUCLcjkcCJDlRQdH2%2FCleanShot%202024-10-19%20at%2018.15.45.png?alt=media&amp;token=c9d1a158-691a-47a7-8d95-6cf9fe7ec1fb" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Use [custom fields](/pylon-docs/platform/custom-fields) for more structured data collection! Tag options can be created on the fly — so use tags for quick and dirty labeling and workflows.
{% endhint %}

## Usage

Add a tag to an individual issue or account by clicking into the record and finding the tags field. From there, either select one or more existing tags values to apply or type a new value to create and apply a new tag.

Tags can also be applied in bulk by selecting a set of issues or accounts, then applying a tag from the tag menu that pops up at the bottom of the page.&#x20;

Once applied, tags can be used across Pylon in other places like views, triggers, macros, and more.

After they're created, Tags can be managed from the Issue Tags or Account Tags pages in settings —  this is where you'll be able to edit or delete tags, change their colors, and see how many issues and accounts they are associated with.


# Teams

Represent your organizational structure within Pylon to set up workflows and automations

Create teams with assignment rules, then utilize them to set up targeted issue views and workflows, and analyze metrics relevant to different teams.

## Setup <a href="#create-teams" id="create-teams"></a>

### Team Creation <a href="#create-teams" id="create-teams"></a>

Create teams from the [teams page](https://app.usepylon.com/settings/teams/management) and add members.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FtRvOfhHtUOb4IJXIDbUn%2FCleanShot%202025-03-15%20at%2012.47.49%402x.png?alt=media&amp;token=9c557fde-9221-4132-af0e-99ae7cde917f" alt=""><figcaption></figcaption></figure>

Teams can also contain other teams as subteams. For example, you may have a broad Support team with different subteams representing various geographic regions.

## Usage

Teams can be used across Pylon as a filter value in views, triggers, macros, and more. Issues can also be assigned to a team manually from the UI, via the API, or via triggers and macros with the "Set issue team" action.

You can also set up complex [assignment rules](/pylon-docs/support-workflows/assignment-rules) to define behavior for what happens when an issue is assigned to a specific team.

## Staffing Heatmaps&#x20;

Forecast workload and optimize scheduling using live heatmaps of agent activity, handle time, and ticket volume.&#x20;

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FiN40v6CpKhWj5rPZJliW%2FCleanShot%202025-10-21%20at%2014.39.54.png?alt=media&amp;token=d6906289-5dc4-41ac-a305-69eac31e4ef4" alt="" width="563"><figcaption></figcaption></figure>


# Triggers

Set up complex workflows and automations to execute your business processes

## Setup

Go to **Settings > Workflows > Triggers** to start creating triggers. Triggers are always organized into a group to help your team stay organized. Click **Create > Create Trigger** to pick from premade templates or start from scratch.

Every trigger has three parts:

1. **When** — the kickoff event that starts the trigger.
2. **If** — optional conditions the object must meet, plus optional time delays.
3. **Then** — the actions to take.

### Kickoffs <a href="#kickoffs" id="kickoffs"></a>

A kickoff is the event that starts a trigger. Pick one in the **When** card, and use **Add another trigger event** to start the same trigger from more than one event. All kickoffs on a trigger must belong to the same object (for example, all issue events).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FD9OjerIz3Udtlror7UyO%2FCleanShot%202025-10-31%20at%2013.59.56.png?alt=media&amp;token=edbd5732-1567-4420-a58c-9fb833862162" alt="" width="316"><figcaption></figcaption></figure>

{% hint style="info" %}
Every ticket starts as an issue, so a trigger that uses both **New issue created** and **Issue turned into ticket** runs twice for new tickets.
{% endhint %}

#### Issues

| Kickoff                             | When it fires                                                                                                                                                |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| New issue created                   | A new issue is created.                                                                                                                                      |
| Issue turned into ticket            | An issue becomes a ticket.                                                                                                                                   |
| Issue has a new message             | A message or internal note is added. Filter by sender (customer, your team, or anyone) and message type, and optionally skip the first message on the issue. |
| Issue status changed                | The issue moves to a new status. Optionally limit to specific statuses.                                                                                      |
| Issue assigned                      | The assignee changes.                                                                                                                                        |
| Issue team set                      | The issue's team changes.                                                                                                                                    |
| Issue account changed               | The issue is moved to a different account.                                                                                                                   |
| Issue tags changed                  | Tags are added to or removed from the issue.                                                                                                                 |
| Issue custom field changed          | A selected issue field changes.                                                                                                                              |
| Issue unsnoozed                     | A snoozed issue wakes up.                                                                                                                                    |
| Issue reaction added                | A reaction is added to any message on the issue. Optionally limit to specific reactions and who added them.                                                  |
| Slack internal thread created       | An [internal thread](/pylon-docs/support-workflows/issues/internal-threads) is posted to a Slack channel. Optionally limit to a channel.                     |
| Issue product ticket status changed | A linked Jira, Linear, GitHub, Asana, or Shortcut ticket changes status.                                                                                     |
| CSAT survey completed               | A customer responds to a [CSAT survey](/pylon-docs/support-workflows/csat).                                                                                  |
| Email not delivered                 | An email sent on the issue bounces or can't be delivered.                                                                                                    |
| Message redacted                    | A message on the issue is redacted. Available on select plans.                                                                                               |
| Issue has a new voice call          | An inbound or outbound call is added to the issue. Requires [Phone](/pylon-docs/support-workflows/phone-support).                                            |

#### SLAs

See [SLAs](/pylon-docs/support-workflows/slas-and-timers) for how each SLA type is measured.

| Kickoff                                                                   | When it fires                                         |
| ------------------------------------------------------------------------- | ----------------------------------------------------- |
| Issue SLA changed                                                         | An SLA is applied to the issue or its SLA changes.    |
| Issue SLA breached                                                        | Any issue SLA breaches.                               |
| Issue first response SLA breached                                         | The first response SLA breaches.                      |
| Issue next response SLA breached                                          | The next response SLA breaches.                       |
| Issue follow-up SLA breached                                              | The follow-up SLA breaches.                           |
| Issue resolution SLA breached                                             | The resolution SLA breaches.                          |
| Team SLA changed                                                          | A team SLA is applied or changes. Requires team SLAs. |
| Team SLA breached                                                         | Any team SLA breaches. Requires team SLAs.            |
| Team first response / next response / follow-up / resolution SLA breached | That team SLA breaches. Requires team SLAs.           |

On SLA breach kickoffs, click **Front-delay** to fire the trigger a set amount of time *before* the breach instead of at it — for example, to warn the assignee 30 minutes ahead. Check **Count only support hours** to count only time inside your [support hours](/pylon-docs/support-workflows/support-hours).

#### Accounts and contacts

| Kickoff                      | When it fires                                                        |
| ---------------------------- | -------------------------------------------------------------------- |
| New account created          | A new account is created.                                            |
| Account owner changed        | The account owner changes.                                           |
| Account tags changed         | Tags are added to or removed from the account.                       |
| Account custom field changed | A selected account field changes.                                    |
| New contact created          | A new contact is created.                                            |
| Contact custom field changed | A selected contact field changes.                                    |
| NPS survey completed         | A contact responds to an NPS [survey](/pylon-docs/platform/surveys). |

#### Tasks and projects

See [Tasks & Projects](/pylon-docs/account-intelligence/tasks-and-projects).

| Kickoff                            | When it fires                           |
| ---------------------------------- | --------------------------------------- |
| New task created                   | A new task is created.                  |
| Task status changed                | The task moves to a new status.         |
| Task has a new comment             | A comment is added to the task.         |
| Task custom field changed          | A selected task field changes.          |
| Task product ticket status changed | A linked product ticket changes status. |
| New project created                | A new project is created.               |
| Project status changed             | The project moves to a new status.      |
| Project owner changed              | The project owner changes.              |
| Project custom field changed       | A selected project field changes.       |
| Milestone completed                | A milestone in a project is completed.  |

#### Feature requests

Requires [Feature Requests](/pylon-docs/product-intelligence/feature-requests), available on select plans.

| Kickoff                                       | When it fires                              |
| --------------------------------------------- | ------------------------------------------ |
| Feature request created                       | A new feature request is created.          |
| Feature request status changed                | The feature request moves to a new status. |
| Feature request custom field changed          | A selected feature request field changes.  |
| Feature request product ticket status changed | A linked product ticket changes status.    |

#### Meetings and opportunities

| Kickoff                          | When it fires                                                                                                                                  |
| -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| New meeting created              | A meeting is added from a connected [calendar](/pylon-docs/integrations/calendar) or [call recorder](/pylon-docs/integrations/call-recording). |
| Meeting occurred                 | A meeting has ended.                                                                                                                           |
| Meeting transcript ingested      | A call recording transcript is added to the meeting.                                                                                           |
| Meeting custom field changed     | A selected meeting field changes.                                                                                                              |
| New opportunity created          | A new opportunity is created in Pylon or synced from your [CRM](/pylon-docs/integrations/crm).                                                 |
| Opportunity custom field changed | A selected opportunity field changes.                                                                                                          |

#### Knowledge base

| Kickoff           | When it fires                                                                                       |
| ----------------- | --------------------------------------------------------------------------------------------------- |
| Article published | A knowledge base article is published, including when you publish an update to an existing article. |

#### Custom objects

If your workspace uses [custom objects](/pylon-docs/platform/custom-objects), each object type adds two kickoffs: **New \[object] created** and **\[Object] custom field changed**.

#### Team and calendar

| Kickoff                         | When it fires                                                                                                                     |
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| User status changed             | A teammate's [status](/pylon-docs/support-workflows/assignment-rules/user-status) changes (for example, Active to Out of Office). |
| New out of office event created | An out of office event is added to a teammate's connected [calendar](/pylon-docs/integrations/calendar).                          |
| Out of office gap detected      | Out of office events leave a team with no one available during part of its support hours.                                         |

#### Other

| Kickoff             | When it fires                                                                                                                                                                                                                                                                                     |
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Recurring schedule  | Runs on a schedule (every N days, weeks, or months, or every weekday) and checks every matching account, contact, issue, or task. Choose whether it acts every time, or only the first time an object matches and then again after a waiting period or once the object stops and starts matching. |
| Anomaly detected    | Pylon detects an [anomaly](/pylon-docs/support-workflows/issues/anomaly-detection) in your issues. Requires the AI Assistants plan.                                                                                                                                                               |
| Email blocked       | Email from an address is blocked for the first time.                                                                                                                                                                                                                                              |
| Email suppressed    | An email can't be sent because the recipient's address is suppressed or inactive.                                                                                                                                                                                                                 |
| Phone call comes in | A call reaches one of your support numbers. Set this up from your phone number's call flow, not from the Triggers page. Requires [Phone](/pylon-docs/support-workflows/phone-support).                                                                                                            |

### Conditions <a href="#conditions" id="conditions"></a>

Conditions narrow down which objects a trigger acts on. Each flow has an **If** card where you can **Condition by field** (any default or custom field on the object, combined with AND, or OR using **+ Add filter group**) or **Condition by AI prompt**. Flows are checked top to bottom (**If**, then **Else if**), and only the first flow that matches runs. Add a **Time delay** step to wait, in wall-clock time or support hours, before continuing.

See [Conditions](/pylon-docs/platform/triggers/conditions) for how flows and time delays are evaluated, and what each condition field means, including **Issue Direction** and **Member of Team**.

### Actions <a href="#actions" id="actions"></a>

Pick one or more actions to run, in order, when the conditions are met. The action list only shows actions that work with your kickoff's object. Type `{` in message fields to insert template variables such as the issue title or account name. See [Template variables](/pylon-docs/platform/triggers/template-variables) for every variable, its syntax, and how values are formatted.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FhowUB0VBDpHIOoj7EUZ9%2FCleanShot%202025-06-03%20at%2021.18.30%402x.png?alt=media&amp;token=add59af1-f66a-4bed-8108-1ffe11e23124" alt=""><figcaption><p>An action sequence of assigning an issue to the support team and DMing the assignee a message.</p></figcaption></figure>

#### Update issues

| Action                         | What it does                                                                             | Notes                                                                                             |
| ------------------------------ | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| Set issue status               | Moves the issue to a status.                                                             |                                                                                                   |
| Set issue assignee             | Assigns the issue to a user.                                                             | See [unavailable users](/pylon-docs/platform/triggers/conditions#assigning-to-unavailable-users). |
| Set issue team                 | Assigns the issue to a team.                                                             |                                                                                                   |
| Set issue requester            | Changes the issue's requester.                                                           |                                                                                                   |
| Set issue tags                 | Adds or removes issue tags.                                                              |                                                                                                   |
| Set issue SLA                  | Applies an SLA policy.                                                                   |                                                                                                   |
| Set customer portal visibility | Shows or hides the issue in the [customer portal](/pylon-docs/customer-portal/overview). |                                                                                                   |
| Add issue follower             | Adds a user, the account owner, or a user from a custom field as a follower.             |                                                                                                   |
| Remove issue follower          | Removes a follower the same way.                                                         |                                                                                                   |
| Delete issue                   | Deletes the issue.                                                                       |                                                                                                   |
| Mark issue as spam             | Marks the issue as spam.                                                                 | Only when the trigger filters for **Issue Source is Email**.                                      |
| Set team SLA                   | Applies a team SLA.                                                                      | Requires team SLAs. Added through SLA templates.                                                  |

#### Update other objects

| Action                     | What it does                                                                                                        | Notes                                                |
| -------------------------- | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| Set custom field value     | Sets a field on the trigger's object.                                                                               | Most objects.                                        |
| Set account owner          | Changes the account owner.                                                                                          | Account, task, and project triggers.                 |
| Set account tags           | Adds or removes account tags.                                                                                       | Account, task, and project triggers.                 |
| Set customer portal role   | Sets a contact's portal role.                                                                                       | Contact triggers.                                    |
| Bulk update contacts       | Sets the portal role for every contact on the account.                                                              | Account, task, and project triggers.                 |
| Set task status            | Moves the task to a status.                                                                                         | Task triggers.                                       |
| Set task assignee          | Assigns the task.                                                                                                   | Task triggers.                                       |
| Set feature request status | Moves the feature request to a status.                                                                              | Feature request triggers.                            |
| Set article tags           | Adds or removes article tags.                                                                                       | Article published trigger.                           |
| Create new task            | Creates a task.                                                                                                     | Most objects.                                        |
| Create new project         | Creates a project from a [project template](/pylon-docs/account-intelligence/tasks-and-projects/project-templates). | Issue, account, task, project, and meeting triggers. |

#### Reply to customers

| Action                                | What it does                                                                                                                                                                                    | Notes                                                                                  |
| ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| Send issue message                    | Replies in the customer thread or adds an internal note, as the assignee, a specific user, or the bot. Enable **Suppress link previews** to turn off link and media previews in Slack messages. | Issue triggers.                                                                        |
| Send message to account Slack channel | Posts a message in the account's shared channel.                                                                                                                                                | Account, task, project, and meeting triggers.                                          |
| Send message to account contacts      | Emails the account's contacts.                                                                                                                                                                  | Account, task, project, and meeting triggers.                                          |
| Send survey                           | Sends a [CSAT survey](/pylon-docs/support-workflows/csat) on the issue.                                                                                                                         | Issue triggers.                                                                        |
| Broadcast survey                      | Sends a [survey](/pylon-docs/platform/surveys) to an account's contacts.                                                                                                                        | Account, task, and project triggers.                                                   |
| Send form                             | Sends a [ticket form](/pylon-docs/support-workflows/ticket-forms) in the conversation.                                                                                                          | Only when the trigger filters for a Slack or Microsoft Teams issue source.             |
| Forward issue to email                | Forwards the issue to an email address.                                                                                                                                                         | Only when the trigger filters for **Issue Source is Email** or **Form**.               |
| Add Slack reaction                    | Adds an emoji reaction to the customer's message.                                                                                                                                               | Requires Slack. Only when the trigger filters for a Slack or Chat Widget issue source. |

#### Notify your team

| Action                  | What it does                                                                                                                                            | Notes                                              |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------- |
| Send Slack notification | Posts to a Slack channel or DMs the assignee or account owner.                                                                                          | Requires Slack. Available on nearly every kickoff. |
| Send email notification | Emails users or teams.                                                                                                                                  | Available on nearly every kickoff.                 |
| Create internal thread  | Opens an [internal thread](/pylon-docs/support-workflows/issues/internal-threads) for the issue in a Slack channel.                                     | Issue triggers.                                    |
| Invite                  | Invites users or a team to the account's Slack channel.                                                                                                 | Account, task, and project triggers.               |
| Alert on issue          | Pages through [PagerDuty](/pylon-docs/integrations/alerting/pagerduty), [Opsgenie](/pylon-docs/integrations/alerting/opsgenie), incident.io, or Rootly. | Issue triggers. Requires the alerting integration. |

#### Integrations

| Action       | What it does                                                                                                                                                                                     | Notes                              |
| ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------- |
| Send webhook | Sends a request to an [outbound webhook](/pylon-docs/developer/webhooks) with a JSON payload built from [template variables](/pylon-docs/platform/triggers/template-variables#webhook-payloads). | Available on nearly every kickoff. |

#### Phone

Available on **Phone call comes in** triggers. Requires [Phone](/pylon-docs/support-workflows/phone-support).

| Action             | What it does                                           |
| ------------------ | ------------------------------------------------------ |
| Start IVR          | Plays a menu and branches on the caller's choice.      |
| Route call         | Rings a team or users, via round robin or all at once. |
| Play audio message | Plays text-to-speech or an audio file.                 |
| Send to voicemail  | Sends the caller to voicemail.                         |
| End call           | Hangs up.                                              |

#### Control flow

| Action         | What it does                                                                                                        |
| -------------- | ------------------------------------------------------------------------------------------------------------------- |
| Take no action | Does nothing. Use it as the only action in a guard flow to stop later flows from running without changing anything. |

***

### Organization

Triggers are executed in order from top to bottom for a given kickoff event, and later triggers won't re-trigger earlier ones. Use **Create > Create Group** to separate triggers into groups for easier management, and drag triggers to reorder them.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FwbmZKUIHTLnN2bDiIpYJ%2FCleanShot%202024-11-09%20at%2016.46.02.png?alt=media&amp;token=38c78591-3393-415a-80a8-b76e67a3260f" alt=""><figcaption></figcaption></figure>

### Recipes

Select from many pre-built templates of common automations.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FU5lXuMtbVOrGFOkru8EX%2FTriggers.png?alt=media&amp;token=1c1b4a6b-4a65-4087-81df-c6344caea93d" alt=""><figcaption></figcaption></figure>


# Conditions

How trigger If, Else if, and time delay conditions are evaluated, and what each condition field means.

Conditions decide whether a trigger acts on the object that kicked it off. Add them in the **If** card of a flow:

* **Condition by field** — filter on a field of the issue, account, contact, or other object.
* **Condition by AI prompt** — describe the condition in plain language and let AI decide. See [AI conditions](/pylon-docs/platform/triggers/conditions#ai-conditions).

All conditions in a card must match (AND). To match any of several conditions (OR), click **+ Add filter group**.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FFIP83E041KGeML0F5nWc%2FCleanShot%202025-06-03%20at%2021.19.45%402x.png?alt=media&amp;token=94e4a790-6b4c-4929-9b48-705a0e398191" alt=""><figcaption><p>Condition for support issues from customers with spend below 5k</p></figcaption></figure>

## How flows are evaluated

A trigger can have several flows. The first flow's conditions card is labeled **If**, and each flow after it is labeled **Else if**.

* Pylon checks flows from top to bottom and runs **only the first flow whose conditions match**. Later flows are skipped, even if they would also match.
* A flow with no **If** conditions always matches, so use one as the last flow to act as an "else". Click **Add flow** to add another flow; it's disabled while the last flow has no **If** conditions, since nothing after a catch-all flow could ever run.
* Disabled flows are skipped.
* You can also add an **If** step partway through a flow (**Add Step > If**). If it doesn't match, the flow stops there. Actions before it have already run, and Pylon doesn't fall through to other flows.
* To stop a trigger without changing anything for some objects, put a flow above the others with the **Take no action** action.

Conditions are checked against the object as it is when the trigger runs. On **Issue has a new message** kickoffs, the last-message fields (**Last Message From**, **Last Message Body**, **Last Message Source**) use the message that fired the trigger. On **New issue created**, they use the issue's first message.

## Issue conditions

On issue triggers, the filter menu groups fields by what they describe:

* **Issue filters** — the issue itself.
* **Account filters** — the issue's account.
* **Contact filters** — the issue's requester.
* **User filters** — the issue's assignee.

Custom fields for issues, accounts, and contacts (the requester) are also available. Some fields only appear once you've set up the feature they depend on, such as teams, tags, ticket forms, or the customer portal.

### Messages and direction

| Field                   | What it checks                                                                                                                                                                                              |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Issue Direction**     | **Inbound** if a customer started the issue, **Outbound** if your team did. See below.                                                                                                                      |
| **First message from**  | Who wrote the issue's first message: **Customer**, **Your Team**, or a specific team (the author belongs to it). Internal notes don't count. For Slack issues, this is the message that started the thread. |
| **Last Message From**   | Who wrote the latest message, with the same options.                                                                                                                                                        |
| **Last Message Body**   | The text of the latest message. Not case sensitive.                                                                                                                                                         |
| **Last Message Source** | The channel the latest message came through, such as Slack or Email.                                                                                                                                        |
| **Issue Body**          | The content of the issue's original message.                                                                                                                                                                |
| **Email Subject**       | The subject of an email issue.                                                                                                                                                                              |

**Issue Direction** is set when the issue is created:

| Channel                                       | Inbound when                                                                                                                                                                                                                                                                                              |
| --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Slack                                         | A customer wrote the message that started the thread. If a teammate started it, the issue is outbound, even if a customer replies or adds the ticket emoji. Pylon prompts such as the floating bar and question prompt count as inbound; [broadcasts](/pylon-docs/broadcasts/overview) count as outbound. |
| Microsoft Teams, Discord, and other chat apps | A customer created the issue: they wrote the message, or they added the ticket emoji. If a teammate tickets a customer's message, the issue is outbound.                                                                                                                                                  |
| Email                                         | Inbound, except a thread a teammate started from their synced [personal inbox](/pylon-docs/account-intelligence/accounts/personal-email), which is outbound.                                                                                                                                              |
| Chat widget, forms, imports                   | Always inbound.                                                                                                                                                                                                                                                                                           |
| Phone                                         | Inbound calls are inbound; outbound calls are outbound.                                                                                                                                                                                                                                                   |
| API                                           | Inbound when the issue is created on behalf of a contact; outbound otherwise.                                                                                                                                                                                                                             |
| Created in Pylon                              | Always outbound.                                                                                                                                                                                                                                                                                          |

{% hint style="info" %}
There's no condition for a specific person who wrote a message or started a Slack thread. Use **First message from** or **Issue Direction** to tell customers from your team, or a **Contact filters** field such as **Contact Email** to match the requester.
{% endhint %}

### Assignee

| Field                       | What it checks                                                                                                                                                                                                                                                                          |
| --------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Assignee**                | Who the issue is assigned to, or **No Assignee**.                                                                                                                                                                                                                                       |
| **Member of Team**          | Whether the issue's **assignee** belongs to a team. Membership in a subteam counts as membership in its parent team. This differs from **Team**, which checks the team the issue is assigned to. An unassigned issue never matches **is any of**, and always matches **is not any of**. |
| **Assignee Status**         | The assignee's [user status](/pylon-docs/support-workflows/assignment-rules/user-status). A user in a custom status matches that custom status, not the built-in status it's based on, so select custom statuses explicitly.                                                            |
| **Assignee Is Deactivated** | Whether the assignee's account has been deactivated.                                                                                                                                                                                                                                    |
| **Follower**                | Teammates following the issue.                                                                                                                                                                                                                                                          |

### Channel and source

| Field                                                      | What it checks                                                                                                                                                       |
| ---------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Issue Source**                                           | The channel the issue was created in, such as Slack, Email, Chat Widget, or Form.                                                                                    |
| **Creation Method**                                        | How the issue was created: Ticket Emoji, Bot Mention, Floating Bar, All Messages Are Issues, Question Prompt, Feed Message, Community, API, Dashboard, or Import.    |
| **Channel**                                                | The Slack or Discord channel the issue was created in.                                                                                                               |
| **Created in Primary Channel**                             | Whether the issue was created in its account's primary external channel.                                                                                             |
| **Workspace Email**                                        | Which of your connected email addresses received the issue.                                                                                                          |
| **To Email**                                               | The To recipients of the issue's original email.                                                                                                                     |
| **From Email** / **CC Email**                              | The sender and CC recipients of the issue's original email.                                                                                                          |
| **Latest Email CCs**                                       | The CC recipients of the most recent email on the issue.                                                                                                             |
| **Chat Widget App**, **Phone Number**, **WhatsApp Number** | Which chat widget, support phone number, or WhatsApp number the issue came through. Shown when you have more than one chat widget, or any phone or WhatsApp numbers. |
| **Form**                                                   | The [ticket form](/pylon-docs/support-workflows/ticket-forms) the issue was created from or that was submitted on it.                                                |

### Time

| Field             | What it checks                                                                                                                                                                                        |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Support Hours** | Whether the trigger is running **In Support Hours**, **Outside Support Hours**, or **On Holiday**, based on the [support hours](/pylon-docs/support-workflows/support-hours) that apply to the issue. |
| **Current Time**  | Whether the trigger is running inside or outside a support hours schedule you pick. Not available on **Recurring schedule** triggers.                                                                 |
| **Created At**    | When the issue was created.                                                                                                                                                                           |

### Other issue fields

These work the way their names suggest:

* **Issue Status**, **Issue Type** (Ticket or Conversation), **Team**, **Issue Tags**, **Issue Topic**, **Snoozed**
* **Created from Split**, **Is Issue Group**, **Customer Portal Visibility**, **Language**, **Message Redaction Used**
* **Parent Issue Group** — whether the issue is a child in an [issue group](/pylon-docs/support-workflows/issues/issue-groups). Issue groups themselves have no parent group.
* **Support Agent Has Responded** — one of your [support agents](/pylon-docs/agents/support-agent) has replied on the issue. Not available on **Recurring schedule** triggers.
* **Product Issue Source**, **Product Ticket Completion**, and linked **Jira Issue**, **Linear Issue**, **GitHub Issue**, or **Asana Task**
* **CSAT Score** and **CSAT Feedback** — only on the **CSAT survey completed** kickoff.
* Account fields such as **Account**, **Account Owner**, **Account Tags**, **Pylon Account Type**, **Parent Account**, **Issue Count (90d)**, **Last Customer Activity**, and **Last Vendor Activity**, plus channel fields such as **Primary External Channel** and **External Channel Type**.

## Account and contact conditions

* **Account triggers** can only filter on account fields: the account fields listed above, account custom fields, and **Current Time**.
* **Contact triggers** can filter on the contact (**Contact Email**, **Contact Name**, **Account**, and contact custom fields) and on the contact's account. **NPS Score** is available on the **NPS survey completed** kickoff.

## Time delays

Add a time delay with **Add Step > Time delay**. It reads **Wait** *\[amount] \[unit]* **during** *all hours* or *support hours*.

* **All hours** counts wall-clock time, in seconds up to weeks. **Support hours** counts only time inside the support hours that apply to the object, in seconds, minutes, or hours.
* Add time delay conditions to continue only **as long as** they still hold when the wait ends:
  * **Issue Status Never Changes** — the issue's status hasn't changed since the wait started.
  * **No Message From** — no message from **Your Team**, **Your Customer**, or **Internal Notes** (pick one or more) since the wait started.
  * **Current Time** — the wait ends inside or outside a support hours schedule.
* When the wait ends, Pylon checks the time delay's conditions against the object as it is then. If they don't hold, the run stops and is logged as skipped.
* If the same trigger fires again for an object that's already waiting at that step, Pylon keeps the existing wait instead of starting a second one.

You can see and clear what's waiting in the [time delay queue](/pylon-docs/platform/triggers/logs-and-history#time-delay-queue).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FbXNHUJzIbQ0rqSpS6nOZ%2FCleanShot%202025-06-03%20at%2021.12.46%402x.png?alt=media&amp;token=262ffba1-a30c-4b97-821c-7a9ded142da1" alt=""><figcaption><p>A trigger to autoclose issues after 3 days of customer inactivity</p></figcaption></figure>

## AI conditions

Click **Condition by AI prompt** on an **If** card, or **Filter by issue content** in the filter bar, and describe the condition (for example, "the customer is asking for a refund"). Type `{` to insert template variables such as the issue title or a custom field.

* AI conditions are available on issue triggers, including **Recurring schedule** triggers that run on issues.
* The AI reads the issue's conversation and the message that fired the trigger. If your prompt refers to the "last", "latest", or "new" message, only that message is used. Account details and other fields are only included if you insert them as variables.
* An AI condition is combined with the card's other conditions like any other filter.
* If the AI can't evaluate the condition, for example because of an error, the condition doesn't match.

Without AI Assistant features, your workspace can use two AI conditions in total across all triggers, including disabled ones. AI Assistant features include unlimited AI conditions and are available on select plans.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FZN2h73bNuIuVKSy7Kdeu%2FCleanShot%202025-06-03%20at%2021.14.36%402x.png?alt=media&amp;token=6fafb5d2-0d01-4b94-bdc1-fe014a94ae6b" alt=""><figcaption></figcaption></figure>

## Assigning to unavailable users

The **Set issue assignee** action can assign a specific user or a dynamic one: **Account owner**, a user field on the issue, account, or requester, or (on some kickoffs) the **Actor**, **Message author**, or **Reactor**. Pylon never falls back to another user:

* **Empty field or no account owner** — the assignee doesn't change.
* **Deactivated user** — the assignment is skipped and noted in the issue's activity.
* **User's status isn't allowed** — the assignment is skipped and noted in the issue's activity.

Under **Settings**, the action's **Assign only if the user's status is** picker sets which [user statuses](/pylon-docs/support-workflows/assignment-rules/user-status) can receive the assignment. **Set task assignee** has the same picker; when it blocks an assignment, the task's assignee doesn't change.

* A new action starts with every status in the **Available** section selected. If you keep exactly that selection, available statuses your workspace adds later are allowed too.
* Clear every status to show **Any status**. Pylon then assigns the user whatever their status is.
* Custom statuses are listed individually. A user in a custom status is assigned only if that custom status is selected. Selecting the built-in status it's based on isn't enough.

To have Pylon pick an available teammate instead, use **Set issue team** and let the team's [assignment rules](/pylon-docs/support-workflows/assignment-rules) choose the assignee.


# Logs & History

Advanced tooling helps you set up, debug, and iterate on your automations.

## Logs

Open a trigger and click **View Logs** to see every run of that trigger and the object it ran on. Click the object (for example, the issue number) to open it and see in its Activity Log where the trigger fired. Use the fullscreen button to expand the logs panel.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FJ1F20weLMR8n1VvWhtce%2FCleanShot%202025-06-03%20at%2021.28.09%402x.png?alt=media&amp;token=75eda448-4883-4b21-9c46-c3422e2d02f1" alt=""><figcaption></figcaption></figure>

Each row is one run:

| Column                        | Shows                                                                                   |
| ----------------------------- | --------------------------------------------------------------------------------------- |
| Run started                   | When the run began. Click the arrow to expand the run's step-by-step log.               |
| Issue, Account, Contact, etc. | The object the trigger ran on.                                                          |
| Status                        | The run's outcome (see below).                                                          |
| Trigger flow                  | Which flow's conditions matched.                                                        |
| Run #                         | The run's sequence number.                                                              |
| Version                       | The [trigger version](/pylon-docs/platform/triggers/logs-and-history#history) that ran. |
| Attributes                    | Extra details recorded by the actions.                                                  |
| Condition Result              | For aborted runs, which conditions weren't met. Appears when any run was aborted.       |

### Run statuses

| Status      | Meaning                                                                      |
| ----------- | ---------------------------------------------------------------------------- |
| Completed   | The run finished.                                                            |
| In progress | The run is still executing.                                                  |
| Scheduled   | The run is waiting on a time delay.                                          |
| Suspended   | The run is paused mid-flow, for example while a phone call waits on routing. |
| Aborted     | The object didn't meet any flow's conditions, so no actions ran.             |
| Cancelled   | A scheduled run was removed from the time delay queue.                       |
| Failed      | The run hit an error.                                                        |

### Run details

For inbound webhook runs, the **Payload** column shows the received request body. Pylon stores up to 32 KiB of the body in the run log. Larger bodies show **Truncated**, and the stored prefix may no longer be valid JSON. This affects the log display, not the payload used to run the trigger.

Expand a run to see each step with its timestamp. Steps that failed are marked **Error:**. Some steps add links:

* **View assignee** — for team assignment steps, opens the team's assignment log for that issue.

### Filtering

Filter runs by date and status. Issue triggers can also filter by account and assignee; account triggers by account.

## History

Every time you save a trigger, Pylon records a new version. Open the trigger's menu and select **Version history** to see each version, when it was published, and who modified it. Click **Show version** to open a read-only snapshot of the trigger as it was at that version.

Use trigger history to:

1. Understand why changes in a workflow were made and who made them
2. Debug unexpected behavior by understanding the state of a trigger at a point in time — match a run's **Version** in the logs to its snapshot
3. Compare an earlier setup against the current one when you need to undo a change

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FLkxx9gcurZxX4vAr6Mx7%2FCleanShot%202025-06-03%20at%2021.29.15%402x.png?alt=media&amp;token=bd5b7773-5b25-462c-97df-05b31dc95c69" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}
There's no one-click restore. To go back to an earlier version, open its snapshot and reapply those settings to the trigger. While editing, use **Undo** and **Redo** in the trigger menu to step through unsaved changes.
{% endhint %}

## Time Delay Queue

Triggers can have time delays as part of their control flow. When objects are waiting on a delay, the time delay step shows how many are in the queue. Click it to open the queue and see each waiting issue, account, contact, task, or project.

* **Remove from queue** cancels the delayed run for one object.
* **Clear Queue** cancels every scheduled run for that step. This can't be undone.

Filters on a time delay are checked at the end of the delay, so an object in the queue may still be aborted.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FFtapBGrgVzqkBYPdcErT%2FCleanShot%202025-06-03%20at%2021.22.50%402x.png?alt=media&amp;token=48c4da6b-ff40-40f6-b555-83acec2388d7" alt=""><figcaption></figcaption></figure>


# Template variables

Every variable you can insert into trigger actions, webhook payloads, and macros, with exact syntax and formatting rules.

Template variables fill in details such as the issue title, requester email, or latest message when a trigger action runs or a macro is applied.

## Syntax

Wrap the variable name in double curly braces:

```
Hi {{ issue.requester.first_name }}, we're looking into "{{ issue.title }}".
```

* Type `{` in any field that supports variables to open the variable menu. It lists only the variables available for the trigger's object and inserts the correct syntax for you.
* Names are lowercase and dot-separated, for example `issue.last_message.author.name`.
* In triggers, spaces inside the braces are optional: `{{issue.id}}` and `{{ issue.id }}` both work. Extra braces such as `{{{ issue.id }}}` are treated as two. The **Send webhook** action warns you when it finds them.
* In macros, insert variables from the `{` menu. If you type one by hand, use exactly one space on each side: `{{ issue.id }}`.
* There are no filters, conditionals, loops, or default values. To send different content in different cases, use separate trigger flows with their own conditions.

## Where you can use them

**Triggers:** the message, subject, and body fields of these actions:

* Send issue message
* Send Slack notification
* Send email notification (subject and body)
* Forward issue to email (subject and body)
* Send message to account Slack channel
* Send message to account contacts (subject and body)
* Send webhook (the **JSON payload**, and the webhook's **Target URL**)
* Create internal thread
* Send form
* Create new task (title and body)

**Macros:** the macro's reply, internal note, or email text. See [Macros](/pylon-docs/platform/triggers/template-variables#macros) for the variables macros support. Actions inside a macro, such as **Send Slack notification**, use the issue trigger variables.

### Which variables a trigger can use

The variables available depend on the object the trigger runs on. If a trigger has more than one kickoff, you can only use variables that every kickoff supports. Saving a trigger with a variable its kickoff doesn't support fails with an error such as `Variable "{{ csat.score }}" is not available for this trigger type.`

* **Issues** (issue, SLA, and **Phone call comes in** kickoffs): [Issue](/pylon-docs/platform/triggers/template-variables#issue), issue and issue-account [custom fields](/pylon-docs/platform/triggers/template-variables#custom-fields), [related custom objects](/pylon-docs/platform/triggers/template-variables#related-custom-objects), and `{{ holiday.name }}`. Plus [CSAT](/pylon-docs/platform/triggers/template-variables#csat-and-nps) on **CSAT survey completed**, `issue.product_ticket.*` on **Issue product ticket status changed**, and `{{ team.name }}` on team SLA kickoffs.
* **Accounts:** [Account](/pylon-docs/platform/triggers/template-variables#account) and account custom fields.
* **Contacts:** [Contact](/pylon-docs/platform/triggers/template-variables#contact), contact custom fields, and the contact's primary [account](/pylon-docs/platform/triggers/template-variables#account) and its custom fields. Plus [NPS](/pylon-docs/platform/triggers/template-variables#csat-and-nps) on **NPS survey completed**.
* **Tasks:** [Task](/pylon-docs/platform/triggers/template-variables#tasks-and-projects), task custom fields, and the task's account custom fields.
* **Projects and milestones:** [Project](/pylon-docs/platform/triggers/template-variables#tasks-and-projects), project custom fields, and the project's account custom fields.
* **Meetings:** [Meeting](/pylon-docs/platform/triggers/template-variables#meetings), meeting custom fields, and the meeting's [account](/pylon-docs/platform/triggers/template-variables#account) and its custom fields.
* **Opportunities:** the opportunity's [account](/pylon-docs/platform/triggers/template-variables#account), opportunity custom fields, and account custom fields.
* **Feature requests:** [Feature request](/pylon-docs/platform/triggers/template-variables#feature-requests) and feature request custom fields.
* **User status changed**, **New out of office event created**: [User](/pylon-docs/platform/triggers/template-variables#team-and-calendar), plus `calendar_event.*` on the out of office kickoff.
* **Out of office gap detected**: `{{ team.name }}`, `{{ calendar_event.start_time }}`, and `{{ calendar_event.end_time }}`.
* **Article published**: [Article](/pylon-docs/platform/triggers/template-variables#other-kickoffs).
* **Email blocked**, **Email suppressed**, **Anomaly detected**: the kickoff's own variables. See [Other kickoffs](/pylon-docs/platform/triggers/template-variables#other-kickoffs).

## How values are formatted

Pylon formats each value for the field it's inserted into:

| Field                                                             | How values are inserted                                                                                                                                                                                          |
| ----------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Message bodies (issue messages, notifications, macros, and so on) | Text is HTML-escaped. `*_html` variables are inserted as HTML. Link variables (`issue.pylon_link`, `issue.customer_portal_link`, `issue.body.attachment_links`) become clickable links.                          |
| Email subjects                                                    | Plain text, not escaped. Link variables become their text, such as `#123`.                                                                                                                                       |
| Webhook **JSON payload**                                          | Escaped for use inside a JSON string, without surrounding quotes. `*_html` and link variables arrive as HTML strings. See [Webhook payloads](/pylon-docs/platform/triggers/template-variables#webhook-payloads). |
| Webhook **Target URL**                                            | Not URL-encoded. Use URL-safe values such as IDs.                                                                                                                                                                |

Every value is text:

* **Missing values** are empty. For example, `{{ issue.assignee.name }}` is blank on an unassigned issue, and `{{ holiday.name }}` is blank on a normal working day.
* **Unrecognized names**, such as a typo, are left in the message as literal text.
* **Timestamps** use RFC 3339, for example `2026-10-10T14:03:00Z`.
* **Lists** are comma-separated with no spaces, for example `billing,urgent` for `{{ issue.tags }}`.
* **Yes/no values** are `true` or `false`.

## Webhook payloads

The **Send webhook** action's **JSON payload** must be valid JSON before variables are filled in. Put every variable inside a JSON string. Pylon escapes quotes, backslashes, and line breaks in the value but doesn't add the quotes for you.

```json
{
  "issue_id": "{{ issue.id }}",
  "issue_number": "{{ issue.number }}",
  "title": "{{ issue.title }}",
  "status": "{{ issue.status }}",
  "tags": "{{ issue.tags }}",
  "account_id": "{{ issue.account.id }}",
  "requester_email": "{{ issue.requester.email }}",
  "message": {
    "id": "{{ issue.last_message.id }}",
    "body_html": "{{ issue.last_message.body_html }}",
    "is_private": "{{ issue.last_message.is_private }}",
    "sent_at": "{{ issue.last_message.sent_at }}",
    "author_name": "{{ issue.last_message.author.name }}",
    "author_user_id": "{{ issue.last_message.author.user_id }}",
    "author_contact_id": "{{ issue.last_message.author.contact_id }}",
    "author_email": "{{ issue.last_message.author.email }}"
  }
}
```

* Numbers and `true`/`false` arrive as strings, such as `"42"` and `"false"`. Convert them on your side.
* List values arrive as one string. Split `"billing,urgent"` on commas to get the tags.
* `*_external_ids_json` variables contain JSON text, so they arrive as a string you parse a second time, for example `"[{\"label\":\"Stripe\",\"external_id\":\"cus_123\"}]"`.
* `issue.last_message.*` can be an internal note. Pylon shows a warning when your payload uses it. To send only customer-visible messages, filter the **Issue has a new message** kickoff by message type, or use `issue.last_public_message.*`.

See [Webhooks](/pylon-docs/developer/webhooks) to set up the endpoint, verify signatures, and handle retries.

## Variable reference

Variables marked † aren't in the `{` menu. Type them in.

### Issue

| Variable                                   | Value                                                                                                |
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------- |
| `{{ issue.id }}`                           | The issue's unique ID.                                                                               |
| `{{ issue.number }}`                       | The issue number, for example `123`.                                                                 |
| `{{ issue.title }}`                        | The issue's title or subject.                                                                        |
| `{{ issue.body }}`                         | The issue's original description (not its latest message) as Markdown.                               |
| `{{ issue.body_html }}`                    | The issue's original description as HTML.                                                            |
| `{{ issue.body.attachment_urls }}`         | URLs of files attached to the issue description. Links expire after 7 days.                          |
| `{{ issue.body.attachment_links }}`        | The same attachments as clickable file-name links.                                                   |
| `{{ issue.status }}`                       | The status name, as shown in Pylon.                                                                  |
| `{{ issue.source }}`                       | Where the issue came from, such as `Slack`, `Email`, or `Chat Widget`.                               |
| `{{ issue.created_at }}`                   | When the issue was created.                                                                          |
| `{{ issue.tags }}`                         | The issue's tags.                                                                                    |
| `{{ issue.team.name }}`                    | The issue's team.                                                                                    |
| `{{ issue.link }}`                         | The URL of the issue in Pylon.                                                                       |
| `{{ issue.pylon_link }}`                   | A clickable issue number, such as #123, that opens the issue in Pylon. Recipients need Pylon access. |
| `{{ issue.customer_portal_url }}`          | The URL of the issue in the [customer portal](/pylon-docs/customer-portal/overview).                 |
| `{{ issue.customer_portal_link }}`         | A clickable issue number that opens the issue in the customer portal.                                |
| `{{ issue.product_issue_links }}`          | Links to linked Linear, Jira, GitHub, and other product tickets.                                     |
| `{{ issue.external_support_ticket_id }}`   | The ticket ID in a connected support tool, such as a Zendesk ticket number.                          |
| `{{ issue.external_support_ticket_type }}` | The connected support tool, such as `zendesk` or `intercom`.                                         |
| `{{ issue.slack.channel_id }}`             | The Slack channel ID the issue was created in.                                                       |
| `{{ issue.slack.permalink }}`              | A link to the issue's Slack thread.                                                                  |

#### Product ticket

Available on the **Issue product ticket status changed** kickoff. Each refers to the ticket whose status changed.

| Variable                            | Value                              |
| ----------------------------------- | ---------------------------------- |
| `{{ issue.product_ticket.title }}`  | The product ticket's title.        |
| `{{ issue.product_ticket.key }}`    | The ticket key, such as `ENG-123`. |
| `{{ issue.product_ticket.link }}`   | The ticket's URL.                  |
| `{{ issue.product_ticket.status }}` | The ticket's new status.           |

#### People and account

| Variable                                | Value                                                                                   |
| --------------------------------------- | --------------------------------------------------------------------------------------- |
| `{{ issue.requester.id }}`              | The requester's contact ID.                                                             |
| `{{ issue.requester.name }}`            | The requester's full name.                                                              |
| `{{ issue.requester.first_name }}`      | The requester's first name.                                                             |
| `{{ issue.requester.last_name }}`       | The requester's last name.                                                              |
| `{{ issue.requester.email }}`           | The requester's email address.                                                          |
| `{{ issue.requester.phone_number }}`    | The requester's phone number.                                                           |
| `{{ issue.assignee.id }}`               | The assignee's user ID.                                                                 |
| `{{ issue.assignee.name }}`             | The assignee's full name.                                                               |
| `{{ issue.assignee.first_name }}`       | The assignee's first name.                                                              |
| `{{ issue.assignee.last_name }}`        | The assignee's last name.                                                               |
| `{{ issue.assignee.email }}`            | The assignee's email address.                                                           |
| `{{ issue.account.id }}`                | The issue's account ID.                                                                 |
| `{{ issue.account.name }}`              | The issue's account name.                                                               |
| `{{ issue.account.domains }}`           | The account's domains, primary domain first.                                            |
| `{{ issue.account.owner.name }}`        | The account owner's name.                                                               |
| `{{ issue.account.owner.email }}`       | The account owner's email address.                                                      |
| `{{ issue.account.external_ids_json }}` | The account's external IDs as a JSON array of `label` and `external_id` pairs, or `[]`. |

#### Latest message

`issue.last_message.*` is the most recent message on the issue, including internal notes. On the **Issue has a new message** kickoff it's the message that started the trigger. `issue.last_public_message.*` skips internal notes and hidden messages.

| Variable                                            | Value                                                         |
| --------------------------------------------------- | ------------------------------------------------------------- |
| `{{ issue.last_message.id }}`                       | The message ID.                                               |
| `{{ issue.last_message.body }}`                     | The message as Markdown.                                      |
| `{{ issue.last_message.body_html }}`                | The message as HTML.                                          |
| `{{ issue.last_message.is_private }}`               | `true` if the message is an internal note, otherwise `false`. |
| `{{ issue.last_message.author.name }}`              | The author's name.                                            |
| `{{ issue.last_message.author.user_id }}`           | The author's user ID, if a teammate wrote it.                 |
| `{{ issue.last_message.author.contact_id }}`        | The author's contact ID, if a customer wrote it.              |
| `{{ issue.last_message.author.email }}`             | The author's email address, when Pylon has one.               |
| `{{ issue.last_message.sent_at }}`                  | When the message was sent.                                    |
| `{{ issue.last_message.source }}`                   | The message's channel, such as `slack` or `email`.            |
| `{{ issue.last_message.to }}`                       | Email addresses in the To field. Email messages only.         |
| `{{ issue.last_message.ccs }}`                      | Email addresses in the CC field. Email messages only.         |
| `{{ issue.last_message.attachment_urls }}`          | URLs of the message's attachments. Links expire after 7 days. |
| `{{ issue.last_public_message.id }}`                | The ID of the latest customer-visible message.                |
| `{{ issue.last_public_message.body }}`              | That message as Markdown.                                     |
| `{{ issue.last_public_message.body_html }}`         | That message as HTML.                                         |
| `{{ issue.last_public_message.author.name }}`       | Its author's name.                                            |
| `{{ issue.last_public_message.author.user_id }}`    | Its author's user ID, if a teammate wrote it.                 |
| `{{ issue.last_public_message.author.contact_id }}` | Its author's contact ID, if a customer wrote it.              |
| `{{ issue.last_public_message.author.email }}`      | Its author's email address, when Pylon has one.               |
| `{{ issue.last_public_message.sent_at }}`           | When it was sent.                                             |
| `{{ issue.last_public_message.source }}`            | Its channel, such as `slack` or `email`.                      |

#### SLAs

The breach variables are blank when the issue has no [SLA](/pylon-docs/support-workflows/slas-and-timers) of that type.

| Variable                                   | Value                                                                        |
| ------------------------------------------ | ---------------------------------------------------------------------------- |
| `{{ issue.resolution_time }}`              | When the issue was resolved. Blank until then.                               |
| `{{ issue.first_response_time }}` †        | When the first response was sent to the customer. Blank until then.          |
| `{{ issue.first_response_breached }}` †    | `true` if the first response SLA breached, otherwise `false`.                |
| `{{ issue.resolution_breached }}` †        | `true` if the resolution SLA breached, otherwise `false`.                    |
| `{{ issue.first_response_breach_time }}` † | When the first response SLA breaches. Blank once the SLA is met or canceled. |
| `{{ issue.next_reply_breach_time }}` †     | When the next response SLA breaches. Blank once the SLA is met or canceled.  |
| `{{ issue.resolution_breach_time }}` †     | When the resolution SLA breaches. Blank once the SLA is met or canceled.     |

#### Holiday and team

| Variable             | Value                                                                                                                                 |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| `{{ holiday.name }}` | The holiday in effect for the issue's [support hours](/pylon-docs/support-workflows/support-hours), or blank when it isn't a holiday. |
| `{{ team.name }}` †  | On team SLA kickoffs, the team whose SLA changed or breached.                                                                         |

### Account

On issue triggers, use the `issue.account.*` variables instead.

| Variable                          | Value                                                                                   |
| --------------------------------- | --------------------------------------------------------------------------------------- |
| `{{ account.id }}`                | The account ID.                                                                         |
| `{{ account.name }}`              | The account name.                                                                       |
| `{{ account.domains }}`           | The account's domains, primary domain first.                                            |
| `{{ account.owner }}`             | The account owner's name.                                                               |
| `{{ account.owner.email }}`       | The account owner's email address.                                                      |
| `{{ account.external_ids_json }}` | The account's external IDs as a JSON array of `label` and `external_id` pairs, or `[]`. |

### Contact

| Variable                            | Value                                                              |
| ----------------------------------- | ------------------------------------------------------------------ |
| `{{ contact.id }}`                  | The contact ID.                                                    |
| `{{ contact.name }}`                | The contact's full name.                                           |
| `{{ contact.email }}`               | The contact's email address.                                       |
| `{{ contact.customer_portal_url }}` | A customer portal sign-in link with the contact's email filled in. |

### CSAT and NPS

| Variable              | Value                           | Kickoff                   |
| --------------------- | ------------------------------- | ------------------------- |
| `{{ csat.score }}`    | The CSAT score.                 | **CSAT survey completed** |
| `{{ csat.feedback }}` | The written feedback.           | **CSAT survey completed** |
| `{{ nps.score }}`     | The NPS score, 0 to 10.         | **NPS survey completed**  |
| `{{ nps.feedback }}`  | The follow-up answer.           | **NPS survey completed**  |
| `{{ survey.id }}`     | The ID of this survey delivery. | Both                      |

### Custom fields

Insert any custom field by its slug. The `{` menu lists your fields by name and inserts the slug for you.

| Variable                                    | Trigger object                              |
| ------------------------------------------- | ------------------------------------------- |
| `{{ issue.custom_field.<slug> }}`           | Issues, macros                              |
| `{{ issue.account.custom_field.<slug> }}`   | Issues, macros                              |
| `{{ account.custom_field.<slug> }}`         | Accounts, contacts, meetings, opportunities |
| `{{ contact.custom_field.<slug> }}`         | Contacts                                    |
| `{{ task.custom_field.<slug> }}`            | Tasks                                       |
| `{{ task.account.custom_field.<slug> }}`    | Tasks                                       |
| `{{ project.custom_field.<slug> }}`         | Projects                                    |
| `{{ project.account.custom_field.<slug> }}` | Projects                                    |
| `{{ meeting.custom_field.<slug> }}`         | Meetings                                    |
| `{{ opportunity.custom_field.<slug> }}`     | Opportunities                               |
| `{{ feature_request.custom_field.<slug> }}` | Feature requests                            |

How custom field values come out:

* **Select and multi-select:** the option's stored value. Add `:label` to get the display label instead, for example `{{ issue.custom_field.priority_tier:label }}`. Multi-select values are comma-separated.
* **Date:** `YYYY-MM-DD`.
* **Number:** the number, rounded to the field's decimal places if set. Currency symbols and thousands separators aren't added.
* **User:** the user's name.
* **Empty field:** blank.

### Related custom objects

If a [custom object](/pylon-docs/platform/custom-objects) has a relationship field that links it to issues, issue triggers can read the linked records:

* `{{ issue.custom_object.<object_slug>.id }}`, `.name`, and `.created_at`
* `{{ issue.custom_object.<object_slug>.custom_field.<slug> }}`, with `:label` for select fields

When several records are linked, their values are comma-separated, without duplicates, up to 10 records. The `{` menu lists these under **Related custom object fields**.

### Tasks and projects

| Variable                                                      | Value                                                                   |
| ------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `{{ task.id }}`                                               | The task ID.                                                            |
| `{{ task.title }}`                                            | The task title.                                                         |
| `{{ task.status }}`                                           | The task status.                                                        |
| `{{ task.link }}`                                             | The URL of the task in Pylon.                                           |
| `{{ task.assignee }}`                                         | The assignee's name.                                                    |
| `{{ task.account.id }}`                                       | The task's account ID.                                                  |
| `{{ task.account.name }}`                                     | The task's account name.                                                |
| `{{ task.account.domains }}`                                  | The account's domains.                                                  |
| `{{ task.account.owner.name }}`                               | The account owner's name.                                               |
| `{{ task.account.crm_account_id }}`                           | The account's ID in your CRM.                                           |
| `{{ task.account.external_ids_json }}`                        | The account's external IDs as a JSON array.                             |
| `{{ task.product_ticket.title }}`, `.key`, `.link`, `.status` | The linked product ticket. **Task product ticket status changed** only. |
| `{{ project.id }}`                                            | The project ID.                                                         |
| `{{ project.name }}`                                          | The project name.                                                       |
| `{{ project.owner }}`                                         | The project owner's name.                                               |
| `{{ project.link }}`                                          | The URL of the project in Pylon.                                        |
| `{{ project.status }}`                                        | The project status.                                                     |
| `{{ project.progress }}`                                      | Percent complete, such as `75%`.                                        |
| `{{ project.start_date }}`                                    | The project start date.                                                 |
| `{{ project.end_date }}`                                      | The project end date.                                                   |
| `{{ project.account.id }}`                                    | The project's account ID.                                               |
| `{{ project.account.name }}`                                  | The project's account name.                                             |
| `{{ project.account.domains }}`                               | The account's domains.                                                  |
| `{{ project.account.owner.name }}`                            | The account owner's name.                                               |
| `{{ project.account.crm_account_id }}`                        | The account's ID in your CRM.                                           |
| `{{ project.account.external_ids_json }}`                     | The account's external IDs as a JSON array.                             |

### Feature requests

| Variable                                                                 | Value                                                                              |
| ------------------------------------------------------------------------ | ---------------------------------------------------------------------------------- |
| `{{ feature_request.id }}`                                               | The feature request ID.                                                            |
| `{{ feature_request.title }}`                                            | The title.                                                                         |
| `{{ feature_request.description }}`                                      | The description.                                                                   |
| `{{ feature_request.link }}`                                             | The URL of the feature request in Pylon.                                           |
| `{{ feature_request.created_at }}`                                       | When it was created.                                                               |
| `{{ feature_request.status_slug }}`                                      | The current status slug.                                                           |
| `{{ feature_request.status_label }}`                                     | The current status name.                                                           |
| `{{ feature_request.previous_status_slug }}`                             | The previous status slug. **Feature request status changed** only.                 |
| `{{ feature_request.previous_status_label }}`                            | The previous status name. **Feature request status changed** only.                 |
| `{{ feature_request.product_ticket.title }}`, `.key`, `.link`, `.status` | The linked product ticket. **Feature request product ticket status changed** only. |

### Meetings

| Variable                           | Value                                                   |
| ---------------------------------- | ------------------------------------------------------- |
| `{{ meeting.id }}`                 | The meeting ID.                                         |
| `{{ meeting.title }}`              | The meeting title.                                      |
| `{{ meeting.source }}`             | Where the meeting came from, such as its call recorder. |
| `{{ meeting.start_time }}`         | When the meeting starts.                                |
| `{{ meeting.end_time }}`           | When the meeting ends.                                  |
| `{{ meeting.duration_ms }}`        | The meeting length in milliseconds.                     |
| `{{ meeting.has_call_recording }}` | `true` if the meeting has a call recording.             |
| `{{ meeting.call_recording_id }}`  | The call recording ID, or blank.                        |

### Team and calendar

| Variable                          | Value                                                                      |
| --------------------------------- | -------------------------------------------------------------------------- |
| `{{ user.name }}`                 | The teammate's full name.                                                  |
| `{{ user.first_name }}`           | The teammate's first name.                                                 |
| `{{ user.last_name }}`            | The teammate's last name.                                                  |
| `{{ user.link }}`                 | The URL of the teammate in Pylon.                                          |
| `{{ user.status }}`               | The new status. **User status changed** only.                              |
| `{{ user.previous_status }}`      | The status before the change. **User status changed** only.                |
| `{{ team.name }}`                 | The team. **Out of office gap detected** only.                             |
| `{{ calendar_event.title }}`      | The out of office event's title. **New out of office event created** only. |
| `{{ calendar_event.start_time }}` | When the out of office event or gap starts.                                |
| `{{ calendar_event.end_time }}`   | When the out of office event or gap ends.                                  |

### Other kickoffs

* **Article published**: `{{ article.id }}`, `{{ article.title }}` (as published), `{{ article.link }}`, `{{ article.knowledge_base.id }}`, `{{ article.knowledge_base.title }}`, `{{ article.published_version_id }}`
* **Email blocked**: `{{ blocked_email.email }}`, `{{ blocked_email.blocked_at }}`
* **Email suppressed**: `{{ email_suppression.email }}`, `{{ email_suppression.reason }}`, `{{ email_suppression.created_at }}`
* **Anomaly detected**: `{{ anomaly.title }}`, `{{ anomaly.description }}`, `{{ anomaly.link }}`

## Macros

Macro text supports a smaller set of variables. They fill in when you open the macro on an issue, so you can review the result before sending.

* `{{ issue.id }}`, `{{ issue.number }}`, `{{ issue.title }}`, `{{ issue.status }}`: As in [Issue](/pylon-docs/platform/triggers/template-variables#issue).
* `{{ issue.body }}`, `{{ issue.body_html }}`: the issue's original description.
* `{{ issue.link }}`, `{{ issue.customer_portal_url }}`, `{{ issue.customer_portal_link }}`: links to the issue.
* `{{ issue.requester.name }}`, `.first_name`, `.last_name`, `.email`: the requester.
* `{{ issue.assignee.name }}`, `.first_name`, `.last_name`: the assignee.
* `{{ issue.team.name }}`: the issue's team.
* `{{ issue.account.id }}`, `{{ issue.account.name }}`, `{{ issue.account.owner.name }}`: the issue's account.
* `{{ actor.name }}`, `{{ actor.first_name }}`, `{{ actor.last_name }}`: you, the teammate applying the macro.
* `{{ issue.custom_field.<slug> }}`, `{{ issue.account.custom_field.<slug> }}`: [Custom fields](/pylon-docs/platform/triggers/template-variables#custom-fields).
* `{{ issue.source }}` †, `{{ issue.requester.phone_number }}` †, `{{ issue.account.external_ids_json }}` †, `{{ issue.external_support_ticket_id }}` †, `{{ issue.external_support_ticket_type }}` †: As in [Issue](/pylon-docs/platform/triggers/template-variables#issue).

Other issue variables, such as `issue.last_message.*` and `issue.tags`, aren't filled in by macro text.


# Macros

Set up macros to simplify sending templated responses and taking common actions on customer issues.

## Setup <a href="#setup" id="setup"></a>

Go to **Settings > Macros** and click **Create Macro**.

1. Set up a templated response using dynamic variables. Type `{` in the message to add a variable, such as the requester's first name or an issue custom field. See [Template variables](/pylon-docs/platform/triggers/template-variables#macros) for the full list. When a macro is used, this text will be pre-filled in the editor, and all you'll have to do is hit send! A macro can contain a reply, an internal note, or an email.
2. Set up actions that will be executed when the macro is used, such as adding a certain tag to an issue (for tracking and [Analytics](/pylon-docs/broadcasts/analytics)) or setting the state to closed.
3. Under **Which issues can use this macro?**, choose **All issues** or **Specific Issues** to set filters. For example, you can have different macros available for your team to use on Slack vs. Chat Widget questions.
4. Choose who can use and change the macro (see [Sharing](/pylon-docs/platform/macros#sharing)).

### Actions

A macro can run any of these actions, in the order you set:

* Set issue status
* Set issue assignee
* Set issue team
* Set custom field value
* Set issue tags
* Create internal thread (when [internal threads](/pylon-docs/support-workflows/issues/internal-threads) are available in your workspace)
* Send Slack notification
* Alert on issue
* Send survey

## Sharing

Use **Who can view?** to choose who can use the macro: **Anyone**, **Some members** (specific users and teams), or **Only me**. Use **Who can edit?** to choose who can change it. Editors can also change the macro's sharing settings and delete it.

## Organization

Macros can be placed into different groups for better organization. When executing macros from an issue, you'll be able to click into groups as well to find a specific macro.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FgfpDiEx2oqA72MwFof7R%2FCleanShot%202024-11-09%20at%2016.43.37.png?alt=media&amp;token=711dacc8-d75e-410b-8545-bbcfebc47a37" alt=""><figcaption></figcaption></figure>

To move several macros to another group at once, select them and click **Move**. To copy a macro, open it and choose **Duplicate** from the **More actions** menu.

## Version history

Each time a macro is saved, Pylon keeps a version. Open a macro and choose **Version History** from the **More actions** menu to see each version, when it was published, and who modified it. Click **Show version** to open a read-only snapshot, then click **Copy Content** to reuse its text.

## Usage <a href="#usage" id="usage"></a>

Once you set up some Macros, you can access them from inside your text editor on an issue by clicking the lightning bolt. You can also press `m` when you're not typing, or `Cmd-M` / `Ctrl-M` while you're typing in the editor.

Here you can search for macros by name and also see a preview of the macro before hitting send. This gives you the opportunity to make any tweaks that might be needed before it's sent.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F7h8AIxoreXdHnTnJge4u%2FCleanShot%202024-11-09%20at%2014.01.12.png?alt=media&amp;token=a65fe4ae-c3c2-47da-9bb6-4a9fd78882cb" alt=""><figcaption></figcaption></figure>


# Command Search

Use Pylon's powerful Command Search to search, navigate, and perform commands in Pylon.

{% hint style="info" %}
Hit `Cmd-K` on Mac and `Ctrl-K` on Windows anywhere in Pylon to open up Command Search.
{% endhint %}

## Search

Type a search term to search across all data in Pylon, including issues, accounts, contacts, knowledge base articles, and more. You can click into a specific tab to narrow down your results, or use the keyboard shortcuts listed at the bottom of the search window to preview different results before you select a specific page to view.

To jump straight to an issue, type its number, such as `1234` or `#1234`.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FPts43QgEkuMBdJRyCxC2%2FCleanShot%202024-09-29%20at%2017.14.37.png?alt=media&amp;token=2c848c88-e10b-457a-be68-79b1e1dac4a7" alt=""><figcaption></figcaption></figure>

## Search page

For deeper searches, click the **Search** icon at the top of the left navigation to open the full Search page. It has the same tabs as Command Search (**All**, **Issues**, **Pages**, **Accounts**, **Contacts**, and **Commands**), plus:

* **Filters**: narrow results using the fields for the selected tab. For example, the **Issues** tab offers the same filters as issue views.
* **Exact match**: only show results that contain your exact search term.
* **Sort**: on a specific tab, order results by **Relevance**, **Last updated**, or **Last created**.
* **Issue preview**: click an issue to open it in a side panel and work on it without leaving your results.

Press `Cmd-[` and `Cmd-]` (`Ctrl-[` and `Ctrl-]` on Windows) to switch between tabs.

## Commands

Run commands, like `Create issue` or `Create article` to quickly take an action without having to navigate to the corresponding view in the UI.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FOqu5UbWRyEvsH2cRIbGy%2FCleanShot%202025-03-27%20at%2000.56.03%402x.png?alt=media&amp;token=8af7e519-e65e-418b-8bc2-9bc7d5012cec" alt=""><figcaption></figcaption></figure>


# Roles & User Management

What Admins, Members, and Viewers can do, how to invite, deactivate, and reactivate users, and how to build custom roles.

Every Pylon user has one role, and the role controls what they can see and change. Manage users in **Settings > Workspace > Users**. Manage roles in **Settings > Workspace > Users > Manage User Data > Roles**.

## Roles

| Role                 | Who it's for                                                                                                                                                 |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Admin**            | People who run the workspace: settings, billing, users, roles, integrations, and API tokens.                                                                 |
| **Member**           | Day-to-day support work. Most of your team should be Members.                                                                                                |
| **Viewer**           | Read-only access for people who need to look things up and leave internal notes, but not work issues. Available on select plans — contact your account team. |
| **Integration User** | People who use Pylon only through an integration such as Slack or Linear. They can't sign in to Pylon.                                                       |
| Custom roles         | Roles you build yourself. Available on the Enterprise plan. See [Custom roles](#setup).                                                                      |

### What Admins, Members, and Viewers can do

| Capability                                                                                      | Admin | Member                       | Viewer    |
| ----------------------------------------------------------------------------------------------- | ----- | ---------------------------- | --------- |
| View issues, accounts, contacts, call recordings, and knowledge base articles                   | Yes   | Yes                          | Yes       |
| Leave internal notes on issues                                                                  | Yes   | Yes                          | Yes       |
| Use Ask AI                                                                                      | Yes   | Yes                          | Yes       |
| Reply to customers and update issues (assignee, status, fields)                                 | Yes   | Yes                          | No        |
| Mark issues as spam                                                                             | Yes   | Yes                          | No        |
| Edit accounts, contacts, tasks, and feature requests                                            | Yes   | Yes                          | No        |
| Delete issues, accounts, contacts, and call recordings                                          | Yes   | No                           | No        |
| Create and edit knowledge base articles and collections                                         | Yes   | Yes                          | No        |
| Publish and unpublish articles, and change knowledge base admin settings such as custom domains | Yes   | No                           | No        |
| Configure email, chat widget, ticket forms, customer portal, triggers, custom fields, and tags  | Yes   | Yes                          | View only |
| Edit macros                                                                                     | All   | Only macros shared with them | View only |
| Analytics, reports, and broadcasts                                                              | Yes   | Yes                          | View only |
| Manage AI support agents and skills                                                             | Yes   | Yes                          | No        |
| Manage webhooks and warehouse syncs                                                             | Yes   | Yes                          | View only |
| Use the Pylon MCP and connect MCP servers                                                       | Yes   | Yes                          | No        |
| Install and manage integrations, custom apps, and codebase tools                                | Yes   | No                           | No        |
| Workspace, billing, and data retention settings                                                 | Yes   | No                           | No        |
| Invite users, change roles, and deactivate users                                                | Yes   | No                           | No        |
| Create API tokens and bots                                                                      | Yes   | No                           | No        |
| Create custom roles and configure sign-in, SSO, and SCIM                                        | Yes   | No                           | No        |

The built-in roles can't be edited. To start from one and change it, [duplicate it into a custom role](#setup).

### Admin <a href="#admin-permissions-4" id="admin-permissions-4"></a>

Admins can do everything in Pylon. Some actions are Admin-only and can't be given to any custom role:

* Inviting users, changing roles, changing sign-in methods, and deactivating users
* Creating, editing, and deleting custom roles, and setting the default role
* Creating API tokens and bots
* Bulk adding users to Slack channels

Your workspace always needs at least one Admin, so Pylon won't let you change the role of the last Admin. If an Admin created API tokens with the Admin role, delete those tokens before changing that Admin's role.

### Member <a href="#member-permissions-2" id="member-permissions-2"></a>

Members can do almost all support work: reply to customers, update and route issues, edit accounts and contacts, write knowledge base articles, and configure most support settings. Members can't delete records, publish knowledge base articles, install integrations, change workspace or billing settings, or manage users and roles.

Members and Admins have **MCP Access**, which lets them use the [Pylon MCP](/pylon-docs/integrations/pylon-mcp).

To let someone publish articles or delete issues without making them an Admin, use a [custom role](#setup).

### Viewer

Viewers can see issues, accounts, contacts, the knowledge base, analytics, and most settings, but can't change them. They can leave internal notes on issues and ask questions in Ask AI. They can't reply to customers.

The Viewer role appears in role pickers only if your plan includes Viewer seats or custom roles.

### Integration User

Integration Users are people who interact with Pylon through an integration, for example a teammate who links Linear issues from Slack, but who don't need the Pylon app. They can't sign in. Setting someone's role to **Integration User** turns off their sign-in. Find them under the **Integration Users** view on the Users page.

## Manage users

Go to **Settings > Workspace > Users**. Use the views at the top to switch between **Pylon Users**, **Integration Users**, **Bots**, and **All Users**. Use **Export to CSV** to download the current list.

### Invite users

{% hint style="info" %}
Only Admins can invite users. If SCIM is turned on, add users in your identity provider instead.
{% endhint %}

1. Click **Invite User**.
2. Choose **Select existing users** to pick people from your connected Slack workspace, or **New user** to enter a full name and email address.
3. Pick a **Role**. It starts on your workspace's [default role](#sso).
4. Click **Invite**.

If an email address isn't on one of your organization's domains, Pylon warns you so you don't invite a customer by mistake.

### Change roles and other settings

* Change one user's role from the **Role** column, or open the user and change it there.
* To edit several users at once, select them and use the bar that appears to change their **Role** or **Sign-in method**, **Add to team**, **Assign Support Hours**, or set their **Status**.

Only Admins can change roles and sign-in methods.

### Remove a user (deactivate) <a href="#remove-a-user" id="remove-a-user"></a>

Pylon doesn't permanently delete users. To remove someone, deactivate them. This removes their access and keeps their past messages, notes, and activity.

1. On the Users page, click the user's name.
2. Click **Deactivate**, then confirm.
3. If they have open issues, choose who to reassign them to: a teammate or **Unassigned**. With **Unassigned**, you can also check **Refresh or update team assignment** to move the issues to a team, or pick **Current Team** to keep their team and rerun its assignment strategy.
4. Click **Save**. Reassignment can take a minute and can't be undone.

When you deactivate a user:

* They can't sign in.
* API tokens they created, and tokens that act as them, are permanently deleted. The confirmation dialog lists them. Anything using those tokens stops working, so create replacement tokens first. A [bot](#bot-users) is a good owner for long-lived tokens.
* Any open issues you don't reassign stay assigned to them.
* They're removed from team schedules, and the skills assigned to them on [teams](/pylon-docs/platform/teams) are removed.
* They no longer appear on the Users page.

To move someone's open issues without deactivating them, open the user and click **Reassign issues**.

{% hint style="warning" %}
If SCIM is turned on, deactivate SCIM-provisioned users in your identity provider. The **Deactivate** button is turned off for them in Pylon.
{% endhint %}

### Reactivate a user

1. On the Users page, open the **...** menu at the top right and choose **Reactivate User**.
2. Select one or more deactivated users.
3. Click **Reactivate**.

API tokens deleted during deactivation aren't restored.

### Bot users <a href="#bot-users" id="bot-users"></a>

A bot is an identity for API tokens, so automated traffic is attributed to the bot instead of a teammate. Bots can't sign in.

1. On the Users page, open the **Bots** view and click **New Bot**. Only Admins can create bots.
2. Enter a name, optionally upload a square avatar, and pick a **Role**. API tokens acting as the bot use this role.
3. Click **Create Bot**.

Then create a token that acts as the bot. See [Authentication](/pylon-docs/developer/api/authentication).

Deactivating a bot permanently revokes every API token acting as it. Reactivating the bot doesn't restore those tokens.

## Custom roles <a href="#setup" id="setup"></a>

Custom roles let you choose exactly what a group of users can do, down to which issues and accounts they can see. Custom roles are available on the Enterprise plan. Without it, the Roles page shows an upgrade banner.

{% hint style="info" %}
Only Admins can create, edit, or delete roles.
{% endhint %}

### Create a role

1. Go to **Settings > Workspace > Users**, click **Manage User Data**, and open the **Roles** tab.
2. Click **Create**, or open the **...** menu on an existing role and choose **Duplicate**.
3. Enter a **Role Name**.
4. Set an access level for each permission (see [Permissions](#permissions)).
5. Click **Create**.

Duplicating Admin leaves out the [Admin-only actions](#admin-permissions-4). If a role has no access to Accounts or Issues, Pylon warns that the role may have a broken experience.

To delete a custom role, open its **...** menu and choose **Delete**. You can't delete a role that's assigned to active users or API tokens, or that's set as the default role. Deactivated users who had the role move to the default role.

### Limit which issues a role can access

The **Issues** card on a custom role controls issue access with groups:

1. Click **Add Group**, then **Add Filter** to set the conditions, such as source, team, tag, or support email address.
2. Pick the group's access level: **No access**, **View only**, **Full access**, or **Custom access**. Custom access lets the role view matching issues plus any of **Add notes**, **Edit** (reply and update), **Delete**, and **Mark as spam**.
3. Set **Default** access for issues that match no group.

Pylon checks groups from top to bottom and applies the first one that matches, so put the most specific groups first. Drag groups to reorder them, or use a group's menu to duplicate or delete it.

For example, a `Security` role could have one group for issues sent to your security email address with **Full access**, and **Default** set to **No access**.

### Limit which accounts a role can access

Under **Accounts**, use **Refine access scope with filters** to limit the role to accounts that match your filters, such as account owner, type, tag, or a custom field.

### Knowledge base publishing

The Knowledge Base permissions are separate:

* **Articles & Collections**: view or edit articles and collections.
* **Publish articles**: publish and unpublish articles.
* **Admin settings**: manage sensitive settings such as custom domains.

You can limit **Publish articles** and **Admin settings** to specific collections with **Refine access scope with filters**. Members can edit articles but not publish them, so use a custom role to give writers publishing rights.

### Permissions <a href="#permissions" id="permissions"></a>

Most permissions have levels: **No access**, **View**, and **Full access**, plus **Edit** for permissions that also allow deleting. Issues adds **Notes** and **Reply**. Macros uses **View**, **Write**, and **Full access**, where Full access lets the role edit every macro, including ones not shared with them. A few permissions are a single **Enabled**/**Disabled** switch.

| Category         | Permissions                                                                                                                                                                                                                                                           |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Objects          | Accounts, Contacts, Custom objects\*, Issues, Tasks, Call Recordings, Account notebooks, Feature Requests                                                                                                                                                             |
| Organization     | Workspace                                                                                                                                                                                                                                                             |
| User Management  | Users (role changes still require Admin), Teams                                                                                                                                                                                                                       |
| General Features | Analytics, Reports, Broadcasts, Integrations, Support agents\*, Skills\*, Ask AI\*                                                                                                                                                                                    |
| Support Features | Email, Update email suppressions, Chat Widget, Phone\*, SMS\*, Support Workflows, Active Times\*, Operations Automation, Ticket forms, Customer Portal, Triggers, Macros, Issue Custom Fields, Account Custom Fields, Contact Custom Fields, Issue Tags, Account Tags |
| Knowledge Base   | Articles & Collections, Publish articles, Admin settings                                                                                                                                                                                                              |
| Developer        | Custom Apps, Codebase Tools, Webhooks, Warehouse Sync, MCP Access, MCP connections                                                                                                                                                                                    |
| Security         | Data Retention                                                                                                                                                                                                                                                        |

\* Shown only when your workspace has that feature.

## Sign-in, SSO, and SCIM <a href="#sso" id="sso"></a>

Admins manage sign-in and provisioning in **Settings > Workspace > Access**. The page is called **Access & SSO** when your plan includes SAML. SAML SSO and SCIM are available on select plans — contact your account team.

* **Sign-in methods**: choose how new users can sign in: Slack, Google, Microsoft, or SAML. Existing users keep their current method. To change it, use the **Sign-in method** column on the Users page. Signing in with Slack uses your Slack workspace's login, including any SSO you've set up for Slack.
* **Domain management**: the email domains that can use SSO or just-in-time provisioning. With SAML, click **Add domain** to verify a new domain. Otherwise, contact support to change domains.
* **SAML authentication**: click **Configure SAML** to connect your identity provider, such as Okta, Microsoft Entra ID, or Google Workspace.
* **Default user role**: the role new users get.
* **Enable just-in-time provisioning**: when on, anyone who signs in with one of your domains gets access without an invitation and is given the default user role.

### SCIM

SCIM lets your IT team provision and deprovision Pylon users from your identity provider.

1. Set up SAML and confirm **SAML authentication** shows **Active**.
2. Under **Provisioning**, click **Configure SCIM** and connect your directory.
3. Optionally, under **SCIM group to Pylon user role mapping**, click **Add mapping** to give each SCIM group a role. Users who aren't in a mapped group get the default user role.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F8hJwBvoFn7Eq8D0im6lg%2FScreenshot%202025-11-25%20at%2010.02.32%E2%80%AFAM.png?alt=media&amp;token=3e6dfeee-c363-4fa0-8147-d982a43b4dc4" alt=""><figcaption></figcaption></figure>

When SCIM is on, your identity provider manages users: **Invite User** is turned off, roles come from group mapping or the default role, and SCIM-provisioned users must be deactivated in the identity provider. You can still deactivate users that SCIM didn't provision directly in Pylon.


# Resources

Connect resources that Pylon's AI features can reference when answering questions.

Pylon's AI features, including [Assist Agent](/pylon-docs/agents/assist-agent), [Copilot for issues](/pylon-docs/support-workflows/issues/copilot), [Support Agent](/pylon-docs/agents/support-agent), and [federated search](/pylon-docs/knowledge-base/search#federated-search), benefit from access to more information.

By default, they have access to your past Pylon issues and your Pylon Knowledge base. Make them even more powerful by connecting any external sources of knowledge you have!

## Setup

1. Go to [Resources](https://app.usepylon.com/settings/ai-controls/training-data) in Settings and click **Import Data**.
2. Select a method of importing data and follow the instructions.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FbnknT1yk38H5wuh4Juf9%2FScreenshot%202026-03-09%20at%201.56.52%E2%80%AFPM.png?alt=media&amp;token=add5d364-5bfb-4576-90f4-5a008214b71c" alt=""><figcaption></figcaption></figure>

* Your Pylon knowledge base and past issues will be enabled by default and reindexed **live**
* Public URLs to individual webpages or a base url to crawl that will be reindexed every 7 or 30 days depending on your Pylon plan. Examples may include:
  * Public-facing documentation not hosted by Pylon
  * Public Google docs
  * Public GitHub repos
  * Your marketing website or pricing page
* Give Pylon a few moments to automatically scrape and index all your content

This data is now available to power all your AI features!

## Import methods

* **Import from URLs**: crawl a public website or import a list of specific URLs.
* **Import from file**: upload resources directly. Supported files include PDFs up to 100 pages, text files such as CSV, JSON, and Markdown, and images.
* **Import from code**: import a public GitHub repository.


# Ask AI

Get all your questions about customers answered!

{% hint style="info" %}
Connect [Resources](/pylon-docs/platform/training-data) that is outside of Pylon to give Ask AI access to more resources!
{% endhint %}

Ask AI is a general purpose AI chat that can help you and your team answers all the questions you might have about your existing data.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FC5HmsZcMcDVSAduuI9d4%2Fask%20ai%20for%20docs.gif?alt=media&amp;token=bf40ad82-d942-4dba-ab10-838ec1e975a9" alt=""><figcaption></figcaption></figure>

* Browsable citations help you understand exactly where answers are coming from, so the results are never a black box
* Ask history allows you to access your past queries via search
* Shareable searches let others continue to ask their own follow up questions after you send them your results
* Dynamic values allow you to understand how your query was interpreted by the AI

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FQPsv2E9suV9uDbv7HNdX%2FCleanShot%20Feb%2022%202025%20(4).png?alt=media&amp;token=6f33aec7-e282-4df6-bbcf-59ffb9e3f24e" alt=""><figcaption></figcaption></figure>

## Use Cases

#### Teammate Onboarding

Use Ask AI to answer questions about your product:

* How does x feature work?
* Do we support x?

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fo1P09QdXDhC8C7jUTo1n%2FCleanShot%202024-12-17%20at%2000.40.20%402x.png?alt=media&amp;token=8b252816-94aa-4444-aeab-4e5677767b73" alt=""><figcaption><p>(It's <a href="/pylon-docs/knowledge-base/articles-and-collections/copilot#article-generation">this feature</a>)</p></figcaption></figure>

#### Product Feedback

Use Ask AI to gather product feedback or inform customer evidence on product specs:

* We launched x feature in beta last week, what has been all the feedback we've gotten about it?
* What are examples of customers asking about x feature?

#### Support Trends

Use Ask AI to summarize themes of issues for the rest of your team:

* Summarize common topics for bugs over the last week
* What are all the bug reports about x feature?
* List all interactions where the customer was very dissatisfied

#### Account Management

Use Ask AI before stepping into a customer call:

* Summarize what has been going on with x customer in the last month
* Did x customer ever ask for y feature?

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FmIiKzCMcFtp85JX6oyF2%2FCleanShot%202024-12-17%20at%2000.34.44%402x.png?alt=media&amp;token=28aa0510-afee-4e44-8c7b-05a5bd210c4f" alt=""><figcaption><p>(It's <a href="/pylon-docs/support-workflows/issues/copilot">this feature</a>)</p></figcaption></figure>

**Analytics**

Use Ask AI to get quick answers to analytical questions:

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FjnEfPd7vKGJb1EhBGZNc%2FCleanShot%202025-04-27%20at%2012.41.48.png?alt=media&amp;token=07a0c845-6d06-49f6-b82b-c02847b9ffdb" alt=""><figcaption></figcaption></figure>


# AI Reports

Automatically generate and send summaries and insights to specified destinations

AI Reports generate summaries and insights from your Pylon data and deliver them through Slack, Microsoft Teams, or email. Use them to surface escalated issues, product feedback hotspots, accounts with negative sentiment interactions, and more.

Open **Analytics > Reports** and click **Create Report**. You can also open the [Reports page](https://app.usepylon.com/analytics/reports) directly.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FdfH3YWKUpyepRo6AovYp%2FScreenshot%202026-01-05%20at%204.08.16%E2%80%AFPM.png?alt=media&amp;token=97b7a81f-486c-4a71-84f3-a8724e66645e" alt=""><figcaption></figcaption></figure>

## Create report content

On **Create report**, give the report a title and choose its data time range, timezone, and filters. Add AI insight sections with instructions for what to summarize and how to format the result. Use **Data sources** to choose from **Issues**, **Calls**, and **Manual entries**. Reports synthesize the matching data from those sources, rather than every record in your workspace.

You can add section headers, static text, and dividers to organize the report. Use **View templates** to start from an existing template, or duplicate an existing report to reuse its configuration.

## One-off or recurring

On **Schedule**, choose:

* **One-off**: generate a report once with **Generate Report**. Choose a relative **Report date range**, or **Custom dates** for a specific period. Custom dates must cover completed days, and the start date can't be more than one year ago.
* **Recurring**: choose a start time and publish the report with **Publish**. The schedule starts report generation; delivery happens after generation finishes.

Recurring frequency follows the time range selected on **Create report**:

| Data time range | Repeats        |
| --------------- | -------------- |
| Last 1 day      | Daily          |
| Last 7 days     | Every 7 days   |
| Last 1 month    | Monthly        |
| Last 3 months   | Every 3 months |

Daily reporting and additional reports depend on your workspace's plan. Contact your account team if an option is unavailable.

### Schedule details

Use **Start on** to choose a future generation date and time. Check the timezone beside the report's data time range and confirm the displayed start time after changing it.

For a daily schedule starting on a weekday, choose **every day** or **on weekdays only**. For monthly schedules, use a numbered day; when the start date is the last day of a month, you can choose **the last day** instead. A numbered day after the 28th only runs in months that contain that day.

Relative data ranges end at the end of the previous day in the report's timezone. For a weekday-only **Last 1 day** report generated on Monday, the range includes Friday through Sunday.

## Delivery destinations

The available delivery options depend on your connected integrations:

| Option                     | Setup                                                                                                          |
| -------------------------- | -------------------------------------------------------------------------------------------------------------- |
| Channels — Slack           | Connect Slack, then choose an available Slack destination.                                                     |
| Channels — Microsoft Teams | Connect Microsoft Teams, then choose an available Teams channel.                                               |
| Email                      | Connect an email sender, select it under **Send report from**, then select teammates under **Send report to**. |

**Email** appears when Pylon has an email sender available. You must choose a sender and at least one recipient before publishing or generating an email report. The recipient picker lists your teammates' email addresses and supports selecting multiple recipients.

Delivered insights include citations and a link to view the report in Pylon.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F2QXt3MIjG3XJfzAIXeP8%2FScreenshot%202026-01-06%20at%203.39.06%E2%80%AFPM.png?alt=media&amp;token=49db572c-58d2-4344-a244-e9c3e15071fa" alt=""><figcaption></figcaption></figure>

## Manage reports and access

Open a report to review generated results or edit its configuration. **Unpublish** pauses a recurring report; **Publish** enables it again. You can duplicate a report from its menu to start a separate configuration.

Viewing reports requires Reports read permission. Creating, editing, publishing, duplicating, and generating reports requires Reports write permission. Availability and the number of report configurations you can create depend on your workspace's plan — contact your account team for details.


# Surveys

Create and send out-of-the-box and customized surveys to your customers

{% hint style="info" %}
You can create and send CSAT, NPS, or Custom surveys!
{% endhint %}

Create surveys on the [Surveys](https://app.usepylon.com/settings/surveys) page and preview how the survey looks in Slack, Email, Chat, and a Popup. Customize the wording of questions, coloring, notifications, who the survey is sent to and more.&#x20;

Surveys come with:

* Customization on survey language, followup, and notifications
* Out-of-the-box analytics and raw results
* Audience and recurrence customization using triggers
* Live previews of what customers will see and ability to send yourself a preview

## CSAT

CSAT surveys are on a industry standard "Very Dissatisfied" to "Very Satisfied" 5-point scale.&#x20;

Use [Triggers](/pylon-docs/platform/triggers) to control the cadence and audience of your CSAT survey.

## NPS

NPS surveys are on a industry standard 0-10 scale with ranges for detractors (0-6), passives (7-8), and promoters (9-10). NPS surveys can also have a free response follow up and customization on coloring, language, and notifications.

These surveys can be sent on a cadence and can have additional configurations.

#### Progressive Rollout&#x20;

Instead of sending the survey to all audience members at once, enabling progressive rollout will send out the survey to all eligible audience members evenly over the course of the recurring cadence.

Example: A monthly survey with 100 eligible audience members would send to 3-4 randomly selected audience members every day of the month.

#### Cooldown period

Set up a minimum time before survey responders get sent the survey again.

Example: Once an audience member responds to the survey, they won’t get sent the survey for 3 months, regardless of the rollout method or cadence.

#### Follow-ups

Remind audience members to fill out the survey if they haven’t responded yet.

Example: 3 days after the survey has been sent, if the audience member hasn’t responded yet, send the survey to them again

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FpAbeStLrp6HMls1SXx7h%2FScreenshot%202026-02-06%20at%2010.04.00%E2%80%AFAM.png?alt=media&amp;token=8ad60311-f4a0-46ca-bc83-61c681bca977" alt="" width="563"><figcaption></figcaption></figure>

## Custom

Create and send custom surveys with a custom rating scale and follow up question, across any supported source (Slack, Email, Chat, Popup).&#x20;

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FMimHPQ0nsRFpOz7FO83t%2FCleanShot%202025-08-04%20at%2015.36.36%402x.png?alt=media&amp;token=8d8433af-6cec-48e7-9da2-c699f7e9f01e" alt="" width="375"><figcaption><p>Example of a customized popup survey</p></figcaption></figure>


# Audit Logs

View granular logging of key actions taken in Pylon to maintain an audit trail for your workspace.

Audit logs record who did what in your workspace, and when. Use them for security reviews, compliance, and troubleshooting unexpected changes.

Open them from **Settings > Admin console > Audit logs**. Only Admins can view audit logs.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FIVolkzjXzpxsp80XJGAi%2Faudit%20logs.png?alt=media&amp;token=2ed35908-7264-4e74-adb3-4aee77983667" alt="" width="563"><figcaption></figcaption></figure>

## What's captured

Each event records the time, who performed it, the event, and the object it affected. Events performed by a trigger, macro, AI, or Pylon itself show that as the actor. Where available, the event details also include the IP address the request came from.

Pylon logs several hundred kinds of events. The table shows the main categories with a few examples of each.

| Category                              | Example events                                                                                                                                                                                                                                   |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Sign-ins                              | Login Succeeded, Login Failed, Portal Login Succeeded, Portal Login Denied                                                                                                                                                                       |
| Users and teams                       | User Invited, User Updated (including role changes, email changes, and deactivation), Team Created, Team Member Added, Team Member Removed                                                                                                       |
| API tokens                            | API Token Created, API Token Rotated, API Token Revoked, API Token Deleted, API Token Role Updated, API Token IP Allowlist Updated                                                                                                               |
| Issues                                | Issue Assigned, Issue Closed, Issue Tags Changed, Issue Merged, Issue Deleted, Issue Restored, Issue Message Deleted, Issue Message Redacted, SLA breaches                                                                                       |
| Accounts and contacts                 | Account Created, Account Owner Changed, Accounts Merged, Account Deleted, Contact Created, Contact Updated, Contact Merged, Contact Deleted                                                                                                      |
| Exports                               | Issues Exported, Accounts Exported, Contacts Exported, Users Exported, Custom Objects Exported, Audit Logs Exported                                                                                                                              |
| Triggers and macros                   | Trigger Created, Trigger Updated, Trigger Enabled, Trigger Disabled, Trigger Deleted, Trigger Restored, Macro Created, Macro Updated, Macro Deleted                                                                                              |
| Knowledge base                        | Knowledge Base Article Created, Knowledge Base Article Updated, Knowledge Base Article Deleted, Knowledge Base Article Restored, Knowledge Base Collection Created, Knowledge Base Settings Updated, Knowledge Base Custom Theme Published       |
| Fields, objects, and tags             | Custom Field Created, Custom Field Updated, Custom Field Deleted, Custom Object Definition Created, Tag Created, Tag Deleted                                                                                                                     |
| Workspace settings                    | Organization Access Settings Updated, Organization Email Settings Updated, Organization Ticket Settings Updated, Organization Customer Portal Settings Updated, Support Hours Schedule Updated, Chat Widget Identity Verification Secret Changed |
| Integrations                          | Organization App Installed, Organization App Uninstalled, Slack App Revoked, Slack Bot Joined Channel                                                                                                                                            |
| Phone and SMS                         | Phone Number Purchase Requested, Phone Number Port Requested, Phone Number Deleted, Inbound Call Answered, Outbound Call Placed, SMS Numbers Blocked                                                                                             |
| Views, reports, and surveys           | View Created, View Updated, View Deleted, Report Created, Report Deleted, Survey Schedule Created, CSAT Survey Sent                                                                                                                              |
| Projects, tasks, and feature requests | Project Created, Task Assigned, Feature Request Created, Feature Requests Merged                                                                                                                                                                 |

To see every event type, open the **Event** filter on the Audit logs page. It lists all of them. Through the API, each entry's `action` field holds the event name.

## History and plans

Full audit log history is available on the Enterprise plan. The list shows the last 30 days by default, and you can use the **Happened At** filter to look further back.

Without it, audit logs cover the last 30 days. The **Happened At** filter isn't available, and CSV exports and the API return only events from the last 30 days.

## Find an event

* **Filters:** narrow the list by **Actor User** (a teammate), **Actor Contact** (a customer), **Event**, and, on the Enterprise plan, **Happened At**.
* **Search:** type in the search box to match actor names, the names of affected accounts, contacts, teams, triggers, users, views, projects, and tasks, and attribute values.
* **Event details:** click a row to open **Event details**, which shows the time, user, IP address (when recorded), event, the affected object, and the event's attributes. Switch the attributes between **Columns** and **Code** views.

Your filters and the open event are saved in the page URL, so you can share a link to a specific event or search.

## Restore deleted items

Some deletion events have a **Restore** button. Only Admins can restore.

| Deleted item           | Event                          | What to know                                                                                                                                                                              |
| ---------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Issue                  | Issue Deleted                  | **Restore** is turned off if the issue was already restored or has no messages left to restore. Hover over the button to see why. Some data, such as SLAs and surveys, may not come back. |
| Trigger                | Trigger Deleted                | The trigger is restored to the **Archived** group and stays disabled until you turn it on.                                                                                                |
| Knowledge base article | Knowledge Base Article Deleted | You can restore an article within 30 days of deletion. After that, it's permanently deleted. Restoring is best-effort: feedback, issue links, and URL path mappings may not come back.    |

Each restore adds its own event, such as Issue Restored or Trigger Restored.

## Export audit logs

### CSV

1. Set the filters and search you want.
2. Click **Export as CSV**, then **Export to CSV**.

The export includes every event that matches your current filters and search. Large exports run in the background, and you'll get a notification when the file is ready. Download it from **Recent exports** in the same menu. Files are available for 7 days. Starting an export adds an Audit Logs Exported event.

The CSV includes the event ID, time, actor, actor type, actor user and contact IDs, IP address, event, object type, object ID, and attributes.

### API

Use the API to pull audit logs into a SIEM or other tool. You need an API token with the Admin role.

* `GET /audit-logs` lists audit log entries, newest first, with pagination.
* `POST /audit-logs/search` filters by `action`, `action_happened_at`, or `object_id`.

Without full audit log history, a search that starts more than 30 days ago returns an error. See the [Audit Logs API reference](/pylon-docs/developer/api/api-reference/audit-logs) for parameters and response fields.


# Languages & Localization

Using Pylon in different languages for both your team and your customers.

### Your Team

If your team operates across many different languages or English just is not your primary language, you can localize the entire Pylon app to a language of your choice!

You can find these settings on your [Profile](https://app.usepylon.com/settings/profile) page.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FkWfo7pSRvRI4YTygo1aN%2FCleanShot%202026-04-01%20at%2020.52.52.png?alt=media&amp;token=2adef1e1-0e07-4f33-8e28-440ee14782f4" alt=""><figcaption></figcaption></figure>

**Message Language**

If your customers reach out to you in different languages, Pylon can automatically translate those messages into the native language of your users. Your users can then reply in their native language and their response will be translated on-the-fly into the customer's language.

**App Language**

The inside of the Pylon app can be translated into a language of your choice (this can be a different language for different members of your team), allowing you to easily navigate and use the Pylon app.

Set it under **App language** on your Profile page. The app is available in English, Spanish, French, German, Italian, Japanese, Korean, and Brazilian Portuguese.

### Your Customers

Translate your [Knowledge Base](/pylon-docs/getting-started/pylonboarding/knowledge-base), [Customer Portal](/pylon-docs/customer-portal/overview), [Chat Widget](/pylon-docs/chat-widget/overview), and [Ticket Forms](/pylon-docs/support-workflows/ticket-forms) so your customers can receive support in any language.

Each modality supports translation - on the [Languages](https://app.usepylon.com/settings/languages?tab=supported-languages) page you can select which languages you want to support. In each of these interfaces your customer will have a language picker to select which language they would like to view content in, and wherever possible we'll default this to their preferred language (for example, their browser language or Pylon's own knowledge of their preferred language based on their past interactions).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FgFaRBLPZJ9Qhoa9mycKA%2FCleanShot%202026-04-01%20at%2021.03.56.png?alt=media&amp;token=e95b3487-8f1c-4e6f-9458-fdc4101a9700" alt=""><figcaption></figcaption></figure>

From the [Custom Translations](https://app.usepylon.com/settings/languages?tab=custom-translations) tab you also have fined grained control of modifying specific translations in specific languages.

**Knowledge Base**

Within the knowledge base you also have fine grained control of article translations:

* **Auto-translate** articles into each supported language with AI, or turn it off to write and edit a translation by hand.
* When you edit an article, its auto-translated versions are marked **Has changes** and regenerated when you publish them. You can also **Regenerate translation** at any time.
* Publish all translations at once with **Publish translations** on the article list.
* Translate collection names and descriptions and the knowledge base header.
* Terms on the **Custom translations** tab are applied when Pylon translates your knowledge base, so you can control how product names and other terms are translated, or keep them untranslated.
* Each translated page gets its own URL (for example, `/fr/articles/...`) and appears in your sitemap. Visitors switch languages with the language picker. The knowledge base opens in your default language unless the URL specifies another; it doesn't use the visitor's browser language.

AI translation is part of Pylon's AI Assistant features and is available on select plans. You can support up to 20 languages besides your default; unlimited languages are available on the Enterprise plan.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FaU9IrLuqDv9uUD2kolNO%2Fimage.png?alt=media&amp;token=79789041-75e4-4f10-add4-493fb48df840" alt=""><figcaption></figcaption></figure>

For the full guide, see [Knowledge Base Translations](/pylon-docs/knowledge-base/translations).


# Custom Objects

Represent complex data and relationships within Pylon.

### Overview

Custom objects let you define your own data types in Pylon beyond the built-in Account, Contact, and Issue objects. Each custom object type has its own records, custom fields, and is usable across the product in filters, views, AI, and more.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fs98ggCLy3jOxBGpcnkBj%2FScreenshot%202026-04-14%20at%208.41.34%E2%80%AFPM.png?alt=media&amp;token=d66dac5c-1777-463d-a38a-549692f6e82c" alt=""><figcaption></figcaption></figure>

You can create and manage custom object definitions in [Settings > Account Data > Objects](https://app.usepylon.com/settings/account-data?tab=objects).

### Creating a Custom Object

1. Go to **Settings > Account Data > Objects**
2. Click **Create Object**
3. Fill in the object details:
   * **Label** — The display name for your object type (e.g., "Project", "Subscription")
   * **Description** — An optional description of what this object represents
   * **Icon URL** — An optional icon to visually distinguish this object type
   * **Visibility** — Choose whether this object appears in the account sidebar, issue sidebar, or both

### Syncing from CRM

Custom objects can be synced from your [CRM](/pylon-docs/integrations/crm), allowing you to pull CRM-specific data into Pylon automatically.

To set up a sync:

1. Go to [Settings > Integrations](https://app.usepylon.com/apps) and select your CRM
2. In the **Data Mapping** section, click **Add Object**
3. Select the CRM object you want to sync from
4. Map it to an existing Pylon custom object, or create a new one directly from the sync setup
5. Save your changes

Once configured, Pylon will automatically pull records and field values from your CRM. You can also configure bidirectional sync of fields on the object.

### Using Custom Objects

Once you have custom objects set up, they integrate across Pylon just like built-in object types, for example:

* **Custom Fields** — Add additional [Custom Fields](/pylon-docs/platform/custom-fields) to add properties to custom objects.
* **Filter and sort** — Use the filter bar and column sorting to find specific records in the table view. Customize which columns are visible and reorder them to fit your workflow.
* **Analytics** — Custom object data flows into your analytics and reporting, so you can build views and track metrics around your custom data.
* **Triggers** — Reference custom object fields in triggers to automate workflows based on your custom data.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FeZD5zmPrIYlxkEfHPZK5%2FCleanShot%202026-04-14%20at%2022.42.55%402x.png?alt=media&amp;token=0fcc6a3b-7cd2-4fb0-87ba-3adb60d49be0" alt=""><figcaption></figcaption></figure>


# Overview

A dedicated place to host your support content, including question-and-answer style articles, internal runbooks, and more -- all supercharged with AI and tightly integrated with the Pylon platform.

<figure><img src="https://mintlify.s3-us-west-1.amazonaws.com/pylon/images/knowledge-base.png" alt=""><figcaption></figcaption></figure>

## Multiple knowledge bases

On the Enterprise plan, you can run several separate knowledge bases, for example one per product or audience. Each has its own articles, collections, styling, domain, and settings.

* Switch between knowledge bases by clicking the current knowledge base's name at the top of the knowledge base sidebar.
* Choose **New knowledge base** in that menu to create one.
* To delete a knowledge base and all of its articles and collections, go to its **General** settings and use **Delete knowledge base**.

## Default visibility

In **General** settings, **Visibility** sets the default visibility for the whole knowledge base: **Public**, **Customer**, or **Internal**. It's a ceiling. Articles and collections can be more restrictive than the default, but not more permissive. Items capped by the default show an **Inherited** badge.

For example, set the default to **Customer** to make the entire knowledge base require login, regardless of individual article settings.

## Export

To download your knowledge base, go to **General** settings and click **Export** under **Export knowledge base**. You get a zip file with one HTML file per article, organized into folders by collection, plus an `articles-metadata.csv` with each article's ID, title, URL, collection, status, last published date, tags, and HTML content. Published articles export their published version; unpublished drafts are included with the status `draft`.

To export specific articles as PDFs instead, select up to 100 articles in the article list and choose **Export to PDF**.

## Learn more

{% content-ref url="/pages/4pMQmurZsocd3yv63MIO" %}
[Articles & Collections](/pylon-docs/knowledge-base/articles-and-collections)
{% endcontent-ref %}

{% content-ref url="/pages/UFK6xzxyTXHUJIX4w6xE" %}
[Editor](/pylon-docs/knowledge-base/articles-and-collections/editor)
{% endcontent-ref %}

{% content-ref url="/pages/gL2zAmnMiJ60mPquRt76" %}
[Copilot](/pylon-docs/knowledge-base/articles-and-collections/copilot)
{% endcontent-ref %}

{% content-ref url="/pages/E6r4dtg3xkuMlYPX3qyH" %}
[Templates](/pylon-docs/knowledge-base/articles-and-collections/templates)
{% endcontent-ref %}

{% content-ref url="/pages/zKkmT2aBRvV0grgnon0E" %}
[Collaboration](/pylon-docs/knowledge-base/articles-and-collections/collaboration)
{% endcontent-ref %}

{% content-ref url="/pages/JknRDna8WM5QJ7OXYtuq" %}
[Translations](/pylon-docs/knowledge-base/translations)
{% endcontent-ref %}

{% content-ref url="/pages/orMzbfEQOZ5j8hzCSALq" %}
[Styling & Customization](/pylon-docs/knowledge-base/styling-and-customization)
{% endcontent-ref %}

{% content-ref url="/pages/0YGtBLwVBOPXEqXLoOzL" %}
[Custom Authentication](/pylon-docs/knowledge-base/custom-authentication)
{% endcontent-ref %}

{% content-ref url="/pages/ZDSyDYQyqA5L7MR7zIax" %}
[Search](/pylon-docs/knowledge-base/search)
{% endcontent-ref %}

{% content-ref url="/pages/DH5iixflS3NyGdiywTvW" %}
[Analytics](/pylon-docs/knowledge-base/analytics)
{% endcontent-ref %}

{% content-ref url="/pages/Y9Xwc4GDtnwhpUt23P0k" %}
[Redirects](/pylon-docs/knowledge-base/redirects)
{% endcontent-ref %}

{% content-ref url="/pages/aH8ZpdELPLMqRx2LezYP" %}
[SEO & AI Crawlers](/pylon-docs/knowledge-base/seo-and-ai-crawlers)
{% endcontent-ref %}


# Articles & Collections

How articles and collections within the knowledge base function

## Articles

Each article has its own URL with a customizable slug. For more information on writing articles, see the [Editor](/pylon-docs/knowledge-base/articles-and-collections/editor) section.

Article URLs include the article's numeric ID (for example, `/articles/1234567890-reset-your-password`). Pylon looks articles up by that ID, so changing a slug doesn't break existing links.

### Visibility

Visibility controls who can read an article. Articles can be:

**Public**: Visible to everyone.

**Customer**: Visible to customers logged into the knowledge base, and to your team. You can optionally add filters that viewers must match to see the article. Filters can use contact properties as well as account properties. For example, limit an article to contacts on Enterprise-tier accounts, or to a specific account, to tailor content to the relevant segment of your customer base.

**Internal**: Only visible to your team when they're logged into Pylon.

<div data-full-width="false"><figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F21INs1P7eGkDSkmrsZsb%2FScreenshot%202025-06-03%20at%206.26.22%E2%80%AFPM.png?alt=media&amp;token=8441608c-5e9d-4982-b606-683f45b156b7" alt=""><figcaption></figcaption></figure></div>

Visibility doesn't control what AI agents can read. That's a separate setting, [Support agent access](#support-agent-access).

The knowledge base's default visibility, set in **General** settings, caps every article and collection in it. An article can be more restrictive than the default, but not more permissive. See [Default visibility](/pylon-docs/knowledge-base/overview#default-visibility).

### Direct link only

Turn on **Accessible only by direct link** in an article's settings to hide a public or customer article from navigation and search. Anyone with access can still open it from a direct link. Your team still sees it in search, marked **Direct link only**.

This is useful for upcoming features that aren't released yet, or workarounds you don't want to draw attention to.

AI agents don't use direct-link-only articles.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fg3aTEAyOwvMMRlvAqXXh%2FScreenshot%202025-06-03%20at%206.28.35%E2%80%AFPM.png?alt=media&amp;token=eff51505-ca01-4ae8-b2c8-d72f8e4d70e8" alt=""><figcaption></figcaption></figure>

### Support agent access

**Support agent access** controls which AI agents can read an article. It's independent of visibility: an **Internal** article is hidden from customers but can still be used by your agents. Agents use internal articles as background knowledge, but never link to them or recommend them to customers.

Set it in an article's settings (from the article's **⋯** menu, choose **Settings**) or in a collection's settings:

* **Inherit**: Use the parent collection's setting. At the top level of the knowledge base, this means all agents can read it.
* **Specific agents only**: Only the agents you select can read it.
* **No support agent access**: No AI agent can read it.

{% hint style="warning" %}
Internal articles used to be hidden from AI agents by default. Older internal articles may still be set to **No support agent access**. Check the **Support Agent Access** column in the article list and update any articles you want your agents to use.
{% endhint %}

Customer visibility filters also apply to agents: an agent answering a customer only uses customer-restricted articles that the customer matches.

Support agent access is shown only when [AI agents](/pylon-docs/agents/support-agent) are enabled for your workspace.

### Tags

Use tags to categorize articles.

* Add tags in the **Tags** field of an article's settings. You can create a new tag by typing it.
* Manage all tags from **Settings > Article tags** in the knowledge base.
* Filter the article list by **Article Tags**, or show the **Tags** column.
* Tags appear on the public article page and are included in knowledge base search.

### Version History

Every time an article is published, it creates a new version. Open **Version History** from the article's **⋯** menu to review changes or restore a previous version.

### Feedback

Articles come with built-in feedback collection. At the bottom of each article, viewers can rate how helpful it was on a 1-5 scale and leave written feedback.

View submitted feedback on the **Performance** page of your knowledge base. To get notified about new feedback, see [Feedback notifications](/pylon-docs/knowledge-base/analytics#feedback-notifications).

## Bulk actions

Select articles in the article list to act on several at once:

* **Move** to another collection
* **Visibility**
* **Direct Link**: switch between **Direct Link Only** and **Discoverable**
* **Support agent access**
* **Tags**: **Add**, **Replace**, or **Remove** tags
* **Request Review**
* **Export to PDF**: download up to 100 articles at once as PDFs (knowledge base admins only)
* **Publish**: publish unpublished changes in the default language; articles without changes are skipped
* **Delete**

## Collections

Collections are folders that contain articles or other collections. Each collection has its own URL. Open a collection and click **Settings** to edit its:

* **Name** and **Description**
* **Icon**: pick a system icon, or upload your own on the **Custom** tab (SVG, PNG, JPEG, GIF, or WebP, up to 256 KB). Uploaded icons can be reused across the knowledge base.
* **Slug**
* **Parent collection**
* **Visibility**, which applies to all articles in the collection
* **Support agent access**, which articles set to **Inherit** follow

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F4iHlsCOBjeLobLUzJb5o%2FCleanShot%202024-12-07%20at%2021.01.20.png?alt=media&amp;token=322b8a1b-e284-41a8-ab77-e34ec31bbd5b" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Need fully separate knowledge bases, for example for different products? On the Enterprise plan you can create multiple knowledge bases. See [Multiple knowledge bases](/pylon-docs/knowledge-base/overview#multiple-knowledge-bases).
{% endhint %}

## Triggers

Use the **Article published** trigger kickoff to send an email, Slack notification, or webhook, or to set article tags, whenever an article is published. See [Triggers](/pylon-docs/platform/triggers).


# Editor

How to use Pylon's WYSIWG editor to write knowledge base content

Pylon's knowledge base editor is a "what you see is what you get" (WYSIWG) style editor. This means your customers will see content exactly as you type it.

Content is added in the form of **blocks**, which are individual elements in the article. Blocks can be dragged around to reorder them or deleted.

To get started, type `/` in your knowledge editor to see what blocks are available.

## Markdown shortcuts

Use these shortcuts while typing. For headings, lists, blockquotes, and code blocks, type the prefix at the start of a new line, then press Space. Inline formatting applies when you type the closing marker.

| Format             | What to type                                                                  |
| ------------------ | ----------------------------------------------------------------------------- |
| Heading            | `#` through `######` for heading levels 1 through 6                           |
| Bulleted list      | `-` or `*`                                                                    |
| Numbered list      | A number followed by a period, such as `1.`                                   |
| Blockquote         | `>`                                                                           |
| Bold               | `**text**` or `__text__`                                                      |
| Italic             | `*text*` or `_text_`                                                          |
| Strikethrough      | `~~text~~`                                                                    |
| Inline code        | Text enclosed in single backticks                                             |
| Code block         | Three backticks or `~~~`, optionally followed by a language name before Space |
| Mermaid diagram    | Three backticks followed by `mermaid`, then Space                             |
| Horizontal divider | `---`, or `___` or `***` followed by Space                                    |

Use `/` to insert other blocks, or select text for formatting options such as underline and links.

## Blocks

Currently supported blocks in Pylon's article editor are:

* All common rich text like bolds, italics, underline, strikethrough, inline code, links, etc.
* Headings, with 6 levels
* Text justification
* Numbered and bulleted lists
* Accordions
* Callouts, with customizable icon and color
* Code blocks
  * Tabs with filenames and syntax highlighting in 20+ languages
* Blockquotes
* Native relative links to other knowledge base pages
* Tables, with header rows and colored cells
* Inline images, with resizing, justification options, captions, alt text, etc. options
* Embedded videos, like Loom and YouTube
* Embedded downloadable files
* Custom embeds, like Scribe and Arcade (or any site that supports embeds)
* PDFs, displayed in an inline viewer
* Mermaid diagrams, such as flowcharts and sequence diagrams, written in Mermaid syntax with a live preview. Diagrams also render in the chat widget.
* Custom HTML, rendered in the article
* Math equations in LaTeX: wrap an expression in `$$` for inline math, or put it on its own line wrapped in `$$$` for a block equation
* Emoji: type `:` followed by at least two letters to search
* [Synced blocks](/pylon-docs/knowledge-base/articles-and-collections/synced-blocks)
  * Re-usable blocks with content that stays in sync across articles
* Horizontal dividers
* Internal notes, special content that is only visible when your team member is viewing the article

While typing in a block, you can highlight text for options to edit that text's format within the block or add links. You can also press the `+` key to add a relative link to another article in your KB.


# Copilot

Use AI Assistant features to help streamline your knowledge curation.

### Article Generation

To make it easy to go from an issue resolution to a knowledge base article, Pylon allows you to generate an article directly from an issue.

Pylon's AI will read through the conversation and draft a knowledge base article documenting the solution. You can then make modifications to this article and immediately publish it!&#x20;

{% hint style="info" %}
If you have created [article templates](/pylon-docs/knowledge-base/articles-and-collections/templates), you can specify a template for the AI to follow when it's generating!
{% endhint %}

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Ffmm42ahMPiohETRwPTs7%2Farticle_generation.gif?alt=media&amp;token=0a8912e5-96bf-4499-872e-9b7a17e9a794" alt=""><figcaption></figcaption></figure>

### Similar Article Detection

When creating a new article in the knowledge base, Pylon will detect if there are any similar articles already present and warn you. This helps prevent the creation of duplicate content.

{% hint style="info" %}
Pylon can detect similar content even if the duplicate knowledge is outside of Pylon :exploding\_head:
{% endhint %}

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FCFKxsqdm98kvjcUIgMmh%2FCleanShot%202024-12-01%20at%2015.41.50.gif?alt=media&amp;token=aa503492-a5d0-48e1-9572-4339cc32ead0" alt=""><figcaption></figcaption></figure>

### Copilot

Highlight any text and press "Ask AI" to get help iterating on articles. This could include rewording sections, changing paragraph structure, revising tone, or anything else you can think of!

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FmjAJv6lfHJaMQvDrBoJs%2F%20kb-copilot.gif?alt=media&amp;token=53c07e40-7777-44df-96f7-77209a2858be" alt=""><figcaption></figcaption></figure>


# Templates

Create templates for common article formats

Article templates allow you to follow a standardized format in your knowledge base and make sure documentation writers are providing the required information when creating a new article. Templates include the same blocks and editing features available in the standard article editor.

## Templates

{% hint style="info" %}
Leave internal notes in article templates to provide guidance to the author on rules they should follow or considerations they should pay attention to.
{% endhint %}

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F2Z60PlgdFdV288zc5Dxd%2FCleanShot%202024-09-29%20at%2016.52.54.png?alt=media&amp;token=2610b0d6-9428-4c36-a5aa-3b7dc6618626" alt=""><figcaption></figcaption></figure>

## Creating an article from a template

When creating a new article, you can start from a template. You'll see all available templates on the bottom of the article creation page.&#x20;

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FOWwnYkrBSs7bt1kZPGb5%2FCleanShot%202024-09-29%20at%2016.51.30.png?alt=media&amp;token=f4325f1d-32f7-4dca-9321-ff886e5b8bd1" alt=""><figcaption></figcaption></figure>


# Collaboration

Work on knowledge base content together with your team

## Commenting

Leave Google-docs style comments on articles to leave or request feedback on content.

In comments you can:

* Use rich text like bolds, italics, links, code, etc.
* Add attachments like images
* Tag other users on your team (and they'll receive a notification!)
* React to comments with emojis

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FbqUCw48fwEa9EkIQ4OwN%2Fcomments-1-final.gif?alt=media&amp;token=1224f72f-1c64-4cc5-8cc3-f6ce6ca90149" alt=""><figcaption></figcaption></figure>

You can click on the comment icon at the top of the doc to view historical comments that were already resolved.

## Collaborative Editing

Work on articles together in real-time. You'll be able to see an indicator in the editor if your teammates are editing content at the same time as you.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FP6rRbOL1ZuWULytRnhDK%2FCleanShot%202024-10-10%20at%2018.40.47%402x.png?alt=media&amp;token=569b7ea6-5c4d-4f9d-9a1a-7a62bebfb188" alt=""><figcaption></figcaption></figure>


# Article Review

Request reviews on articles before publishing to ensure content quality and accuracy.

## Requesting a Review

When an article is ready for feedback, you can request a review from reviewers for the knowledge base. Reviewers can be added in **Review & Publish** in the Settings area of the KB. They will receive a notification when their review was requested and can approve the article or request changes.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fpwu4YDxuEitHbrklkiSV%2Fimage.png?alt=media&amp;token=2aaaeb46-d628-4b66-b722-f67db22debd9" alt=""><figcaption></figcaption></figure>

You can also add approved reviewers here and enforce review for your knowledge base.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FcWBccnAyJHtYICKUIxug%2FCleanShot%202026-04-13%20at%2014.30.04%402x.png?alt=media&amp;token=ad21669b-37c1-47fe-985d-e9b24e9d1e82" alt=""><figcaption></figcaption></figure>

You can request a review on a new draft or on changes to an already-published article. Click **Request Review** in the article header, or select articles in the article list and choose **Request Review** to request reviews in bulk. While a review is pending, the button changes to **Cancel Review Request**.

## Reviews queue

The **Reviews** page in the knowledge base sidebar lists every article awaiting review, with a count of pending reviews. Filter by **Review status** (**Needs review**, **Changes requested**, **Approved**), **Collection**, **Requested from**, and **Visibility**.

Select articles and click **Publish** to publish them together. Publishing requires **Publish articles** permission for those articles, whether or not you're a reviewer.

When **Require review before publishing** is on, a version must be approved before a non-reviewer can publish it. Reviewers with publishing permission can publish without waiting for approval. When the setting is off, a pending review doesn't prevent someone with publishing permission from publishing.

## Review Actions

Reviewers can take one of three actions:

* **Approve** — marks the article as approved and ready to publish
* **Request Changes** — sends the article back to the author for revisions
* **Comment** — leave inline comments on specific parts of the article for more detailed feedback

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FAZNfb1qiX6iExAk2Y9JU%2Fimage.png?alt=media&amp;token=6cdfa3c6-388c-4294-bff7-117ba1d15101" alt=""><figcaption></figcaption></figure>

## Highlight Mode

When a reviewer opens an article that needs review, they'll automatically enter highlight mode — a read-only view that shows exactly what changed:

* **Additions** are highlighted in green
* **Deletions** are shown in red with strikethrough

This makes it easy to scan what's new or modified without accidentally editing the article.

Reviewers can toggle between highlight mode and edit mode at any time using the button in the review banner. Highlight mode is read-only with diff highlighting, while edit mode gives full editing access to make changes directly.

## Comparing Versions

Use the **View changes from** dropdown in the editor header to choose which version to compare against. Options include the last published version, previously approved versions, and older drafts — each labeled with the date, author, and status.

## Previewing a Draft

Click **Preview** in the article header to see your unpublished draft on your live knowledge base site, with your theme applied. A banner reads **You are previewing an article.** Previews are only available to teammates signed in to Pylon and can't be shared with customers.


# Synced Blocks

Synced blocks let you reuse the same content across multiple knowledge base articles.

Synced blocks let you reuse the same content across multiple knowledge base articles. Edit the block once, and every article that embeds it updates automatically.

This is useful for content that appears in many articles, like disclaimers, prerequisites, or common troubleshooting steps.

## Embedding a Synced Block

1. In the article editor, type the forward slash key (`/`).
2. Select **Synced block** from the menu.
3. Search for the block by title and press Enter to embed it.

Only published synced blocks appear in the picker.

## Editing a Synced Block

Hover over the embedded block and click **Edit** in the toolbar. The block opens in its own editor, and saved changes apply to every article that embeds it.

## Unsyncing a Block

Hover over the block and click **Unsync** to convert it into static content in that article only. Other articles stay synced.

## Deleting a Synced Block

When you delete a synced block, you can either:

* **Desync**: inline the block's current content into every article that uses it, so the content stays put but is no longer synced.
* **Remove**: drop the content from all articles that embed it.

## Suggestions

The **Suggestions** tab on the **Synced blocks** page lists content that AI found repeated across your articles, with a proposal to turn it into a synced block.

* Open a suggestion to review each affected article, and **Approve** or **Reject** the change per article.
* Select suggestions to **Accept** or **Dismiss** them in bulk (up to 10 at a time).
* Click **Regenerate Suggestions** to scan your articles again.

## Translations

Synced blocks have their own translations. When an article is viewed in a translated language, the matching translation of the embedded block is shown, falling back to the default language if none exists.

{% hint style="info" %}
Use synced blocks for content over multiple articles you expect to change over time. For one-off copy, a regular paragraph is simpler to manage.
{% endhint %}


# Translations

Translate knowledge base articles, collections, and headers into your supported languages.

Publish your knowledge base in multiple languages. Pylon can translate articles with AI and keep them up to date, or you can write translations yourself.

## Before you start

Add the languages you want to support in **Settings > Workspace > Languages**. Every supported language is available to translate in every article. See [Languages & Localization](/pylon-docs/platform/languages-and-localization).

* You can add up to 20 languages besides your default. Unlimited languages are available on the Enterprise plan.
* AI translation (**Auto-translate**) is part of Pylon's AI Assistant features and is available on select plans. Contact your account team to learn more. Without it, you can still add and edit translations manually.

## Translate an article

1. Open the article and click **Translations** in the editor toolbar. The list shows each supported language and its status.
2. Choose a language. The translation opens side by side with the original.
3. Edit or review the translation, then publish it.

Translation statuses:

* **Not reviewed**: no translation has been created yet
* **Unpublished**: a translation exists but hasn't been published
* **Has changes**: the original has changed since this translation was published
* **Published**: the translation is live

### Auto-translate

Each translation has an **Auto-translate** switch in its header. When it's on, Pylon generates the translation with AI and the translation is read-only.

To edit a translation by hand, turn **Auto-translate** off. Turning it back on replaces your manual edits with a fresh AI translation.

### Keep translations up to date

When you change an article's title or content, its auto-translated versions are marked **Has changes**. They're regenerated from the latest original when you publish them. You can also choose **Regenerate translation** from the translation's **⋯** menu.

Translations you edit by hand aren't updated automatically. Review them yourself when the original changes.

### Publish translations in bulk

* To publish several languages of one article, use the article's **Publish** menu and select the languages.
* To publish translations across the whole knowledge base, click **Publish translations** on the article list, choose the languages, and click **Publish**.

## Collections and header

* **Collections**: a collection's **Name** and **Description** each have a field per supported language in the collection's **Settings**. Click the refresh icon next to a field to regenerate its translation.
* **Header**: translate the knowledge base header text in **General** settings, under **Header**.

[Synced blocks](/pylon-docs/knowledge-base/articles-and-collections/synced-blocks#translations) have their own translations.

## Glossary and do-not-translate terms

On **Settings > Workspace > Languages**, the **Custom translations** tab lets you set how specific strings are translated in each language, or set **Translate** to False to keep a term untranslated (for example, product names). Pylon applies these when it translates articles, synced blocks, collection titles and descriptions, and the knowledge base header.

## What customers see

* Visitors switch languages with the language picker (globe icon) in the knowledge base header. It appears once you support at least one additional language.
* Translated pages have their own URLs, prefixed with the language code, for example `/fr/articles/1234567890-reset-your-password`. Your default language has no prefix.
* Pages open in your default language unless the URL specifies another. The knowledge base doesn't detect the visitor's browser language.
* Your [sitemap](/pylon-docs/knowledge-base/seo-and-ai-crawlers#sitemap) lists each translated version of a page so search engines can index it.

## API

To read or update a specific translation through the API, pass `language` on the article endpoints. See the [Knowledge Base API reference](/pylon-docs/developer/api/api-reference/knowledge-base).


# Missing Content

Discover gaps in your documentation

Find the questions your documentation doesn't answer yet on the **Missing content** page, under **Insights** in the knowledge base sidebar. It has two tabs: **Topics** and **Issues**.

## Issues

Pylon helps enable you to run an effective "Knowledge-centered Support" or [KCS process](https://en.wikipedia.org/wiki/Knowledge-centered_support). When solving any issue, you can quickly mark it as needing an article from the Issue Sidebar by setting its **Resource status** to **Needs new article** or **Needs article update**.

Marked issues show up in a queue on the **Issues** tab. Select issues and choose **Generate article draft** to quickly create missing articles with [Copilot](/pylon-docs/knowledge-base/articles-and-collections/copilot#article-generation), or **Edit article status** once they're handled.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FyrQeuSQiUdkIgROs8m1o%2FScreenshot%202026-01-23%20at%203.17.36%E2%80%AFPM.png?alt=media&amp;token=3925069c-ba32-4129-b8a0-3911d4d9a32c" alt=""><figcaption></figcaption></figure>

## Topics

Pylon will autogenerate topics for common questions you receive that are not covered by your connected documentation. To help you target your efforts in the highest impact areas, AI will highlight the most common missing topics.

Each topic shows a **Resource status**: **Missing resources**, **Needs update**, or **Up to date**.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FkorrE19hM0g8742g9m7e%2FScreenshot%202026-01-23%20at%203.06.00%E2%80%AFPM.png?alt=media&amp;token=54198001-905a-49e4-97ff-2d9ca397caa4" alt=""><figcaption></figcaption></figure>

* Merge, delete, or edit topics to help improve the AI
* Use the shared context of all issues on a topic to create new articles with [Copilot](/pylon-docs/knowledge-base/articles-and-collections/copilot#article-generation)
* Click into a topic to browse the summary of the gap, resources, and issues associated with it

{% hint style="info" %}
Topics are part of Pylon's AI Assistant features and are available on select plans. Topic suggestions start once your workspace has logged 300 issues.
{% endhint %}

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FbrwkJeMiJRIv2eRnpHZA%2FScreenshot%202026-01-23%20at%203.14.17%E2%80%AFPM.png?alt=media&amp;token=d8a54ba0-d078-4390-9850-bd564aacf3a5" alt=""><figcaption></figcaption></figure>


# Analytics

See how your knowledge base is used, what customers search for, and how helpful articles are.

Knowledge base insights live in the **Insights** section of the knowledge base sidebar.

## Analytics

Open **Analytics** for a dashboard scoped to the current knowledge base. Data can be delayed by up to 15 minutes.

* **Customer analytics**: total views, average views per published article, views over time, and a per-article breakdown. Views are split into **Human views** and **Non-human views**.
* **Search insights**: searches with and without results, and the top queries in each group. Use **Top searches with no results** to find articles you still need to write.
* **Internal metrics**: articles created and published, by creator and by status, over time.

The main **Analytics** page also has a **Knowledge Base** tab, which includes **Helpfulness ratings & feedback** from article feedback.

### Human, bot, and AI crawler traffic

Pylon classifies each article view as **Human**, **Known Bot** (such as search engine crawlers), **AI Crawler** (such as GPTBot, ClaudeBot, and PerplexityBot), or **Unknown**. **Non-human views** combine Known Bot and AI Crawler views. Article view charts can be filtered by traffic type, for example to see how much of your traffic comes from AI tools.

### Article activity

Viewing analytics requires the analytics permission. Teammates without it see **Article activity** instead, which charts articles created and public articles updated.

## Performance

The **Performance** page has two tabs:

* **Feedback**: every feedback submission, with the article, score (from **Very unhelpful** to **Very helpful**), comment, and who submitted it. You can also open an article's feedback from its **⋯** menu.
* **Search**: every search query on your knowledge base, with the number of results. Filter to **Zero results** to find gaps in your content.

### Feedback notifications

To get notified when someone submits article feedback, click **Feedback Notifications** on the **Performance** page and turn on **Notify about knowledge base feedback submissions**. Choose any combination of:

* **Slack channels to notify**
* **Emails to notify**

Notification settings apply to the current knowledge base.


# Styling & Customization

Customize the look and feel of your knowledge base

## Styling

Customize your knowledge base on its **Styling** settings page. See the preview change in real time as you update your configuration.

On the **Styling** tab, you can set:

* **Logos**: **Header Logo**, **Header Logo on Dark** (used in dark mode), and **Footer Logo**. Header and footer logos default to your Brand center logos.
* **Favicon**: defaults to your Brand center square logo.
* **Banner**: a default, image, or color background, with dark or bright text.

On the **Links** tab, you can set:

* **Header Links**
* **Footer Page Links**, grouped into sections
* **Footer Social Media Links**

Your primary and link colors come from **Settings > Workspace > Brand center > Colors**.

If your theme doesn't use a setting, it's marked **Not used by this theme**.

## General settings

In the knowledge base's **General** settings, you can also set:

* **Title**: used as the page's HTML title
* **Header**: the text at the top of your homepage, with a translation for each supported language
* **Knowledge Base URL subdomain**
* **Open Graph Image**: used in social link previews
* **Chat widget app**: which chat widget appears on the knowledge base, if you have more than one

## Custom Domain

Within the **General** settings of your knowledge base, you can specify a custom domain for your knowledge base. Examples of a typical subdomain are `help.yourcompany.com` or `support.yourcompany.com`.

## Collection icons

Give each collection a system icon or upload your own in the collection's settings. See Collections.

## Custom Code

Inject custom scripts from the **Code** settings page, under **Head Scripts**. For example, add a script for Google Analytics to collect page views or a tracking pixel to collect intent data from visitors.

When one of your custom themes is live, its scripts are managed in the theme editor instead. See [Custom themes](/pylon-docs/knowledge-base/styling-and-customization/custom-themes#scripts).

## Custom themes

Custom themes are available on the Enterprise plan. Manage them on the **Theme** tab of your knowledge base's **Styling** settings page.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FPsAufQkKZ42LBJTkUYBp%2FCleanShot%202026-05-12%20at%2014.59.07%402x.png?alt=media&amp;token=cadbc072-7154-4fe2-893f-04c0babffa9e" alt="" width="353"><figcaption></figcaption></figure>

Use a preset (**Default**, **Sidebar**, or **Glass**) from the **Theme library** as-is, or duplicate one to edit its layouts, `styles.css`, and scripts in the code editor. Edits are saved as drafts that you preview and publish. When Pylon updates a preset you've customized, you can review the changes and merge them.

See [Custom themes](/pylon-docs/knowledge-base/styling-and-customization/custom-themes) for the theme files, template variables, CSS selectors, scripts, and publishing.

## What visitors see

Built-in themes include:

* A **table of contents** for articles with more than one heading
* Up to five **related articles** at the end of each article
* **Popular articles** on the homepage
* **Tags** on each article, linking to search results for that tag
* A language picker when you support more than one language

When a teammate is signed in to Pylon, articles also show up to three related closed issues, labeled **Internal Only**. Customers never see these.

When a customer is logged into your knowledge base, the chat widget identifies them automatically, so they don't have to enter their name or email.

Custom themes can also link to the previous and next article in a collection.

## SEO

All public articles in your knowledge base are automatically made SEO friendly and indexable by search engines and AI crawlers. See SEO & AI Crawlers.


# Custom themes

Build your own knowledge base layouts with templates, CSS, and scripts, then preview and publish them.

Custom themes give you full control over your knowledge base's HTML, CSS, and scripts. Pylon fills your templates with your content, styling settings, and navigation. Your search, sign-in, and article features keep working.

Custom themes are available on the Enterprise plan. Manage them on your knowledge base's **Styling** settings page, on the **Theme** tab.

## Get started

* **Use a preset as-is**: under **Theme library**, click **Use Theme** on **Default**, **Sidebar**, or **Glass**. Presets update automatically when Pylon improves them, but you can't edit their code.
* **Customize a preset**: click **Duplicate** on a preset. The copy appears under **My themes**, where you can edit it.
* **Start from scratch**: under **My themes**, click **Create theme** (**Start with default styles**). This creates an editable copy of the Default preset.

From a theme's menu under **My themes** you can **Preview**, **Edit** (rename), **Duplicate**, or **Delete** it. You can't delete the theme that's live. Click **Use Theme** to make a theme live. Visitors see its published version.

## Theme files

Click a theme under **My themes** to open the code editor. The sidebar groups the files you can edit:

| Folder     | File            | What it controls                                                  |
| ---------- | --------------- | ----------------------------------------------------------------- |
| Layouts    | **homepage**    | The knowledge base homepage                                       |
| Layouts    | **collections** | Collection pages                                                  |
| Layouts    | **articles**    | Article pages                                                     |
| Navigation | **navbar**      | The header. Include it in a layout with `{{template "header" .}}` |
| Navigation | **footer**      | The footer. Include it in a layout with `{{template "footer" .}}` |
| Styling    | **styles.css**  | The stylesheet for every page                                     |
| Scripts    | **scripts**     | HTML added to the `<head>` of every page                          |

Layouts only render the page body. Pylon generates the rest of the `<head>` for you: the page title, SEO and social tags, canonical and language links, and the favicon.

The 404 page uses Pylon's built-in layout. It still includes your navbar, footer, and `styles.css`.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F5M8hEnJBgBVKe2WqCkQk%2FCleanShot%202026-05-12%20at%2015.00.16%402x.png?alt=media&amp;token=153f394a-86da-4a42-ac37-639a45314a45" alt="The theme code editor with the homepage layout open"><figcaption></figcaption></figure>

## Template syntax

Layouts, the navbar, and the footer use [Go HTML templates](https://pkg.go.dev/html/template). The editor autocompletes variables and keywords, and it flags errors as you type, such as an unclosed `{{if}}` or a variable that doesn't exist in that file.

| Syntax                                                        | Use                                                                           |
| ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
| `{{.KB.Title}}`                                               | Print a value                                                                 |
| `{{if .Tags}}…{{else}}…{{end}}`                               | Conditional                                                                   |
| `{{range .Articles}}<a href="{{.URL}}">{{.Title}}</a>{{end}}` | Loop over a list. Inside the loop, `.` is the current item                    |
| `{{with .PreviousArticle}}…{{end}}`                           | Use a value only if it exists. Inside the block, `.` is that value            |
| `{{template "header" .}}`, `{{template "footer" .}}`          | Insert the navbar or footer                                                   |
| `{{if eq .A .B}}`, `ne`, `not`, `and`, `or`                   | Comparisons and logic. Standard built-ins such as `len` and `index` also work |
| `{{$.KB.Title}}`                                              | Reach page-level data from inside a `range` or `with` block                   |
| `{{- … -}}`                                                   | Trim whitespace around a tag                                                  |
| `{{t "Popular Articles"}}`                                    | Translate fixed text (see below)                                              |

### Escaping

Values are escaped automatically for the context they appear in, such as HTML text, attributes, URLs, inline styles, or inline scripts. Values listed as **HTML** in the tables below (article bodies and icons) are output as markup. If a URL value isn't safe, it renders as `#ZgotmplZ`.

### Translating fixed text

Wrap fixed text in `t` with a double-quoted string, for example `{{t "Related Articles"}}`. Pylon collects these strings from your live, published theme. When a translation exists, visitors who browse in another language see it. Otherwise they see your original text. Titles, descriptions, and URLs from the variables below are already localized for the visitor's language.

## Template variables

Variables only include content the current visitor is allowed to see.

### Available in every file

These work in all layouts, the navbar, and the footer.

| Variable               | Type                                       | Description                                         |
| ---------------------- | ------------------------------------------ | --------------------------------------------------- |
| `.KB.Title`            | Text                                       | Knowledge base title                                |
| `.KB.Slug`             | Text                                       | Knowledge base URL slug                             |
| `.KB.LogoURL`          | Text                                       | **Header Logo** image URL                           |
| `.KB.LogoDarkURL`      | Text                                       | **Header Logo on Dark** image URL                   |
| `.KB.Header`           | Text                                       | Homepage header text                                |
| `.KB.TextLinkColorHex` | Text                                       | Text link color hex code, for example `#2563eb`     |
| `.KB.Links`            | List of [links](#link)                     | **Header Links**                                    |
| `.Org.Name`            | Text                                       | Your organization's name                            |
| `.Org.BrandColorHex`   | Text                                       | Primary brand color hex code, for example `#4F46E5` |
| `.Footer.LogoURL`      | Text                                       | **Footer Logo** image URL                           |
| `.Footer.Sections`     | List of [footer sections](#footer-section) | **Footer Page Links**                               |
| `.Footer.SocialLinks`  | List of [links](#link)                     | **Footer Social Media Links**                       |
| `.Collections`         | List of [collections](#collection)         | Top-level collections, for navigation               |
| `.CurrentPath`         | Text                                       | Current page URL path                               |
| `.PageType`            | Text                                       | `homepage`, `collection`, or `article`              |
| `.FaviconURL`          | Text                                       | Favicon image URL                                   |

### homepage

| Variable           | Type                         | Description                                                   |
| ------------------ | ---------------------------- | ------------------------------------------------------------- |
| `.PopularArticles` | List of [articles](#article) | Most-viewed articles                                          |
| `.BackgroundType`  | Text                         | Banner background: `color`, `image`, or empty for the default |
| `.BannerColorHex`  | Text                         | Banner background color hex code                              |
| `.BannerImageURL`  | Text                         | Banner background image URL                                   |
| `.DarkText`        | True/false                   | Whether banner text should be dark (true) or light (false)    |

### collections

| Variable                       | Type                               | Description                                                                             |
| ------------------------------ | ---------------------------------- | --------------------------------------------------------------------------------------- |
| `.Collection`                  | [Collection](#collection)          | The current collection                                                                  |
| `.Articles`                    | List of [articles](#article)       | Articles in this collection                                                             |
| `.Subcollections`              | List of [collections](#collection) | Child collections                                                                       |
| `.Breadcrumbs`                 | List of [breadcrumbs](#breadcrumb) | Breadcrumb trail                                                                        |
| `.ActiveTopLevelCollectionURL` | Text                               | URL of the top-level collection this page belongs to, for highlighting it in navigation |

### articles

| Variable           | Type                                     | Description                                                         |
| ------------------ | ---------------------------------------- | ------------------------------------------------------------------- |
| `.Article`         | [Article details](#article-details)      | The current article                                                 |
| `.ArticleHTML`     | HTML                                     | The rendered article body                                           |
| `.Tags`            | List of [tags](#tag)                     | Tags on this article                                                |
| `.Collection`      | [Collection](#collection)                | Parent collection. May be empty                                     |
| `.RelatedArticles` | List of [articles](#article)             | Related articles                                                    |
| `.SectionArticles` | List of [articles](#article)             | All articles in the same collection                                 |
| `.PreviousArticle` | [Article](#article)                      | Previous article in the same collection. Empty on the first article |
| `.NextArticle`     | [Article](#article)                      | Next article in the same collection. Empty on the last article      |
| `.Breadcrumbs`     | List of [breadcrumbs](#breadcrumb)       | Breadcrumb trail                                                    |
| `.TOC`             | List of [headings](#heading)             | Table of contents built from the article's headings                 |
| `.RelatedIssues`   | List of [related issues](#related-issue) | Related closed issues. Only filled in for signed-in team members    |

### Fields on list items and objects

#### Link

| Field       | Type | Description                |
| ----------- | ---- | -------------------------- |
| `.Label`    | Text | Link text                  |
| `.URL`      | Text | Link URL                   |
| `.IconHTML` | HTML | Icon SVG, for social links |

#### Footer section

| Field    | Type                   | Description           |
| -------- | ---------------------- | --------------------- |
| `.Title` | Text                   | Section heading       |
| `.Links` | List of [links](#link) | Links in this section |

#### Collection

| Field            | Type                         | Description                                                                 |
| ---------------- | ---------------------------- | --------------------------------------------------------------------------- |
| `.Title`         | Text                         | Collection title                                                            |
| `.Slug`          | Text                         | Collection URL slug                                                         |
| `.Identifier`    | Text                         | Collection identifier                                                       |
| `.Description`   | Text                         | Collection description                                                      |
| `.Icon`          | HTML                         | System icon SVG. Empty when a custom icon is set                            |
| `.CustomIconURL` | Text                         | Uploaded icon image URL. Empty when a system icon is used                   |
| `.ArticleCount`  | Number                       | Number of articles in the collection                                        |
| `.URL`           | Text                         | Collection page URL                                                         |
| `.Articles`      | List of [articles](#article) | Articles in the collection. Filled in on subcollections on collection pages |
| `.Children`      | List of collections          | Child collections. Filled in on navigation collections on collection pages  |

#### Article

| Field    | Type | Description      |
| -------- | ---- | ---------------- |
| `.Title` | Text | Article title    |
| `.Slug`  | Text | Article URL slug |
| `.URL`   | Text | Article page URL |

#### Article details

| Field                 | Type       | Description                                                                                      |
| --------------------- | ---------- | ------------------------------------------------------------------------------------------------ |
| `.Title`              | Text       | Article title                                                                                    |
| `.Slug`               | Text       | Article URL slug                                                                                 |
| `.Identifier`         | Text       | Article identifier                                                                               |
| `.AuthorName`         | Text       | Author name. Empty when there's no author                                                        |
| `.AuthorAvatarURL`    | Text       | Author avatar image URL. Empty when unavailable                                                  |
| `.LastUpdatedDisplay` | Text       | Human-readable last updated time                                                                 |
| `.URL`                | Text       | Article page URL                                                                                 |
| `.Hidden`             | True/false | Whether the article is **Direct link only**                                                      |
| `.Visibility`         | Text       | Empty for public, or `contact_only` (customers only), `user_only` (internal), or `ai_agent_only` |

#### Tag

| Field       | Type | Description                              |
| ----------- | ---- | ---------------------------------------- |
| `.Value`    | Text | Tag label                                |
| `.URL`      | Text | Search results URL for this tag          |
| `.HexColor` | Text | The tag's color hex code                 |
| `.Color`    | Text | Color name used by the preset tag styles |

#### Breadcrumb

| Field    | Type | Description                          |
| -------- | ---- | ------------------------------------ |
| `.Title` | Text | Breadcrumb label                     |
| `.URL`   | Text | Link URL. Empty for the current page |

#### Heading

| Field    | Type   | Description                              |
| -------- | ------ | ---------------------------------------- |
| `.ID`    | Text   | Heading anchor ID, for `href="#{{.ID}}"` |
| `.Title` | Text   | Heading text                             |
| `.Level` | Number | Heading level, 1 to 3                    |

#### Related issue

| Field                 | Type   | Description                                                 |
| --------------------- | ------ | ----------------------------------------------------------- |
| `.AccountName`        | Text   | Account name                                                |
| `.AccountLogoURL`     | Text   | Account logo image URL                                      |
| `.RequesterName`      | Text   | Requester name                                              |
| `.RequesterAvatarURL` | Text   | Requester avatar image URL                                  |
| `.TicketNumber`       | Number | Issue number                                                |
| `.Title`              | Text   | Issue title                                                 |
| `.BodyPreview`        | Text   | Shortened issue body                                        |
| `.Source`             | Text   | Issue source, such as `email`, `form`, `manual`, or `slack` |
| `.ClosedDateDisplay`  | Text   | Human-readable closed date                                  |
| `.ViewAllURL`         | Text   | Link to all related issues in Pylon                         |

### Functions

These functions work in every template file. They return nothing if the item doesn't exist or the visitor can't see it, so wrap them in `with` or `range`.

| Function                          | Returns                                                                          | Example                                                                             |
| --------------------------------- | -------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| `collection "identifier"`         | A [collection](#collection): title, slug, identifier, description, icon, and URL | `{{with collection "identifier"}}<a href="{{.URL}}">{{.Title}}</a>{{end}}`          |
| `collectionChildren "identifier"` | A list of that collection's child collections                                    | `{{range collectionChildren "identifier"}}<a href="{{.URL}}">{{.Title}}</a>{{end}}` |
| `article "identifier"`            | An [article](#article)                                                           | `{{with article "identifier"}}<a href="{{.URL}}">{{.Title}}</a>{{end}}`             |

When you type `collection "`, the editor suggests your collections and their identifiers. An article's identifier is the number at the start of its URL: `/articles/<identifier>-<slug>`.

## Interactive components

Pylon adds its interactive features to elements with these IDs. Keep the ones you need in your layouts. If you remove one, that feature doesn't appear.

| Element                              | Feature                                                                                  |
| ------------------------------------ | ---------------------------------------------------------------------------------------- |
| `<div id="kb-search"></div>`         | Search box                                                                               |
| `<div id="kb-search-results"></div>` | Search results and AI answers. Shown while a visitor searches                            |
| `<div id="kb-auth"></div>`           | Sign-in button and account menu                                                          |
| `<div id="kb-locale"></div>`         | Language picker                                                                          |
| `<div id="kb-article-body"></div>`   | Interactive article body, such as code copy buttons, tabs, accordions, and heading links |
| `<div id="kb-toc"></div>`            | Table of contents with scroll tracking                                                   |
| `<div id="kb-feedback"></div>`       | Article feedback                                                                         |
| `<span id="kb-article-edit"></span>` | **Edit in Pylon** link for signed-in team members                                        |

While a visitor is searching, Pylon hides the element with class `kb-homepage-content`, `kb-collection-page-content`, `kb-article-page-content`, or `kb-not-found-message`. It also sets `data-kb-state="searching"` on `.kb-banner` (otherwise `idle`). Keep these class names so search results replace the page content.

On article pages, the presets output `{{.ArticleHTML}}` inside `.kb-article-body-placeholder` next to a `.kb-article-body-skeleton` and `#kb-article-body`. The article is readable right away, and Pylon swaps in the interactive version when it loads. Keep this structure from the preset when you restyle articles.

## styles.css

`styles.css` is loaded on every page as a regular stylesheet, before Pylon's own component styles. Pylon serves it exactly as you write it, with no sanitization or rewriting. Any valid CSS works, including `@import`, `@font-face`, media queries, and custom properties. There's no restriction on which selectors you can target, and you can load fonts and images from any domain.

### Selectors to target

The presets use `kb-` class names you can style directly. Common ones:

| Area                                | Classes                                                                                                                                                                                     |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Page                                | `.kb-page-layout`, `.kb-content-wrapper`, `.kb-content`                                                                                                                                     |
| Header                              | `.kb-header`, `.kb-header-inner`, `.kb-header-logo`, `.kb-header-nav`, `.kb-header-link`, `.kb-header-mobile-nav`                                                                           |
| Homepage banner                     | `.kb-banner`, `.kb-banner--dark-text`, `.kb-banner--light-text`, `.kb-banner-bg`, `.kb-banner-content`, `.kb-banner-title`, `.kb-search-container`                                          |
| Collection cards                    | `.kb-collections-grid`, `.kb-collection-card`, `.kb-collection-card-icon`, `.kb-collection-card-title`, `.kb-collection-card-description`, `.kb-collection-card-count`                      |
| Article lists                       | `.kb-article-card`, `.kb-article-card-title`, `.kb-popular-articles`                                                                                                                        |
| Collection page                     | `.kb-collection-page-header`, `.kb-collection-page-title`, `.kb-collection-page-description`, `.kb-breadcrumbs`                                                                             |
| Article page                        | `.kb-article-layout`, `.kb-article-main`, `.kb-article-sidebar`, `.kb-article-title`, `.kb-article-meta`, `.kb-article-body`, `.kb-related-articles`, `.kb-article-tags`, `.kb-article-tag` |
| Article content                     | Element selectors inside `.kb-article-body`, such as `.kb-article-body h2`, `.kb-article-body p`, `.kb-article-body pre`, `.kb-article-body table`, and `.kb-article-body .EditorCallout`   |
| Search, sign-in, language, feedback | `.kb-search-*`, `.kb-auth-*`, `.kb-locale-*`, `.kb-feedback-*`, `.kb-toc-item`                                                                                                              |
| Footer                              | `.kb-footer`, `.kb-footer-section`, `.kb-footer-section-link`, `.kb-footer-social-link`, `.kb-powered-by`                                                                                   |

The **Sidebar** and **Glass** presets add their own `kb-sidebar-*` and `kb-glass-*` layout classes.

### Typography and colors

The presets read these CSS variables from `:root`:

* `--body-font-family` and `--headlines-font-family`
* `--primaryColor` and `--text-link-color`. The preset navbar sets these from your brand colors.
* `--neutral-*` shades for text, borders, and backgrounds

If you've set fonts in **Settings > Workspace > Brand center > Typography**, Pylon sets `--body-font-family` and `--headlines-font-family` after your stylesheet loads, so the brand fonts win. To use a different font, set `font-family` on your own selectors instead of overriding those variables.

## Scripts

The **scripts** file is HTML that Pylon adds as-is at the end of every page's `<head>`. Use it for `<script>` tags (analytics, tracking pixels), `<link>` tags (web fonts), `<meta>` tags, or `<style>` blocks. Scripts aren't sanitized, and pages don't restrict which domains they load from.

How it relates to **Head Scripts** on the knowledge base's **Code** settings page:

* When one of your themes under **My themes** is live, Pylon uses that theme's **scripts** file and ignores **Head Scripts**. The **Code** page becomes read-only and links to the theme editor. A new theme's scripts file starts empty, so copy over anything you still need.
* When a **Theme library** preset is live, Pylon uses **Head Scripts** from the **Code** page.

The appearance preview on the **Styling** tab doesn't run scripts. Use **Preview** to test them.

## What's sanitized

* **Your theme files** aren't sanitized. Templates, CSS, and scripts are output as you write them, with template values escaped automatically.
* **Article content** is sanitized before it reaches `{{.ArticleHTML}}`. Scripts and event handlers are removed. Custom HTML blocks are stricter: forms, buttons, iframes, video, SVG, and `<style>` tags are removed, and inline styles can't use `url()`, `var()`, or image functions. To add behavior or styles to article pages, use your theme files.

## Draft, preview, and publish

* **Drafts**: edits save automatically as a draft. The editor header shows **Draft** or **Published**. Changed files are marked with a dot in the sidebar.
* **Undo Changes** discards the draft for the open file.
* **Preview** opens your knowledge base in a new tab with your drafts applied and a **Draft Preview** banner. Click **Exit** to leave. Preview pages aren't indexed by search engines, and a preview session lasts up to an hour.
* **Publish** lists the files you've changed. Click **Publish All** to publish them together, or undo a single file from the list. Visitors see the changes right away if the theme is live.
* **Template errors block publishing.** The **Publish** menu lists each error by file and line under **Fix these template errors before publishing:**.

{% hint style="warning" %}
If a published layout fails to render, or takes longer than 5 seconds, visitors see that page in the Default theme instead. In **Preview**, you see the error message so you can fix it.
{% endhint %}

There's no fixed size limit for theme files. Because `styles.css` and scripts load on every page, keep them lean.

You can also use Ask AI while the editor is open. Its edits are saved as drafts for you to review and publish. All theme edits and publishes are recorded in your workspace's audit logs.

## Preset updates

Themes you duplicated from a preset, or created with **Create theme**, keep track of the preset they came from. When Pylon releases a new version of that preset, your theme shows **Base update available**.

1. Click the badge to read the **Release notes** and see the **Files in this update**. Files that conflict with your edits are marked **Needs attention**.
2. Click **Create Update Draft**. First publish or discard any existing changes. Pylon merges the update into your theme as a draft. Only files that are part of the update can be edited while the draft is open.
3. Preview the draft, then click **Review & Publish** and **Publish Update**. To skip it, click **Discard Update**. Update files are published or discarded together.

Presets you use directly from the **Theme library** always run the latest version, so there's nothing to merge.


# Custom Authentication

Add unified sign-in between the customer portal and your product dashboard

By default, authentication for your customers to access gated content in your knowledge base is handled via a one-time passcode sent to their email on login.&#x20;

Using Customer Authentication, you can instead implement unified login across the knowledge base and your web application. This means when customers are logged in to your dashboard, they'll also seamlessly be logged into your Pylon knowledge base (and customer portal).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FUPTqABB3Y0rfkvzyYJKK%2Fimage.png?alt=media&amp;token=f6c9f106-2a28-461a-9e2e-48578988099f" alt=""><figcaption></figcaption></figure>

For more details on how to implement this, view the [setup guide](https://support.usepylon.com/articles/5661240375-customer-authentication-methods) in our help center.


# Search

Allow your team and users to search for knowledge

Customers can search for answers to their questions directly in the knowledge base. Searches from visitors who aren't logged in cover articles marked **Public**. Searches from logged-in customers also cover **Customer** articles whose filters they match.

Your team, when logged into Pylon, can also find [articles marked](/pylon-docs/knowledge-base/articles-and-collections#visibility) **Internal** and **Direct link only** articles through search.

Article titles, content, and [tags](/pylon-docs/knowledge-base/articles-and-collections#tags) are all searchable.

{% hint style="info" %}
On the **Performance** page of your knowledge base, the **Search** tab lists every search query and how many results it returned. Filter to **Zero results** to see what documentation to write next. See [Analytics](/pylon-docs/knowledge-base/analytics).
{% endhint %}

## **Federated Search**

If you've added external websites, such as your documentation site, as [Training Data](/pylon-docs/platform/training-data), knowledge base search is **federated** across them. Results from those sites appear alongside your articles.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FaZYKOkF2WYpKZaR0zXuj%2FCleanShot%202024-11-09%20at%2016.54.27.png?alt=media&amp;token=816f7b06-528a-45c9-a70f-1ff14f4a0635" alt=""><figcaption><p>A search query with results from the knowledge base, documentation site, and marketing page.</p></figcaption></figure>

### Searchable domains

Choose which external sites appear in search results on your knowledge base's **Settings > Searchable domains** page. Turn **Include in search** on or off for each site. This applies to every knowledge base in your workspace. Click **Edit resources** to add or remove sites.

## Searching as a team member

Your team can search for knowledge base articles using [Command Search](/pylon-docs/platform/command-search) or from the issue detail view directly by clicking on the knowledge base icon in the sidebar of an issue.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FCOOF9Zg64Bzaor6ApQbS%2FScreenshot%202025-03-26%20at%208.43.34%E2%80%AFPM.png?alt=media&amp;token=b53c3e06-4687-4a19-80c4-f764216f7b4b" alt=""><figcaption></figcaption></figure>

## AI Search

When your customer asks a question in the knowledge base search, Pylon's AI attempts to answer it directly at the top of the results under **Ask AI**, citing its sources. Customers can mark the answer **Helpful** or **Not helpful**.

AI answers also appear when customers search the knowledge base from the [chat widget](/pylon-docs/chat-widget/overview), in the customer's language. Widget search results include both your articles and pages from your searchable domains.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FNyWvLiLBDKvrQoZVqHbT%2FCleanShot%202025-06-06%20at%2021.14.50.gif?alt=media&amp;token=634d52c1-1579-4705-9f05-33dd4ecd4fbf" alt=""><figcaption></figcaption></figure>


# Redirects

Keep old links working when you move to Pylon or reorganize your knowledge base.

## Page redirects

Use page redirects to send old URLs, such as links from your previous help center, to pages in your Pylon knowledge base. Redirects are permanent (301), so search engines transfer the old page's ranking to the new one.

To create a redirect:

1. In your knowledge base, go to **Settings > Page redirects**.
2. Click **Create Redirect**.
3. Under **Redirect to**, choose the **Homepage**, an article, or a collection.
4. Enter the **Original URL** as a relative path, for example `/hc/en-us/articles/360012345678-reset-password`.
5. Optionally choose a **Language** to open the destination in that translation.

Click **Export to CSV** to download all of your redirects.

Knowledge base admins can manage redirects. To create redirects in bulk, use the [Knowledge Base API](/pylon-docs/developer/api/api-reference/knowledge-base).

## Migrating from Zendesk

Zendesk Help Center URLs start with `/hc/{locale}/articles/`. Create a page redirect for each old article URL you want to keep, since Zendesk article IDs don't match Pylon's.

Any `/hc/{locale}/articles/...` URL without a matching redirect is sent to the same path under `/articles/` on your knowledge base.

## Stable article URLs

Article URLs include a numeric ID followed by the slug, for example `/articles/1234567890-reset-your-password`. Pylon finds the article by its ID, so links keep working after you rename an article or change its slug. Old URLs load the article and point search engines to the current URL.

You don't need a redirect when you rename an article or move it to another collection.


# SEO & AI Crawlers

How Pylon makes your public knowledge base discoverable by search engines and AI tools.

Pylon publishes the files search engines and AI tools need to find and read your public articles. There's nothing to set up.

## What gets indexed

Only published, **Public** articles and collections are included. Customer, Internal, and **Direct link only** articles are left out. If your knowledge base's default visibility isn't **Public**, the homepage is left out too.

Once your [custom domain](/pylon-docs/knowledge-base/styling-and-customization#custom-domain) is verified, the default Pylon-hosted address tells search engines not to index it, so your custom domain gets the search ranking.

## Sitemap

Your sitemap is at `/sitemap.xml`. It lists your public homepage, collections, and articles, with the last-updated date for each. For each translated page, it also lists the other languages that page is published in, so search engines can show visitors the right [translation](/pylon-docs/knowledge-base/translations). Large knowledge bases are split into several sitemap files automatically.

## robots.txt

`/robots.txt` points crawlers to your sitemap. It allows major search engines (such as Google, Bing, and DuckDuckGo) and AI crawlers (such as GPTBot, ClaudeBot, and PerplexityBot), and blocks other crawlers.

## llms.txt

`/llms.txt` gives AI tools a Markdown index of your public articles: your knowledge base title, then each collection with links to its articles. It covers your default language.

## Pages for crawlers

Search engines, social link previews, and AI crawlers receive a fully rendered HTML version of each article, collection, and homepage, so they can read your content without running JavaScript.

## Social previews

Upload an **Open Graph Image** in **General** settings to use in link previews on social media and chat apps. If you don't set one, your knowledge base logo is used.

To see how much of your traffic comes from bots and AI crawlers, see [Analytics](/pylon-docs/knowledge-base/analytics#human-bot-and-ai-crawler-traffic).


# Overview

A dedicated place for customers to view and submit tickets.

The customer portal gives each customer account a branded place to:

* View, search, and reply to their tickets from every channel, and submit new ones through ticket forms.
* Follow projects and tasks you share with them.
* See feature requests linked to their account and notebooks you share.
* Manage which teammates have access.

The customer portal is available on select plans. Contact your account team to enable it. Configure it under **Settings > Customers > Customer portal**.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F9QtDFwjSiu9LCpDh9ADG%2FCleanShot%202024-10-19%20at%2021.17.35%402x.png?alt=media&amp;token=3849c74b-045e-42ae-a194-81e731a8462d" alt=""><figcaption></figcaption></figure>

{% content-ref url="/pages/RyCNsz3SZtpMKXVHH9ze" %}
[Styling & Customization](/pylon-docs/customer-portal/styling-and-customization)
{% endcontent-ref %}

{% content-ref url="/pages/fTP3pDCH8xxr3VTWxADy" %}
[Access Control](/pylon-docs/customer-portal/access-control)
{% endcontent-ref %}

{% content-ref url="/pages/0DEMks0S9HDfXodOxzQ0" %}
[Portal Experience](/pylon-docs/customer-portal/portal-experience)
{% endcontent-ref %}

{% content-ref url="/pages/6A2YwYzQZElwJdRTYwHo" %}
[Custom Authentication](/pylon-docs/customer-portal/custom-authentication)
{% endcontent-ref %}


# Styling & Customization

Customize the look, settings, and content of your customer portal

Portal settings live under [**Settings > Customers > Customer portal**](https://app.usepylon.com/customer-portal?page=general), split into these pages:

* **General**: access, invitations, authentication, and custom domains
* **Styling**: logos
* **Links**: header logo link, header links, and footer links
* **Ticket forms**: which forms customers can submit
* **Tabs**: per-tab settings for **Issues**, **Projects & tasks**, and **Feature requests**

## Styling

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FpSkCztimU7GNAgXcYtoU%2FCleanShot%202024-10-19%20at%2021.38.15%402x.png?alt=media&amp;token=faf7c373-ac09-4ba3-98f4-0872b83f9968" alt=""><figcaption></figcaption></figure>

* **Header Logo** and **Footer Logo**, each with a light mode and dark mode version. Empty logos fall back to the logos in **Settings > Workspace > Brand center**.
* Brand colors come from your Brand center.

Customers can switch the portal between light and dark mode.

## Links

* **Header Logo Link**: the URL your header logo opens. Leave it empty to keep the logo unclickable.
* **Header Links**: links shown in the portal header.
* **Footer Links**: links grouped into footer sections.

## General settings

| Setting                        | What it does                                                                                                                                                      |
| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Portal access                  | Turns the portal on or off. When off, all customer portal links are hidden and disabled.                                                                          |
| Default portal role            | The role new contacts get. See [Access Control](/pylon-docs/customer-portal/access-control#default-role-for-new-contacts).                                        |
| Support reply identity         | Show your team's replies under the **Original sender** or a workspace alias. Manage aliases in **Settings > Workspace > Workspace**.                              |
| Auto-create contacts on login  | Creates a contact the first time someone logs in. With email login, the person's domain must match an existing account.                                           |
| Allow portal users to edit CCs | Lets customers add or remove CC recipients when replying to email tickets. Off by default.                                                                        |
| Automatic invitation email     | Emails new contacts an invitation to the portal. No email is sent when the default role is No Access. When off, share the portal link yourself.                   |
| Invitation email sender        | Which email app sends invitations. Only email apps with a custom outgoing domain are listed. Defaults to a Pylon address.                                         |
| Enable chat widget             | Shows your [chat widget](/pylon-docs/chat-widget/overview) in the portal. If you have more than one widget, pick it with **Chat Widget App**.                     |
| Portal Authentication          | Email passcode or your own login. Set it in **Settings > Workspace > Workspace**; see [Custom Authentication](/pylon-docs/customer-portal/custom-authentication). |

You can also use the API to create customer users and grant access to the portal as part of your user provisioning process.

### Custom Domains

Host your customer portal on a custom branded domain, allowing a fully white-labeled experience for your customers.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FreaAgD1Ds55cxGEZHSMW%2Fcustom%20domain.avif?alt=media&amp;token=f570ba1a-2f16-4e74-9c37-a103a9b34995" alt="" width="563"><figcaption></figcaption></figure>

You can add up to five custom domains. Add the DNS records Pylon shows for each domain to verify it.

One domain is the **Primary domain**, used in emails and other links Pylon generates. Use **Make Primary Domain** to change it. If the primary domain isn't verified yet, links keep using your Pylon-hosted portal URL and switch over automatically once verification completes.

## Tabs

Each tab page has a **Tab visibility** switch. **Issues** and **Projects & tasks** are on by default; **Feature requests** is off by default and appears only when Feature Requests is enabled for your workspace. Projects & tasks and Feature requests are hidden in the portal when nothing in them is visible to the customer.

#### Fields

Choose which fields on your tickets, tasks, and feature requests are visible to customers. For example, surface a Priority or Question Type field that users can view and modify.

* **Issues** tab: under **Issues fields**, click **Add Field** and pick a custom field, then choose **Can view** or **Can edit**. Issue fields appear both in the portal's issues table and within each issue.
* **Projects & tasks** tab: for each task field, choose **Customer Can View** or **Customer Can Edit**.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FDV31kytljrZqzUffW1vp%2Fimage.png?alt=media&amp;token=7c6ed8fb-e6b5-4814-ad78-46228f87b038" alt="" width="375"><figcaption></figcaption></figure>

**Visibility conditions**

To show an issue custom field only to some customers, click the eye icon (**Add visibility conditions**) next to the field, then click **Add Condition**. Conditions can use:

* Account properties: **Account**, **Account Owner**, **Parent Account**, **Account Tags**, **Pylon Account Type**, **Creation Source**, **External Channels**, **Primary External Channel**, **External Channel Type**, and **Account Slack Channel**
* Account custom fields
* Issue custom fields

Customers on issues that don't match the conditions don't see the field at all, in the issues table or on the issue. Native fields such as **Last Message At** can't have visibility conditions.

To check what a customer will see, use **Preview as** above the portal preview and select an account. Some fields may still vary by issue, for example when a condition uses an issue field.

On the **Feature requests** tab you can also turn on **Show descriptions in the feature request sidebar**.

#### Customer-facing Status Labels

For configured custom Issue and Task statuses in Pylon, you can also define corresponding customer-facing status labels.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FEmBRXWSimO6WI8vkVU1l%2Fimage.png?alt=media&amp;token=575898ae-480d-4535-82d6-5a9f71a856ab" alt="" width="375"><figcaption></figcaption></figure>

Status label mappings are available for Issues, Tasks, and Feature Requests, each configured from its own tab page ([Issues](https://app.usepylon.com/customer-portal/tabs?type=issues), [Projects & tasks](https://app.usepylon.com/customer-portal/tabs?type=projects_tasks), [Feature requests](https://app.usepylon.com/customer-portal/tabs?type=feature_requests)).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FNyyErFqMcrjYSsseA6r4%2Fimage.png?alt=media&amp;token=7151337c-aada-4dea-bd4d-8366b5d41cd7" alt="" width="375"><figcaption></figcaption></figure>

## Ticket Forms

You can have different sets of [ticket forms](/pylon-docs/support-workflows/ticket-forms) available to different sets of portal users. For example, accounts on different tiers can see different forms.

## Issue Visibility

By default, new tickets submitted by users will be visible in the portal. You have control on the ticket level to show or not show particular tickets, as well as the title the ticket shows up with.

Click into any issue in Pylon and find the **Customer Portal Settings** module in the sidebar to change the visibility or title of an individual issue. To change several at once, select them and use **Portal visibility**. You can also set up a [Trigger](/pylon-docs/platform/triggers) to automatically set the portal visibility of certain types of issues.

{% hint style="info" %}
Customers can view and manage tickets from across Slack, Email, Chat Widget, and more directly in the portal!
{% endhint %}


# Portal Experience

How the portal experience works for your customers

## Login

Users will login to the portal by visiting the domain listed at the top of the portal settings page. By default, login is via. a one-time code sent to their email. This allows users to not have to create an account with Pylon to have access to your portal and validates they have access to their email when attempting to login.

Using [Custom Authentication](/pylon-docs/customer-portal/custom-authentication), you can create a unified login between your dashboard and the customer portal.

If users are part of multiple accounts, they will be able to select their workspace after logging in. Related accounts (parent and sub-accounts, or partners and clients) are combined into one view; see [Related accounts](/pylon-docs/customer-portal/access-control#related-accounts).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FBkfme2F9oP5MUisPHqGI%2Fimage%20(3).png?alt=media&amp;token=5af958fd-050c-4d0f-81a5-94506c117de2" alt="" width="330"><figcaption></figcaption></figure>

## Tabs

What a customer sees depends on their [portal role](/pylon-docs/customer-portal/access-control) and your [tab settings](/pylon-docs/customer-portal/styling-and-customization#tabs).

| Tab              | Shows                                             | Appears when                                                                                       |
| ---------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
| Issues           | The account's tickets                             | The tab is on and the role can view issues                                                         |
| Projects & Tasks | Projects and tasks marked **Visible to customer** | The tab is on, the role can view tasks, and there's something to show or the role can create tasks |
| Feature requests | Feature requests linked to the account            | The tab is on (it's off by default) and at least one feature request is visible                    |
| Members          | The account's portal users                        | The role can view contacts                                                                         |
| Notebooks        | Account notebooks marked **Visible to customer**  | At least one notebook is shared                                                                    |

## View Tickets

Customers can view and search for tickets from the main page of the portal. By default, they see tickets from the last 365 days. They can pick another range (**Last 24 Hours** up to **Last 365 Days**) or a custom date range.

Customers can filter tickets by requester, status, source, last message time, and any issue fields you've made visible in the portal. Any fields on the ticket you designated in the portal settings page will be visible as well.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F9QtDFwjSiu9LCpDh9ADG%2FCleanShot%202024-10-19%20at%2021.17.35%402x.png?alt=media&amp;token=3849c74b-045e-42ae-a194-81e731a8462d" alt=""><figcaption></figcaption></figure>

## Create Tickets

You can create [Ticket Forms](/pylon-docs/support-workflows/ticket-forms) that users can submit from directly within the portal. These form submissions open new tickets and are immediately visible in the portal, along with the customers' remaining tickets.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FGhBlQ4maFi5nAcfsnOtb%2FCleanShot%202024-10-19%20at%2021.48.13%402x.png?alt=media&amp;token=28706594-2dc6-46a2-9245-f0d990e74549" alt="" width="375"><figcaption></figcaption></figure>

## Work on a Ticket

Users can click into a ticket to reply, see the latest updates from their teammates or your team, and, if their role allows editing issues:

* **Close or reopen** the ticket from the **Status** field.
* **Change the requester** to another contact on the account, unless you've restricted who can edit the Requester field.
* **Edit fields** you've marked **Customer Can Edit**.
* **Manage followers**: follow or unfollow the ticket, and add or remove followers. This needs the **Followers** permission. The requester always stays a follower.
* **Edit CCs** when replying to email tickets. This is off by default; turn on **Allow portal users to edit CCs** in the [General settings](/pylon-docs/customer-portal/styling-and-customization#general-settings).

## Projects & Tasks

Customers see the projects and tasks you mark **Visible to customer** (on the project, task, or project template). They can:

* Switch a project between **List**, **Kanban**, and **Gantt** views, and **Export to CSV**.
* Comment on projects and tasks, if their portal role has **Editor** access to **Tasks**. The default **Member** role can view tasks but can't comment on them.
* Create tasks and edit task fields you've marked **Customer Can Edit**, if their role has **Editor** access to Tasks.

See [Tasks & Projects](/pylon-docs/account-intelligence/tasks-and-projects).

## Feature Requests

Customers can browse and search the [feature requests](/pylon-docs/product-intelligence/feature-requests) linked to their account and see the customer-facing status you've mapped for each. Turn on the tab and choose which fields and descriptions to show under [Tabs](/pylon-docs/customer-portal/styling-and-customization#tabs).

## Notebooks

To share an account [notebook](/pylon-docs/account-intelligence/notebooks), turn on **Visible to customer** in the notebook's menu. Customers see the notebook's full contents. If some of it won't show in the portal, such as projects that aren't visible to customers or unsupported blocks, Pylon lists it and asks you to confirm.

Shared notebooks can include read-only custom-object tables. Customers see the columns and records defined by the saved table configuration, scoped to the notebook's account. They can load more rows but can't edit records from the table. Custom objects are available on select plans — contact your account team for availability.

## Manage Members

The **Members** tab shows who on the customer's team has portal access. Contacts whose role has **Editor** access to Contacts (such as [Admins](/pylon-docs/customer-portal/access-control#admin)) can also:

* Change roles, one contact at a time or in bulk with **Edit role**.
* **Add Member** with a name, email, and portal role, optionally sending them an email to view the portal.

## Language and Theme

Logged-in customers can change the portal language, and anyone can switch between light and dark mode from the header.


# Access Control

Control who gets access to the portal and what level of access they get

Every contact who can log in to the portal has a portal role. The role decides which tickets, teammates, tasks, and feature requests the contact can see, and what they can change.

## Default roles

There are three default roles. You can't edit them, but you can duplicate one as a starting point for a custom role.

### No Access

Contacts with no access can't log in to the portal. You or a customer admin can revoke access at any time.

### Member

Members work on the tickets they follow. A contact follows a ticket when they requested it, were CC'd on it, or were added as a follower. They don't see their coworkers' other tickets.

Members can:

* View and reply to tickets they follow, and add or remove followers on them.
* See the **Members** tab, but not invite teammates or change roles.
* View projects and tasks shared with their account.
* View feature requests shared with their account.

### Admin

Admins can see and manage every ticket for their account. They can also invite teammates, change teammates' roles, create and edit tasks, view feature requests, and manage followers.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FlnjKGUJ4MtUhE2GSnU5W%2Fimage.png?alt=media&amp;token=2b9c7902-7a79-4dea-a6f8-7d599db745b8" alt=""><figcaption></figcaption></figure>

## Default role for new contacts

Set the role new contacts get under **Settings > Customers > Customer portal > General > Default portal role**. Changing it doesn't affect existing contacts.

If the contact's account has domains and the contact's email domain isn't one of them, the contact gets **No Access** instead of the default role.

## Custom portal roles

Custom portal roles let you define more granular permissions for different types of portal users. Custom portal roles are available on the Enterprise plan.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FKhcSMWqyvKUZub6kRd5m%2FScreenshot%202025-12-14%20at%2011.30.08%E2%80%AFAM.png?alt=media&amp;token=f4e361e6-b6b8-4d88-9a70-04ec63d9b6a3" alt=""><figcaption></figcaption></figure>

Go to **Customers > Contacts** and select [**Manage Portal Roles**](https://app.usepylon.com/customers/contacts/portal-roles) to view default and custom roles. From a role's menu you can:

* **Duplicate** the role.
* **Hide** the role so it can't be assigned, or **Show** it again.
* **Delete** a custom role.

#### Permissions <a href="#permissions" id="permissions"></a>

Each role has five permission areas:

| Area             | Controls                                                         | Levels                       |
| ---------------- | ---------------------------------------------------------------- | ---------------------------- |
| Issues           | Viewing and managing tickets                                     | Editor, View only, No access |
| Contacts         | Viewing teammates; with Editor, inviting them and changing roles | Editor, View only, No access |
| Tasks            | Viewing and managing tasks                                       | Editor, View only, No access |
| Feature requests | Viewing feature requests                                         | View only, No access         |
| Followers        | Adding and removing followers on tickets                         | Editor, No access            |

**Feature requests** appears only when Feature Requests is enabled for your workspace.

#### Access <a href="#access" id="access"></a>

* **Editor** - Full read and write access
* **View only** - Read access without editing capabilities
* **No access** - No visibility or interaction

#### Limit which issues a role can access

When **Issues** isn't set to **No access**, add filters on issue and contact properties to narrow which tickets the role covers. Use the **Current Contact** value to scope access to the person logged in, for example **Requester** is **Current Contact** or **Contact Follower** is **Current Contact**.

{% hint style="warning" %}
A role with no issue filters can access every ticket in the contact's account. Pylon shows a warning on the role and asks you to confirm before saving it.
{% endhint %}

## Related accounts

A contact can have portal access on more than one account. If those accounts are related as parent and sub-account, or as partner and client, the portal combines them. The contact sees issues, projects, tasks, feature requests, and notebooks across the related accounts and can filter by account. Each item still follows the permissions of the account it belongs to. Ticket forms and the embedded chat widget use the account the contact currently has selected.


# Custom Authentication

Add unified sign-in between the customer portal and your product dashboard

By default, authentication for your customers to access the customer portal is via a one-time passcode sent to their email on login.

Using Customer Authentication, you can implement unified login across the customer portal and your web application. This means when customers are logged in to your dashboard, they'll also seamlessly be logged into your Pylon customer portal (and knowledge base).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FUPTqABB3Y0rfkvzyYJKK%2Fimage.png?alt=media&amp;token=f6c9f106-2a28-461a-9e2e-48578988099f" alt=""><figcaption></figcaption></figure>

For more details on how to implement this, view the [setup guide](https://support.usepylon.com/articles/5661240375-customer-authentication-methods) in our help center.

{% hint style="info" %}
When sending the JWT to the callback by POST, use `Content-Type: application/x-www-form-urlencoded` and a form field named `jwt`. The callback does not accept a JSON request body.
{% endhint %}


# Overview

Embed chat in your dashboard to allow users to ask for help where they need it

Embed the Chat Widget into your application so your customers can talk to you directly from the context of your product. Features include:

* Live chat with automated workflows and AI responses
* Embedded knowledge base search
* Embedded forms
* Embedded quick links
* Fully customizable colors, branding, and workflows
* Multiple separate chat widgets with different branding and workflows (Enterprise plan)
* Serving the widget from your own domain (Enterprise plan)
* JavaScript API to build workflows and customize behavior in code
* Mobile SDKs for iOS, Android, and React Native

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fzz8CbxxOCiecLPKKIpN4%2Fimage.png?alt=media&amp;token=d4a7db54-a572-4779-99e0-e9f4e0bbfd60" alt=""><figcaption></figcaption></figure>

{% content-ref url="/pages/cYPG955ZWkkMG9EDtVsC" %}
[Styling](/pylon-docs/chat-widget/styling)
{% endcontent-ref %}

{% content-ref url="/pages/JTSQ2c5yoUT07qDVtzNd" %}
[Functionality](/pylon-docs/chat-widget/functionality)
{% endcontent-ref %}

{% content-ref url="/pages/iLV6GIAVnQCmz6Yhgdvn" %}
[Chat Experience](/pylon-docs/chat-widget/chat-experience)
{% endcontent-ref %}

{% content-ref url="/pages/wWagLaAEUvQlv6BwMBwe" %}
[Chat Setup](/pylon-docs/chat-widget/chat-setup)
{% endcontent-ref %}

{% content-ref url="/pages/MLl2Dui7DAiaaHuoWo7G" %}
[Identity Verification](/pylon-docs/chat-widget/identity-verification)
{% endcontent-ref %}

{% content-ref url="/pages/0B0EJmeza7hTYvMCuKNb" %}
[JavaScript API](/pylon-docs/chat-widget/javascript-api)
{% endcontent-ref %}

{% content-ref url="/pages/7xMOx9xLyQEH6Nuov2Ia" %}
[Custom Domain](/pylon-docs/chat-widget/custom-domain)
{% endcontent-ref %}

{% content-ref url="/pages/ISJeFeRszsoU8clD6rqp" %}
[Mobile SDKs](/pylon-docs/chat-widget/mobile-sdks)
{% endcontent-ref %}


# Styling

Customize your Chat Widget to look how you want

Open a widget in **Settings > Communications > Chat widget** and go to the **Styling** tab. A preview shows what the widget will look like to your customers.

## Styling

You can customize the:

* **Header background**: **Default**, or a **Custom color**
* **Custom org logo** shown on the home screen. It defaults to the square logo in your Brand center.
* **Custom chat bubble icon** (Enterprise plan)
* **Primary color**, used for buttons and highlights. It defaults to your Brand center primary color. Available on the Enterprise plan.
* **Chat bubble color**
* **Welcome message** on the home screen
* **Module order** of the home screen modules

Online and offline messages, the chat title, and the initial message when opening a chat are set on the **Modules** tab. See [Functionality](/pylon-docs/chat-widget/functionality#chat-module).

The widget also uses the body and headline fonts from **Settings > Workspace > Brand center**.

<div data-full-width="true"><figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FYuMB3Y7TvuFrT9vKubVo%2Fimage.png?alt=media&amp;token=448b5dd7-65d9-43c7-8b4a-c636701f8451" alt=""><figcaption></figcaption></figure> <figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F65tJlWvlceCsMM8GVzAE%2FScreenshot%202025-03-31%20at%207.37.35%E2%80%AFPM.png?alt=media&amp;token=4136e19f-935a-493b-a161-b09b9f0126f9" alt=""><figcaption></figcaption></figure> <figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FBJOlIRNwpLVPHNrNndIe%2FScreenshot%202025-03-31%20at%207.33.39%E2%80%AFPM.png?alt=media&amp;token=f7dd3ea0-193e-4b3d-9b32-712210379b5c" alt=""><figcaption></figcaption></figure></div>

## Dark Mode

Use the **Light Mode** / **Dark Mode** switcher next to the Styling heading to set a separate header background, logo, bubble icon, primary color, and bubble color for each theme. Dark mode values you leave empty fall back to a default, such as your light mode value or your Brand center's dark mode logo and colors.

The widget shows the light theme by default. Switch it from your app with [`setTheme`](/pylon-docs/chat-widget/javascript-api#window-pylon-settheme), for example to follow your app's own theme.

## Position

The bubble sits in the bottom-right corner of the page, and the chat window opens above it. To move them, override their position with CSS on your page:

```css
.PylonChat-bubbleFrameContainer {
  bottom: 24px !important;
  right: 24px !important;
}

.PylonChat-chatWindowFrameContainer {
  bottom: 88px !important;
  right: 24px !important;
}
```

To show or hide the widget from code, see the [JavaScript API](/pylon-docs/chat-widget/javascript-api).


# Functionality

Customize the behavior of your Chat Widget

{% hint style="info" %}
You can always setup complex workflows using Pylon's [Triggers](/pylon-docs/platform/triggers) that apply to just chat, or across all your issues.\
\
General support workflows like [CSAT](/pylon-docs/support-workflows/csat), [SLAs](/pylon-docs/support-workflows/slas-and-timers), and the [Support Agent](/pylon-docs/agents/support-agent) all can apply to Chat Widget as well.
{% endhint %}

Configure each widget in **Settings > Communications > Chat widget**. Within the chat configuration page, you can:

* Show different quick links to different users based on properties about them
* Hide or show the chat functionality to different users based on properties about them
* Hide or show the chat functionality when outside your support hours

You configure the widget's home screen on the **Modules** tab: knowledge base search, Chat, Bookmarks, and Ticket forms. Set the order of the Chat, Bookmarks, and Ticket forms modules under **Module order** on the **Styling** tab.

### Embedded Knowledge Base

Allow users to search for and view knowledge base content directly inside your app.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FpsPCWYQ1rmipVEkXeLjj%2Fkb_in_chat.gif?alt=media&amp;token=3c279b4d-b5c9-4744-b379-09ebc4c2420c" alt=""><figcaption></figcaption></figure>

Turn this on with **Enable search** under **Search knowledge base** on the **Modules** tab. If your organization has more than one knowledge base, choose which one the widget searches under **Knowledge base**.

When a user searches, the widget shows an **Ask AI** answer with its sources above the matching articles. Results can also include pages from external sites your knowledge base is set up to search.

### Chat Module

On the **Modules** tab, under **Chat**:

* **Enable Chat module** turns live chat on or off.
* **Chat title**, **Online message**, **Offline message**, and **Initial message** set the text users see when starting a chat.
* **Show chat module when off support hours** keeps chat available outside your support hours.
* **Past conversations preview** sets whether each past conversation on the home screen shows its **Last message** or its **Issue title**.
* **Hide issue numbers** hides issue numbers from your users.
* **Conditionally show Chat** shows chat only to users who match the filters you set.

### Bookmarks

Bookmarks are quick links on the widget's home screen. Group them into bookmark sets and add conditions to show a set only to certain users. Conditions are evaluated top-down, and users who match none see the **Default bookmarks**.

A bookmark's link can include account variables (account ID, name, domain, or an account custom field) so each customer goes to their own page. Bookmarks with variables only show to identity-verified users whose account has a value for every variable in the link.

### Embedded Forms

Embed your [Ticket Forms](/pylon-docs/support-workflows/ticket-forms) directly into your chat to allow users to submit async requests. Customize which tickets forms are visible to a user based on user or account properties.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FtXq344bAGX1CVsnByEz7%2FCleanShot%202025-04-16%20at%2018.07.11.png?alt=media&amp;token=d154e7f4-7fb1-44ca-9e26-175c299a77b2" alt=""><figcaption></figcaption></figure>

Group forms into form sets on the **Modules** tab. Like bookmark sets, they're evaluated top-down, and users who match none see the **Default forms**.

### Sync & Respond from Slack

Pylon offers two ways to manage chat conversations in Slack:

**Chat Support Channel** Set a dedicated Slack channel as your Chat Support Channel. This acts as a fallback channel where chat conversations will appear for contacts or accounts that don't have an associated shared Slack channel.

**Send to Shared Channel** Enable the "Send to Shared Channel" toggle to have chat conversations post directly to your customers' shared Slack channels when one exists. When enabled, this provides bidirectional sync of messages, files, reactions, and more between the chat widget and Slack in real-time.

To route only some accounts to their shared channel, add an account filter under **Send to Shared Channel**. With no filter, all eligible accounts are included.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F6wHpP6H7abLU59i6XoOs%2FCleanShot%202024-10-10%20at%2021.12.44%402x.png?alt=media&amp;token=bd463e27-8498-4dcb-89b4-20c4ae9db10c" alt=""><figcaption></figcaption></figure>

### Support Hours

Set custom chat widget support hours in Chat Widget Settings. Once enabled you will be able to set custom support hours that override your main support hours. Custom hours can be created [here](https://app.usepylon.com/settings/support-hours).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FIvg28AUP3UWBZGtZdiEM%2FCleanShot%202025-11-06%20at%2011.51.19%402x.png?alt=media&amp;token=81ca7bdd-19fe-4f0c-be24-ac177b493d0b" alt="" width="563"><figcaption></figcaption></figure>

### Chat Bubble

Under **Chat bubble** on the **Settings** tab:

* **Show Chat Bubble**: turn this off to hide the bubble and open the chat yourself with the [JavaScript API](/pylon-docs/chat-widget/javascript-api#window-pylon-show).
* **Show Chat Bubble With Unread Messages**: when the bubble is hidden, show it anyway while the user has unread messages.

### Unread Message Emails

When a user leaves the chat with an unread reply, Pylon emails them after a few minutes. Turn this off with **Email customers about unread messages** under **Notifications** on the **Settings** tab if you'd rather handle follow-ups yourself. Choose which of your connected email addresses sends it under **Notification email**.

### Privacy Policy Link

Turn on **Display privacy policy link** and enter a **Privacy policy URL** to show a link to your privacy policy in the widget footer when a user starts a chat or form.

### Conversation Metadata

Pylon records details about where each widget conversation or ticket form submission came from in these issue fields:

* Page URL
* User Timezone
* Chat Widget App
* User Agent (hidden in the issue sidebar by default)
* Browser
* Operating System
* Device Type
* Device Model

Use these fields in [Triggers](/pylon-docs/platform/triggers), for example to route chats from a specific page or device type.


# Chat Experience

How the chat experience works for your customers

## Editor

The editor in the chat supports:

* Rich text like bolds, italics, links, etc.
* Inline code and code blocks
* Attached files, up to 500 MB each
* Emojis
* Reactions

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FkaN2GsYtr6XhMHALgF1C%2Fimage.png?alt=media&amp;token=44bf61e3-348d-48cc-a3b1-0214e6409dcc" alt="" width="338"><figcaption></figcaption></figure>

Each message can be up to 2,500 characters. A character counter appears once a message passes half the limit.

Users can't edit or delete messages after sending them. Your team can edit and delete their own messages, and the changes show up in the widget right away.

If your organization uses SendSafely, users can also attach files through a secure SendSafely dropzone.

## In the Conversation

* Users see a typing indicator while a team member is writing a reply.
* Replies from your AI agent can include a **Sources** list linking to the articles and pages the answer is based on.

## Follow Up

When a reply arrives while the chat is closed, a preview of it pops up above the chat bubble, and the bubble shows a red notification dot.

If the user does not see your message within a few minutes, they will receive a follow-up email. You can turn this email off or change its sender. See [Functionality](/pylon-docs/chat-widget/functionality#unread-message-emails).

## Past Conversations

Users can also view and continue their past conversations from the home page of the chat.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F7CNLP00s4ay7HWvuOMhG%2FScreenshot%202025-03-31%20at%207.46.43%E2%80%AFPM.png?alt=media&amp;token=b94dd371-76eb-4409-b868-beb770c20990" alt=""><figcaption></figcaption></figure>

Past conversations are only shown when [identity verification](/pylon-docs/chat-widget/identity-verification) is enabled.

## Ticket Forms

After a user submits a ticket form, they can click **View Ticket** to open the conversation it created. This requires identity verification; without it, users see **Return home** instead.


# Chat Setup

How to setup Pylon's Chat Widget

## Installation <a href="#installation" id="installation"></a>

{% hint style="info" %}
Installing the Chat Widget will involve adding code to your Frontend. It may be necessary to involve an engineer to get this installed if you don’t have access to the codebase.
{% endhint %}

Chat widget settings live in **Settings > Communications > Chat widget** ([US](https://app.usepylon.com/settings/chat-widget), [EU](https://app.eu.usepylon.com/settings/chat-widget)). Click a widget to open its settings, which are split into **Modules**, **Settings**, and **Styling** tabs.

1. **Getting Started**<br>

   Grab your `APP_ID` from the **App ID** column on the Chat Widgets page, or from **Set up > App ID** on the widget's **Settings** tab.
2. **Add Script to Body**\
   \
   Add the following `<script>` to right before the `</body>` tag in your `index.html`.\
   \
   Make sure to replace the `APP_ID` with the `APP_ID` you grabbed from Step 1.<br>

   ```html
   <script>
   (function(){var e=window;var t=document;var n=function(){n.e(arguments)};n.q=[];n.e=function(e){n.q.push(e)};e.Pylon=n;var r=function(){var e=t.createElement("script");e.setAttribute("type","text/javascript");e.setAttribute("async","true");e.setAttribute("src","https://widget.usepylon.com/widget/APP_ID");var n=t.getElementsByTagName("script")[0];n.parentNode.insertBefore(e,n)};if(t.readyState==="complete"){r()}else if(e.addEventListener){e.addEventListener("load",r,false)}})();
   </script>
   ```

   \
   If you are using EU data hosting, then use the following `<script>` instead:<br>

   ```html
   <script>
   (function(){var e=window;var t=document;var n=function(){n.e(arguments)};n.q=[];n.e=function(e){n.q.push(e)};e.Pylon=n;var r=function(){var e=t.createElement("script");e.setAttribute("type","text/javascript");e.setAttribute("async","true");e.setAttribute("src","https://widget.eu.usepylon.com/widget/APP_ID");var n=t.getElementsByTagName("script")[0];n.parentNode.insertBefore(e,n)};if(t.readyState==="complete"){r()}else if(e.addEventListener){e.addEventListener("load",r,false)}})();
   </script>
   ```

   \
   If you serve the widget from your own domain, use the snippet from the Custom Domain page instead. See [Custom Domain](/pylon-docs/chat-widget/custom-domain).

\ <br>

3. **Content Security Policy**<br>

   If you have a CSP, you will need to set up the following policy:

   ```
   Content-Security-Policy: 
       connect-src 'self' https://*.usepylon.com wss://*.pusher.com https://*.pusher.com;
       script-src 'self' https://widget.usepylon.com;
       font-src 'self' https://*.usepylon.com;
       style-src 'self' 'unsafe-inline' https://*.usepylon.com;
       img-src 'self' https://*.usepylon.com https://pylon-avatars.s3.us-west-1.amazonaws.com;
   ```

   \
   If you are using EU data hosting, then use the following policy:<br>

   ```
   Content-Security-Policy: 
       connect-src 'self' https://*.usepylon.com wss://*.pusher.com https://*.pusher.com;
       script-src 'self' https://widget.eu.usepylon.com;
       font-src 'self' https://*.usepylon.com;
       style-src 'self' 'unsafe-inline' https://*.usepylon.com;
       img-src 'self' https://*.usepylon.com https://pylon-eucentral1-avatars.s3.eu-central-1.amazonaws.com;
   ```

   \
   `https://*.pusher.com` covers the fallback the widget uses for real-time updates when a WebSocket connection isn't available.

   If you use a custom domain, add it to the policy as well. See [Custom Domain](/pylon-docs/chat-widget/custom-domain#content-security-policy).

   If your organization uses SendSafely for secure attachments in the widget, also allow `https://*.sendsafely.com` in `script-src` and `connect-src`.
4. **Enable the Chat Widget**<br>

   Anywhere in your React code you can access the `window` object and set the `pylon` config.<br>

   You should add this code wherever the user has already logged in and details like the User’s email, name, etc. become available.

   ```js
   window.pylon = {
     chat_settings: {
       app_id: "APP_ID",
       email: "USER_EMAIL",
       name: "USER_FULL_NAME",

       // (Optional) If you have the user's profile image available through something like Auth0
       avatar_url: "USER_PROFILE_IMAGE_URL",

       // (Optional) If you are using Pylon's identity verification
       email_hash: "USER_EMAIL_HASH",
       
       // (Optional) If you want to force association of an issue/contact with a certain account.
       account_id: "057a3564-fc1b-4224-9292-dcf718653452",
       
       // (Optional) If you want to force association of an issue/contact with a certain account.
       // Learn more about external IDs here: https://docs.usepylon.com/pylon-docs/developer/api/external-ids.
       account_external_id: "ab38e36b-3e28-4e2d-b976-6282735b77eb",

       // (Optional) Force the widget's language, e.g. "fr".
       locale: "USER_LOCALE"
     },
   };
   ```

   \\

   <div data-gb-custom-block data-tag="hint" data-style="warning" class="hint hint-warning"><p><code>app_id</code>, <code>email</code>, and <code>name</code> are required. The widget won't load until all three are set, so the widget can't be used for anonymous chat.</p></div>

   | Field                                | Description                                                                                                                                                                                                                                                    |
   | ------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
   | `app_id`                             | **Required.** Your Chat Widget App ID.                                                                                                                                                                                                                         |
   | `email`                              | **Required.** The logged-in user's email.                                                                                                                                                                                                                      |
   | `name`                               | **Required.** The logged-in user's name.                                                                                                                                                                                                                       |
   | `avatar_url`                         | The user's profile image URL.                                                                                                                                                                                                                                  |
   | `email_hash`                         | HMAC hash of the email, for [identity verification](/pylon-docs/chat-widget/identity-verification#hmac-email-hash).                                                                                                                                            |
   | `jwt`                                | Signed token, for [JWT identity verification](/pylon-docs/chat-widget/identity-verification#json-web-token-jwt).                                                                                                                                               |
   | `account_id` / `account_external_id` | Associate the user's conversations with a specific account. Pylon never creates an account from these values. See [How Pylon matches widget users to contacts and accounts](#how-pylon-matches-widget-users-to-contacts-and-accounts).                         |
   | `contact_id` / `contact_external_id` | Pin the session to an existing contact, for apps where an email doesn't uniquely identify a user. Only honored with JWT identity verification, and the value must match the matching claim in the signed JWT.                                                  |
   | `locale`                             | Force the widget's language. Supported values: `en`, `es`, `et`, `fr`, `de`, `it`, `ja`, `ko`, `pt-br`. When set, it takes priority over the language the user picks in the widget, their saved language preference, and your organization's default language. |

   \
   Example usage in a React component:

   ```js
   useEffect(() => {
     if (user.loggedIn) {
       window.pylon = {
         chat_settings: {
           app_id: APP_ID,
           email: user.email,
           name: user.fullName,
           avatar_url: user.profileImgUrl,
         },
       };
     }
   }, [user]);
   ```
5. **Setup Chat Support Channel**\
   \
   Create a Slack channel in your workspace where you can respond to chats, like `#chat-support`.<br>

   Note: If you make this channel private, add the Pylon bot to the channel.<br>

   On the widget's **Settings** tab, set `#chat-support` as the **Chat Support Channel** under **Channel settings**.
6. **Chat Widget Color**<br>

   Set the colors of your chat widget on the widget's **Styling** tab. See [Styling](/pylon-docs/chat-widget/styling).
7. **Identity Verification**<br>

   This is optional, but **strongly recommended** before you're ready for live production chats.<br>

   [Here’s how to set it up](/pylon-docs/chat-widget/identity-verification).
8. **Turn it On**<br>

   Click **Enable** in the top right of the widget's settings page. If identity verification isn't set up, Pylon warns you that users could impersonate each other and won't see their past conversations. Click **Enable Anyway** to continue, or **Cancel** to set up identity verification first.
9. **All Done!**

## How Pylon matches widget users to contacts and accounts <a href="#how-pylon-matches-widget-users-to-contacts-and-accounts" id="how-pylon-matches-widget-users-to-contacts-and-accounts"></a>

Pylon identifies a widget user by `email`. Their contact and account are set when they send their first message or submit a ticket form.

### Contact

* If a contact with that email already exists, Pylon uses it.
* If you pass `account_id` or `account_external_id` and it matches an account, Pylon uses the contact with that email in that account. If that account has no such contact, Pylon creates one there. Existing contacts in other accounts aren't moved.
* If several contacts share the email and you don't pass an account, Pylon prefers the contact on a [partner account](/pylon-docs/account-intelligence/accounts/partner-accounts), then the one on the account that owns the email's domain, then the newest.
* If no contact has that email, Pylon creates one.

### Account

A new contact is added to the first account that matches:

1. `account_id`: the account's Pylon ID.
2. `account_external_id`: an [external ID](/pylon-docs/developer/api/external-ids) set on the account.
3. The account whose domains include the email's domain.
4. A new account that Pylon creates from the email's domain.

Pylon doesn't create an account for personal email domains like gmail.com, so the contact is created without one. To stop Pylon from creating accounts for unknown domains, turn on **Suppress automatic account creation** in **Settings > Customers > Account configuration**. Contacts are then created without an account, and you can assign them manually.

Each conversation is filed under `account_id`, then `account_external_id`, then the contact's account, then the account that owns the email's domain.

{% hint style="warning" %}
Pylon never creates an account from `account_id` or `account_external_id`. If the value doesn't match an existing account, Pylon ignores it and falls back to the contact's account or the email's domain, which can auto-create an account. While the value doesn't match, the widget only lists past conversations that have no account. Create the account and set its external ID before you pass it to the widget.
{% endhint %}

### Which conversations a user sees

* The widget lists conversations where the user's contact is the requester and that started in this widget, including ticket forms submitted in it. Conversations from email, Slack, and other channels aren't listed.
* Conversations aren't shared across contacts. Two users at the same account each see only their own.
* When you pass `account_id` or `account_external_id`, the widget only lists conversations on that account or with no account.
* Users only see past conversations when [identity verification](/pylon-docs/chat-widget/identity-verification) is set up.

## Single-page apps: change the user after the widget loads <a href="#single-page-apps" id="single-page-apps"></a>

You don't need to reload the page. The widget checks `window.pylon.chat_settings` about once a second, so update the object when the signed-in user or their account changes:

```js
window.pylon.chat_settings.account_external_id = "NEW_ACCOUNT_EXTERNAL_ID";
```

* When `app_id`, `email`, `account_id`, `account_external_id`, `contact_id`, or `contact_external_id` changes, the widget closes any open conversation, returns to its home screen, and loads conversations for the new identity.
* If you use identity verification, update `email_hash` whenever `email` changes. With JWT, set a new `jwt` whose claims match the new values at the same time. Requests are rejected while the values and the token don't match.
* Changing `name` updates the contact's name the next time the user sends a message, unless a teammate has edited the contact's name in Pylon.

When a user logs out, remove their settings. Within about a second, the widget and its chat bubble disappear and the widget clears the previous user's conversations:

```js
delete window.pylon.chat_settings;
```

Set `chat_settings` again when the next user logs in.

## When the chat bubble appears <a href="#when-the-chat-bubble-appears" id="when-the-chat-bubble-appears"></a>

The chat bubble only renders when all of these are true:

* `app_id`, `email`, and `name` are set. Without them nothing renders, including the bubble.
* The widget is enabled.
* Identity verification passes. If the `email_hash` or `jwt` is missing or invalid while identity verification is on, the widget doesn't load and no bubble appears.
* **Show Chat Bubble** is on in the widget's **Settings** tab. When it's off, open the chat with [`Pylon("show")`](/pylon-docs/chat-widget/javascript-api#window-pylon-show), or turn on **Show Chat Bubble With Unread Messages** to show the bubble only when there are unread replies.
* Your page hasn't called [`Pylon("hideChatBubble")`](/pylon-docs/chat-widget/javascript-api#window-pylon-hidechatbubble).

The bubble still renders when `account_id` or `account_external_id` doesn't match an account.


# Custom Domain

Serve the Chat Widget from your own domain

Serve the Chat Widget from a domain you own, such as `chat.example.com`, instead of a Pylon domain. With a custom domain, the widget script, its requests to Pylon, its real-time connection, and Pylon-hosted images, fonts, and attachments all load through your domain.

{% hint style="info" %}
Custom chat widget domains are available on the Enterprise plan.
{% endhint %}

One custom domain covers every chat widget in your organization. Existing embed snippets that don't use the custom domain keep working.

## Set up a custom domain

{% stepper %}
{% step %}

### Add your domain

Go to **Settings > Communications > Chat widget** and click **Custom Domain** ([US](https://app.usepylon.com/settings/chat-widget/custom-domain), [EU](https://app.eu.usepylon.com/settings/chat-widget/custom-domain)). Enter your domain, for example `chat.example.com`, and click **Set Up**.
{% endstep %}

{% step %}

### Add the DNS records

Under **DNS records**, Pylon lists two records. Add both with your DNS provider.

The status shows **Pending verification** until the records are found. Verification can take up to 30 minutes after the records are in place, and the page updates on its own.

If the status changes to **Verification failed**, check the records, including any CAA policy on your domain, then click **Retry**.
{% endstep %}

{% step %}

### Update your embed snippet

Once the domain shows **Verified**, an **Embed snippet** section appears. Pick the chat widget you're installing and copy its snippet. It loads the widget from `https://<your-domain>/widget/embed/<APP_ID>`.

Use this snippet in place of the one in [Chat Setup](/pylon-docs/chat-widget/chat-setup) step 2. The rest of the setup, including `window.pylon.chat_settings`, stays the same.
{% endstep %}
{% endstepper %}

## Content Security Policy

If your site has a CSP, start from the policy in [Chat Setup](/pylon-docs/chat-widget/chat-setup) and add your custom domain. For `chat.example.com`:

```
Content-Security-Policy: 
    connect-src 'self' https://*.usepylon.com wss://*.pusher.com https://*.pusher.com https://chat.example.com wss://chat.example.com;
    script-src 'self' https://widget.usepylon.com https://chat.example.com;
    font-src 'self' https://*.usepylon.com https://chat.example.com;
    style-src 'self' 'unsafe-inline' https://*.usepylon.com;
    img-src 'self' https://*.usepylon.com https://pylon-avatars.s3.us-west-1.amazonaws.com https://chat.example.com;
```

Keep the Pylon entries: some widget requests still go directly to Pylon. If you use EU data hosting, start from the EU policy instead.

## Change or remove the domain

To use a different domain, enter it and click **Update**, then add the new DNS records.

To stop using a custom domain, click **Remove**. Embeds that use the custom-domain snippet stop working, so switch them back to the standard snippet first. Embeds that use the standard snippet aren't affected.


# Identity Verification

Use identity verification to secure your chat from user impersonation

{% hint style="info" %}
Please note that if Identity Verification is not enabled, users won't be able to see old chats.
{% endhint %}

This step is optional but **strongly recommended** before you're ready for live production chats. Identity Verification ensures bad actors can't impersonate your customers to see their issues and conversations.

This is done by adding a verification for the identity of the user sending a message through the chat widget, to prevent your customers from manually changing their email in the frontend to impersonate each other.

Pylon is not unique on this front - because a user's identity in the chat is determined client-side, any chat is susceptible to users spoofing their email.

#### HMAC Email Hash

1. **Generate an Identity Secret**<br>

   Starting from your [Chat Widgets page](https://app.usepylon.com/settings/chat-widget) ([EU](https://app.eu.usepylon.com/settings/chat-widget)), open your chat widget and go to its **Settings** tab.\
   \
   Under **Security and Compliance**, set **Identity Verification** to **HMAC email hash**. Then, in the **Identity Verification Secret** section, click **Generate Secret** if a secret hasn't been generated yet.\
   \
   This will be the only time you will see this key. Save the key somewhere safe, such as a password manager. If you lose your key, you’ll need to regenerate it and replace the key later.\
   \
   Save the changes to your chat widget.
2. **Setup Backend**<br>

   In your backend, hash the user’s email address using HMAC-SHA256 with the secret you just generated. Note that the secret is a hex string and must be decoded to text before use.<br>

   Here are some code snippets to help:

{% tabs %}
{% tab title="JavaScript (Node.js)" %}

```javascript
const { createHmac } = require("node:crypto");

const secret = "GENERATED_IDENTITY_SECRET";
const email = "CHAT_USER_EMAIL";

const secretBytes = Buffer.from(secret, "hex");
const verificationHash = createHmac("sha256", secretBytes)
  .update(email)
  .digest("hex");
```

{% endtab %}

{% tab title="Python" %}

```python
import hmac
import hashlib

def sign_message_with_hmac(message, secret):
    secret_bytes = bytes.fromhex(secret)
    signature = hmac.new(secret_bytes, message.encode(), hashlib.sha256).hexdigest()
    return signature
```

{% endtab %}

{% tab title="Go" %}

```go
package auth

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"errors"
)

func SignMessageWithHMAC(message, secret string) (*string, error) {
	secretBytes, err := hex.DecodeString(secret)
	if err != nil {
		return nil, errors.New("unable to decode secret")
	}

	h := hmac.New(sha256.New, secretBytes)
	h.Write([]byte(message))
	signature := h.Sum(nil)

	signedMsg := hex.EncodeToString(signature)

	return &signedMsg, nil
}
```

{% endtab %}
{% endtabs %}

3. **Send this hash to the Frontend and set it on the window object:**<br>

   ```js
   window.pylon.chat_settings.email_hash = HMAC_HASH
   ```

   \
   To check that your backend generates the right hash for an email, use **Verify Email Hash** on the widget's **Settings** tab.\
   \
   Update `email_hash` whenever `email` changes, for example when a different user signs in to your single-page app. See [Single-page apps](/pylon-docs/chat-widget/chat-setup#single-page-apps).

#### JSON Web Token (JWT)

1. **Generate an Identity Secret**<br>

   Starting from your [Chat Widgets page](https://app.usepylon.com/settings/chat-widget) ([EU](https://app.eu.usepylon.com/settings/chat-widget)), open your chat widget and go to its **Settings** tab.\
   \
   Under **Security and Compliance**, set **Identity Verification** to **JWT (signed token)**. Then, in the **JWT Shared Secret** section, click **Generate Secret** if a secret hasn't been generated yet.\
   \
   This will be the only time you will see this key. Save the key somewhere safe, such as a password manager. If you lose your key, you’ll need to regenerate it and replace the key later.\
   \
   Save the changes to your chat widget.
2. **Setup Backend**<br>

   Generate a short-lived JWT for each authenticated user from your backend. Never expose the shared secret or generate JWTs in browser code.<br>

   Sign the JWT using **HS256** and the generated secret exactly as displayed. Unlike the HMAC secret, the JWT secret must **not** be hex-decoded.<br>

   Include these claims:

   * `email`: The authenticated user’s email address.
   * `aud`: Your Chat Widget App ID.
   * `iat`: The token’s issuance time.
   * `exp`: The expiration time. Tokens may last at most 15 minutes; we recommend 10 minutes.

   Optional identity claims include `name`, `account_id`, `account_external_id`, `contact_id`, and `contact_external_id`. Any identity values supplied to the widget must match those signed into the JWT.<br>

   Return the JWT to your frontend and pass it to the chat widget using the `jwt` field in the next step.\
   \
   Here are some code snippets to help:

{% tabs %}
{% tab title="JavaScript (Node.js)" %}

```javascript
const jwt = require("jsonwebtoken");

function createChatWidgetJWT(secret, appID, email, name = "") {
  const now = Math.floor(Date.now() / 1000);

  return jwt.sign(
    {
      email,
      name,
      aud: appID,
      iat: now,
      exp: now + 10 * 60,
    },
    secret,
    { algorithm: "HS256" },
  );
}
```

{% endtab %}

{% tab title="Python" %}

```python
from datetime import datetime, timedelta, timezone

import jwt


def create_chat_widget_jwt(secret, app_id, email, name=""):
    now = datetime.now(timezone.utc)

    return jwt.encode(
        {
            "email": email,
            "name": name,
            "aud": app_id,
            "iat": now,
            "exp": now + timedelta(minutes=10),
        },
        secret,
        algorithm="HS256",
    )
```

{% endtab %}

{% tab title="Go" %}

```go
package auth

import (
	"time"

	"github.com/golang-jwt/jwt/v5"
)

type ChatWidgetClaims struct {
	Email string `json:"email"`
	Name  string `json:"name"`
	jwt.RegisteredClaims
}

func CreateChatWidgetJWT(secret, appID, email, name string) (string, error) {
	now := time.Now().UTC()

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, ChatWidgetClaims{
		Email: email,
		Name:  name,
		RegisteredClaims: jwt.RegisteredClaims{
			Audience:  jwt.ClaimStrings{appID},
			IssuedAt:  jwt.NewNumericDate(now),
			ExpiresAt: jwt.NewNumericDate(now.Add(10 * time.Minute)),
		},
	})

	return token.SignedString([]byte(secret))
}
```

{% endtab %}
{% endtabs %}

3. **Send the JWT to the Frontend and set it on the window object:**<br>

   ```js
   window.pylon.chat_settings.jwt = YOUR_JWT
   ```

   \
   Generate a fresh JWT whenever the chat widget is initialized or the authenticated user changes. If you were using an email hash before with HMAC, then omit `email_hash` when using JWT authentication.<br>

\ <br>

#### Which values are verified

* **HMAC email hash** verifies only `email`. `account_id` and `account_external_id` aren't signed, so a user who edits them in the browser can file new conversations under a different account. They still only see their own conversations.
* **JWT** verifies `email` and every account and contact value. If you pass `account_id` or `account_external_id` to the widget, sign the same value into the token as a claim. Pylon rejects requests where they differ, so users can't switch accounts.

To learn how these values decide a user's contact and account, see [How Pylon matches widget users to contacts and accounts](/pylon-docs/chat-widget/chat-setup#how-pylon-matches-widget-users-to-contacts-and-accounts).


# JavaScript API

Available API methods to programmatically interface with the chat widget

We expose some functions in the Frontend to programmatically control the Chat window.

{% hint style="info" %}
Calls made before the widget finishes loading are queued and run once it loads. Every call requires a valid `window.pylon.chat_settings` with `app_id`, `email`, and `name` (see [Chat Setup](/pylon-docs/chat-widget/chat-setup)).
{% endhint %}

## `window.Pylon("show")` <a href="#window-pylon-show" id="window-pylon-show"></a>

Opens the chat window. Useful for programmatically triggering the chat window from an explicit support flow or button on your site.

## `window.Pylon("hide")` <a href="#window-pylon-hide" id="window-pylon-hide"></a>

Closes the chat window.

## `window.Pylon("onShow")` <a href="#window-pylon-onshow" id="window-pylon-onshow"></a>

Pass in a callback function that is called when the chat is shown. Useful for managing state of the chat window. If you pass in `null` as the callback function, the existing callback is removed.

```javascript
window.Pylon("onShow", function () {
  console.log("show chat!");
});
```

## `window.Pylon("onHide")` <a href="#window-pylon-onhide" id="window-pylon-onhide"></a>

Pass in a callback function that is called when the chat is hidden. Useful for managing state of the chat window. If you pass in `null` as the callback function, the existing callback is removed.

```javascript
window.Pylon("onHide", function () {
  console.log("hide chat!");
});
```

## `window.Pylon("hideChatBubble")` <a href="#window-pylon-hidechatbubble" id="window-pylon-hidechatbubble"></a>

Hides the chat bubble (and closes the chat window if it's open). Useful for hiding it in situations where it’s inappropriate or it’s blocking something underneath (ie an open modal).

This has no effect when **Show Chat Bubble** is turned off in the widget's settings.

## `window.Pylon("showChatBubble")` <a href="#window-pylon-showchatbubble" id="window-pylon-showchatbubble"></a>

Shows the chat bubble again after you've hidden it with `hideChatBubble`.

This has no effect when **Show Chat Bubble** is turned off in the widget's settings. In that case, use `show` to open the chat window directly.

## `window.Pylon("onShowChatBubble")` / `window.Pylon("onHideChatBubble")` <a href="#window-pylon-onshowchatbubble" id="window-pylon-onshowchatbubble"></a>

Pass in a callback function that is called when the chat bubble is shown or hidden. Pass in `null` to remove the existing callback.

```javascript
window.Pylon("onShowChatBubble", function () {
  console.log("bubble shown");
});
window.Pylon("onHideChatBubble", function () {
  console.log("bubble hidden");
});
```

## `window.Pylon("setTheme", "string")` <a href="#window-pylon-settheme" id="window-pylon-settheme"></a>

Sets the chat window theme based on the provided argument. Valid values are `light` and `dark`, e.g. `window.Pylon("setTheme", "dark")`. The widget uses light mode until you call this, and remembers the choice in the user's browser. You can set your light mode and dark mode palettes on the widget's **Styling** tab (see [Styling](/pylon-docs/chat-widget/styling)).

## `window.Pylon("onChangeUnreadMessagesCount")` <a href="#window-pylon-onchangeunreadmessagescount" id="window-pylon-onchangeunreadmessagescount"></a>

Pass in a callback function that is called immediately and when the unread message count changes. If you pass in `null` as the callback function, the existing callback is removed.

```javascript
window.Pylon("onChangeUnreadMessagesCount", function (unreadCount) {
  console.log("unread changed!", unreadCount);
});
```

## `window.Pylon("onPopupMessageVisibilityChange")` <a href="#window-pylon-onpopupmessagevisibilitychange" id="window-pylon-onpopupmessagevisibilitychange"></a>

Pass in a callback function that is called with `true` or `false` when the preview of a new reply above the chat bubble appears or disappears. Pass in `null` to remove the existing callback.

```javascript
window.Pylon("onPopupMessageVisibilityChange", function (isShowing) {
  console.log("reply preview showing:", isShowing);
});
```

## `window.Pylon("onPopupSurveyVisibilityChange")` <a href="#window-pylon-onpopupsurveyvisibilitychange" id="window-pylon-onpopupsurveyvisibilitychange"></a>

Pass in a callback function that is called with `true` or `false` when a popup survey appears or disappears. Pass in `null` to remove the existing callback.

```javascript
window.Pylon("onPopupSurveyVisibilityChange", function (isShowing) {
  console.log("survey showing:", isShowing);
});
```

## `window.Pylon("onSurveySubmitted")` <a href="#window-pylon-onsurveysubmitted" id="window-pylon-onsurveysubmitted"></a>

Pass in a callback function that is called when the user submits a popup survey. It receives an object with `surveyType` (`CSAT`, `NPS`, or `GENERIC`), `score`, and, if the user left one, `feedback`. Pass in `null` to remove the existing callback.

```javascript
window.Pylon("onSurveySubmitted", function ({ surveyType, score, feedback }) {
  console.log("survey submitted", surveyType, score, feedback);
});
```

## `window.Pylon("setNewIssueCustomFields")` <a href="#window-pylon-setnewissuecustomfields" id="window-pylon-setnewissuecustomfields"></a>

Pass in an object of custom field slugs to their values. New issues created through the Chat Widget messaging will have these custom fields values set. Values can be strings, numbers, or booleans. Fields with `null` or `undefined` values are ignored.

You must first create the corresponding custom fields [inside of Pylon](https://app.usepylon.com/settings/issue-custom-fields).

{% hint style="info" %}
Be sure to use the custom field slug, not the label!
{% endhint %}

Example:

```javascript
window.Pylon("setNewIssueCustomFields", { user_id: "abc123" });
```

You can find the slug value on the custom fields [page](https://app.usepylon.com/settings/issue-custom-fields) next to the custom field.

<figure><img src="https://mintlify.s3-us-west-1.amazonaws.com/pylon/images/chat-slug.png" alt=""><figcaption></figcaption></figure>

## `window.Pylon("setTicketFormFields")` <a href="#window-pylon-setticketformfields" id="window-pylon-setticketformfields"></a>

Pass in an object of field slugs to their values. Ticket forms in the Chat Widget will have these values set as default values. For multi-select fields, pass an array of values.

Note that the passed object will apply to all ticket forms. Superfluous and/or invalid fields will be ignored.

Example:

```javascript
window.Pylon("setTicketFormFields", {
  subject: "I need help on Pylon because...",
  affected_products: ["billing", "reporting"],
});
```

You can find the slug value on the custom fields [page](https://app.usepylon.com/settings/issue-custom-fields) next to the custom field.

<figure><img src="https://mintlify.s3-us-west-1.amazonaws.com/pylon/images/chat-slug.png" alt=""><figcaption></figcaption></figure>

## `window.Pylon("setVisibleTicketForms")` <a href="#window-pylon-setvisibleticketforms" id="window-pylon-setvisibleticketforms"></a>

Pass in an array of ticket form slug strings to make those ticket forms visible in the Chat Widget. Pass in `null` to revert back the originally visible ticket forms.

{% hint style="info" %}
Only ticket forms that are selected in a Form Set within the Chat Widget's settings are allowed. In the example below, the ticket forms with the slugs `test-ticket-form-1` and `test-ticket-form-2` will not become visible unless they are also selected as part of any Form Set within the Chat Widget's settings.
{% endhint %}

Example:

```javascript
window.Pylon("setVisibleTicketForms", ["test-ticket-form-1", "test-ticket-form-2"]);
```

The ticket form slug can be found in the edit ticket form page under `Form Slug`.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FSsodw5UjG5Nc2DhYSwM6%2FScreenshot%202025-12-01%20at%205.32.37%E2%80%AFPM.png?alt=media&amp;token=58eabf60-768d-467b-9547-a6479dbfce70" alt=""><figcaption></figcaption></figure>

## `window.Pylon("showNewMessage", "string")` <a href="#window-pylon-shownewmessage-string" id="window-pylon-shownewmessage-string"></a>

Opens a new conversation with a message prepopulated in the editor. For example, use this when a user runs into an error in your application and you want to prefill a message they can submit. Call it with no message to open a blank new conversation.

```javascript
window.Pylon("showNewMessage", "I'm experiencing an issue with syncing from Google Sheets to Email and could use some assistance");
```

Optionally, this string can also be HTML. For example, for rendering a link. Pass an optional argument indicating the message to be shown is HTML.

NOTE: Only specific HTML tags are supported: `<a>`, `<b>`, `<p>`, and `<i>`. If other tags are used, the editor may error.

```javascript
window.Pylon("showNewMessage", "I'm experiencing an issue with <a href='https://www.app.company.com/sync/123'>syncing</a> from Google Sheets to Email and could use some assistance", { isHtml: true});
```

To set custom fields on just this conversation, pass `customFields`. These are merged over any values set with [`setNewIssueCustomFields`](#window-pylon-setnewissuecustomfields).

```javascript
window.Pylon("showNewMessage", "Sync failed for workspace 123", {
  customFields: { workspace_id: "123" },
});
```

The message can be at most 2,500 characters. `showNewMessage` does nothing when the Chat module is turned off for the user.

## `window.Pylon("showIssue", "string")` <a href="#window-pylon-showissue" id="window-pylon-showissue"></a>

Opens the chat window to an existing conversation, by issue ID. Use it with `onActiveIssueChange` or `getCurrentIssue` to restore the conversation a user had open, for example after a page reload.

```javascript
window.Pylon("showIssue", "3f2b6c1e-8a4d-4c1b-9e2f-1a2b3c4d5e6f");
```

## `window.Pylon("getCurrentIssue")` <a href="#window-pylon-getcurrentissue" id="window-pylon-getcurrentissue"></a>

Returns the conversation open in the chat window as `{ issueID, issueNumber }`, or `null` if none is open. Unlike other methods, this returns a value directly, so call it after the widget has loaded (calls queued before then return nothing).

```javascript
const current = window.Pylon("getCurrentIssue");
```

## `window.Pylon("onActiveIssueChange")` <a href="#window-pylon-onactiveissuechange" id="window-pylon-onactiveissuechange"></a>

Pass in a callback function that is called when the open conversation changes. It receives `{ issueID, issueNumber }`, or `null` when the user leaves the conversation. If a conversation is already open when you register the callback, it is called right away. Pass in `null` to remove the existing callback.

```javascript
window.Pylon("onActiveIssueChange", function (issue) {
  if (issue) {
    sessionStorage.setItem("pylonIssueID", issue.issueID);
  } else {
    sessionStorage.removeItem("pylonIssueID");
  }
});

const savedIssueID = sessionStorage.getItem("pylonIssueID");
if (savedIssueID) {
  window.Pylon("showIssue", savedIssueID);
}
```

## `window.Pylon("showTicketForm", "string")` <a href="#window-pylon-showticketform-string" id="window-pylon-showticketform-string"></a>

Navigates the chat bubble to a specified ticket form, by ticket form slug.

```javascript
window.Pylon("showTicketForm", "test_ticket_form");
```

The ticket form slug can be found in the edit ticket form page under `Form Slug`.

## `window.Pylon("showKnowledgeBaseArticle", "string")` <a href="#window-pylon-showknowledgebasearticle-string" id="window-pylon-showknowledgebasearticle-string"></a>

Navigates the chat bubble to a specified knowledge base article, by article ID.

```javascript
window.Pylon("showKnowledgeBaseArticle", "123456789");
```

The article ID can be found in the URL of the public view of a knowledge base article, as the first set of numbers following `articles/`. In the following example, the identifier is "1234567899"

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F0kYoAV0QsGlxwPcWJu6e%2Fimage.png?alt=media&amp;token=dcb8a3bb-ca25-4c86-892a-170ac7c5a122" alt=""><figcaption><p>https://support.usepylon.com/articles/1234567899-how-to</p></figcaption></figure>

It can also be found in the article settings panel in the Pylon app, under the article slug input.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fbb2fdkXMVVgcvolEqaCe%2Fimage.png?alt=media&amp;token=3e2d18cb-f41a-4347-9a20-501eec91cb2e" alt="" width="375"><figcaption></figcaption></figure>

## `window.Pylon("setLocale", "string")` <a href="#window-pylon-setlocale-string" id="window-pylon-setlocale-string"></a>

Sets the widget's language and saves it as the user's preferred language. **This reloads the page** so the new language takes effect.

Supported values: `en`, `es`, `et`, `fr`, `de`, `it`, `ja`, `ko`, and `pt-br` (`pt` is treated as `pt-br`). The language must also be one of your organization's supported languages.

```javascript
window.Pylon("setLocale", "fr");
```

If you already know the user's language when the page loads, set `locale` in `chat_settings` instead (see [Chat Setup](/pylon-docs/chat-widget/chat-setup)). It avoids the reload and takes priority over the saved preference.


# Mobile SDKs

Embed Pylon's chat widget in your iOS, Android, or React Native application.

## Overview

Pylon's mobile SDKs allow you to embed the chat widget directly in your mobile app, providing users with in-app support without leaving your application.

### Supported Platforms

* **iOS** - Native Swift SDK for iPhone and iPad apps
* **Android** - Native Kotlin SDK for Android devices
* **React Native** - Cross-platform SDK for React Native applications

### Setup

To integrate a mobile SDK:

1. Get your App ID from the [Chat Widget](https://app.usepylon.com/settings/chat-widget) settings ([EU](https://app.eu.usepylon.com/settings/chat-widget))
2. Follow the installation instructions for your platform in the GitHub repository
3. Initialize the SDK with your App ID
4. Set user information when a user logs in
5. Add the chat view to your app's UI

For detailed installation instructions and API documentation, visit the GitHub repository for your platform:

* [iOS SDK Documentation](https://github.com/pylon-labs/sdk-mobile/blob/main/ios/README.md)
* [Android SDK Documentation](https://github.com/pylon-labs/sdk-mobile/blob/main/android/README.md)
* [React Native SDK Documentation](https://github.com/pylon-labs/sdk-mobile/blob/main/react-native/README.md)

### EU Data Hosting

If your organization uses EU data hosting, point the SDK at the EU widget by setting both of these in the SDK config:

* `widgetBaseUrl`: `https://widget.eu.usepylon.com`
* `widgetScriptUrl`: `https://widget.eu.usepylon.com/widget/APP_ID`

## What the SDKs Support

The SDKs load the same chat widget as the web, so your widget's [styling](/pylon-docs/chat-widget/styling) and [functionality](/pylon-docs/chat-widget/functionality) settings apply. Method names vary slightly by platform; see your platform's README for exact signatures.

**User details:** email and name (both required), avatar URL, account ID or account external ID, and an [HMAC email hash](/pylon-docs/chat-widget/identity-verification#hmac-email-hash) for identity verification. You can update or clear the user after login.

**Methods:**

* Open and close the chat window
* Show and hide the chat bubble
* Open a new message, optionally prefilled with text or HTML
* Set custom fields on new issues
* Prefill ticket form fields
* Open a ticket form or knowledge base article

**Events:**

* Widget loaded, initialized, and ready
* Chat opened and closed
* Unread message count changed
* Message received
* Error

### Not Supported in the SDKs

These web widget features aren't available in the mobile SDKs:

* JWT identity verification. Use the HMAC email hash instead.
* `contact_id` / `contact_external_id`
* Setting the widget language (`locale` or `setLocale`)
* `setTheme` (dark mode)
* Push notifications
* `showIssue`, `getCurrentIssue`, and `onActiveIssueChange`
* `setVisibleTicketForms`
* Survey and popup visibility events
* Per-message `customFields` on `showNewMessage`


# Customer Overview

See the accounts, signals, and work that need your attention in one place

The CSM & CS Leader Overview is your home base for customer success. Open it from [Customers > Overview](https://app.usepylon.com/customers/home) to see your book of business, the accounts that need attention, and the work due today, all on one page.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FG4lSVWqnGfHYMy5f5Fzx%2Foverview-hero.png?alt=media&amp;token=78b0635d-8bd0-4cee-83a0-97d867647d4a" alt="The Customer Overview page"><figcaption></figcaption></figure>

Use it to:

* Plan your day with your meetings, projects, tasks, and issues
* Spot churn risks, upcoming renewals, and upsell opportunities with [Signals](/pylon-docs/account-intelligence/customer-overview/signals)
* Track revenue and account health with charts
* Give each team its own set of views with [Overview Boards](/pylon-docs/account-intelligence/customer-overview/overview-boards)

### Daily Overview

The panel on the left shows your meetings for today, projects and tasks due soon, and issues waiting on you. Choose **Configure** from a section's **...** menu to change its filters. Meetings require a connected [Calendar](/pylon-docs/integrations/calendar).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FCbw6t7TF8cdhlZTGpuAw%2Fdaily-overview.png?alt=media&amp;token=2bb4d4ad-5f88-4f16-a30f-e3408f2c0bd7" alt="The daily overview panel" width="320"><figcaption></figcaption></figure>

### Default Views

Everyone starts with the **CSM Home** view, which shows the accounts you own with a Signal table and an Accounts table. Your workspace may also include a **CS Leader Starter Template** with revenue charts (GRR and NRR), signals, and accounts. Add it from **+ View**.

Admins can choose which views each team sees by setting up [Overview Boards](/pylon-docs/account-intelligence/customer-overview/overview-boards).

***

{% content-ref url="/pages/riA2qBrW8ut37hVxBFyj" %}
[Signals](/pylon-docs/account-intelligence/customer-overview/signals)
{% endcontent-ref %}

{% content-ref url="/pages/6TXCWcDiZlgLTHph78oB" %}
[Overview Boards](/pylon-docs/account-intelligence/customer-overview/overview-boards)
{% endcontent-ref %}

{% content-ref url="/pages/g7KAWSWUGTlFPbnT6RIV" %}
[Views](/pylon-docs/account-intelligence/customer-overview/views)
{% endcontent-ref %}

{% content-ref url="/pages/wpgLWFWejXXf1ePN2hxq" %}
[Blocks](/pylon-docs/account-intelligence/customer-overview/blocks)
{% endcontent-ref %}


# Signals

Let AI flag the accounts that need your attention.

Signals use AI to flag accounts that need attention, like a customer thinking about cancelling or asking about an upgrade. Pylon reviews each account's issues, calls, messages, and other activity, and only shows a signal when it can point to the sources behind it.

### Signal Templates

Start from one of Pylon's templates, or write your own:

* **Churn risks**: clear signs a customer may cancel, downgrade, or switch to a competitor
* **Upcoming renewals**: renewals in the next 3 months, or later renewals that need work to start now
* **Potential upsells**: clear asks to buy more, upgrade, or talk about pricing

### Creating Signals

Choose **Edit signals** from a Signal table's **...** menu, or click the **Signals** field in [Account Data settings](https://app.usepylon.com/settings/account-data). Then click **Add Signal** and fill in:

* **Label and color**: how the signal appears on accounts
* **AI prompt**: when the signal should show. Type `{{` to insert account fields.
* **Data sources** and **Time filter** (optional): limit what the AI reviews, like only calls from the last 30 days

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F2M0TJTtWDd4K2GUraoT2%2Fsignal-editor.png?alt=media&amp;token=d0c882e2-aabf-439b-b4a6-7af99f233513" alt="The signal editor" width="420"><figcaption></figcaption></figure>

Click **Templates** to start from a template, or **Draft with AI** to have AI write the signal for you. You can create up to 100 signals.

Saving a new signal, or changing a signal's prompt or filters, checks your accounts again.

{% hint style="info" %}
Signals are checked for Plus accounts that have an account owner and customer activity in the last 60 days.
{% endhint %}

### Reviewing Signals

The Signal table shows every account with open signals. Click an account to see its signals. Each signal shows a summary of why it was flagged and its **Sources**, such as issues, calls, and messages. Hover a source to see why it supports the signal.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fl8YSeVLFfyuii315PITy%2Fblock-signals.png?alt=media&amp;token=f7cc7a52-b65a-4d0e-81c6-9bc69982bf3c" alt="Signal table"><figcaption></figcaption></figure>

Signals stay up to date as new activity comes in. If AI decides a signal no longer applies, Pylon removes it. To check every account in a view again, choose **Regenerate AI blocks** from the view's **...** menu.

### Taking Action

Each signal comes with suggested projects: a project drafted by AI, plus any [Project Templates](/pylon-docs/account-intelligence/tasks-and-projects/project-templates) set up for that signal. From the account's signals you can:

* Open a suggested project, edit it, and click **Launch Project**
* Choose **Create or link project** to start a project from a template or from scratch, or link an existing project

Once a project is launched, the signal shows the project's progress. To suggest a template for a signal, open the template and add the signal under **Signal suggestions**.

### Dismissing Signals

If a signal doesn't need action, hover it and click **Dismiss**. It only comes back if something meaningfully changes.

### Permissions

Creating and editing signals requires full access to **Account Custom Fields**. Launching projects and dismissing signals requires full access to **Tasks**. Learn more in [Roles & User Management](/pylon-docs/platform/roles-and-user-management).


# Overview Boards

Choose which views each team sees on their Overview.

Admins can give each team a board of views built for how they work. For example, CSMs can see a view of their own accounts, while CS leaders see revenue and team-wide signals.

Manage boards from [Overview settings](https://app.usepylon.com/customers/home/managed), also available from the **...** menu on the Overview.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fa3V6rEZjMmCVSrl7x7GB%2Foverview-settings.png?alt=media&amp;token=636b242c-0066-403f-9a22-5d2d415360eb" alt="Overview settings"><figcaption></figcaption></figure>

### Creating a Board

1. Click **Add Overview Board**.
2. Name the board and use **Assign to** to pick teams or users.
3. Under **Preview**, click **+ View** to add views.
4. Click **Save**.

Views on a board show first for everyone assigned to it, and only admins can edit them.

### Board Order

If someone is assigned to more than one board, they see the first one in the list. Drag boards to change the order. Anyone who isn't assigned to a board sees the **Everyone else** board.

### Personal Views

When you save a new board, choose **Only Assign** to keep members' personal views after the board's views, or **Assign and Override** to remove them. To override later, choose **Override assigned members** from the board's **...** menu.

### All Views

The **All views** tab lists every view in your workspace, with who can see it and who uses it. Select views to change their visibility or delete them in bulk. Deleting a view removes it for everyone, including from any boards that use it.

### Permissions

The **Home page views** permission in [Roles & User Management](/pylon-docs/platform/roles-and-user-management) controls access to the Overview:

* **No access**: Can't see the Overview
* **View**: Can see views, but can't save changes. Default for Viewers.
* **Edit**: Can also create and edit their own views. Default for Members.
* **Full access**: Can also manage boards and edit any view. Default for Admins.


# Views

Create, customize, and share views on your Overview.

Each view is a tab on your Overview with its own filters, daily overview, and blocks. Filters at the top of a view apply to every block in it, for example to only show accounts you own.

### Creating Views

Click **+ View** to add a view that has been shared with you, or **Create view** to start from scratch. Drag tabs to reorder them, and click a tab's name to rename it.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FlwzloCLXycDDNJJN48th%2Fview-picker.png?alt=media&amp;token=f532d280-d5f1-4226-8a8c-eedf737f4059" alt="The + View picker" width="470"><figcaption></figcaption></figure>

### Editing and Saving

Make changes right on the page. Once you change something, **Save** and **Reset** appear. Use **Save as new view** from the menu next to **Save** to keep your changes as a private copy without changing the original.

The **...** menu next to the filters lets you duplicate, remove, or delete a view, or regenerate its AI blocks.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fmfkjc7Z2DuvVPjtRGCRO%2Fview-actions.png?alt=media&amp;token=397848eb-5c28-4981-9b8d-060ddcf04967" alt="The view actions menu" width="375"><figcaption></figcaption></figure>

### Sharing

Use the **Access** button to choose who can see a view: **Anyone**, **Some members**, or **Only me**.

{% hint style="info" %}
Views created by someone else, and views on an overview board, are read-only unless you're an admin. You can still change filters to explore, but your changes won't be saved.
{% endhint %}


# Blocks

Add blocks to a view to build the layout you want.

Click **Add Block** to open the blocks sidebar, then click a block to add it or drag it into place. Up to four blocks fit side by side in a row.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fvp8olBQR73dypHEQAd7H%2Fadd-blocks.png?alt=media&amp;token=1457efc2-7c3c-44f6-9f6d-b0cfa7041e80" alt="The Add blocks sidebar" width="375"><figcaption></figcaption></figure>

### Signal Table

See every account with open [Signals](/pylon-docs/account-intelligence/customer-overview/signals), such as churn risks, upcoming renewals, and potential upsells. Click a row to review each signal and its sources, dismiss it, or create or link a project to act on it.

Use **Edit layout** to change columns, row height, sorting, and grouping by account owner. Choose **Edit signals** from the block's **...** menu to manage which signals Pylon looks for.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fl8YSeVLFfyuii315PITy%2Fblock-signals.png?alt=media&amp;token=f7cc7a52-b65a-4d0e-81c6-9bc69982bf3c" alt="Signal table block"><figcaption></figcaption></figure>

### Accounts Table

A table of accounts with the columns, filters, and sorting you choose. Edit field values right from the table. Each view can have one Accounts table.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2F9Gl8SvSxEELbsqpLuIIi%2Fblock-accounts.png?alt=media&amp;token=2247a914-212a-462f-9db8-b8c6ba936d7b" alt="Accounts table block"><figcaption></figcaption></figure>

### Analytics

Choose any of your existing analytics charts, or build your own with [Custom Dashboards](/pylon-docs/reporting-and-analytics/custom-dashboards).

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FTOoB8dMO445hmMRULQ11%2Fblock-analytics.png?alt=media&amp;token=3f535630-286d-42a5-9a86-a39a47047b40" alt="Analytics blocks showing metrics"><figcaption></figcaption></figure>

### Meetings Table

A list of past and upcoming meetings, from the next 24 hours up to the last 90 days.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fl2alq73jTrTzQfc9327U%2Fblock-meetings-table.png?alt=media&amp;token=40cee3d3-33fb-47e0-9fa4-9b08d8be29da" alt="Meetings table block"><figcaption></figcaption></figure>

### Issues Table

A list of recent issues with your own filters, columns, and sorting.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FEzBoZnrwvHVofKbkQq3z%2Fblock-issues.png?alt=media&amp;token=e1d9c13a-1f35-4321-8a47-9c6e2f9ff01e" alt="Issues table block"><figcaption></figcaption></figure>

### Tasks Table

A list of [Tasks & Projects](/pylon-docs/account-intelligence/tasks-and-projects) tasks with their status and due dates. Add new tasks right from the table.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FJAXLFP5nB7Qli3TPuQJA%2Fblock-tasks.png?alt=media&amp;token=7040bd41-5880-4d41-ba62-5f1b3167b8c0" alt="Tasks table block"><figcaption></figcaption></figure>

### Notes

An area for timestamped notes. Best suited as a running log.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FzYjeChFTwfwqhF2Ej07K%2Fblock-notes.png?alt=media&amp;token=373e1cfc-dbfb-4262-8fb8-3ea69ed99ac2" alt="Notes block"><figcaption></figcaption></figure>

### Text Block

An area for free-form rich text that saves automatically.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FRnQQaELP1eUGtqvyqaIT%2Fblock-text.png?alt=media&amp;token=9a9008a8-8acd-45a2-9ba0-808189c21928" alt="Text block"><figcaption></figcaption></figure>

### Section Header

A header to help organize the blocks in your view.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FS7otgqlOl8vvJBJ65gkz%2Fblock-section.png?alt=media&amp;token=9d3700eb-81d0-4d42-8423-905e155355c0" alt="Section header block"><figcaption></figcaption></figure>


# Accounts

Track, manage, and action on all your accounts with intelligent context

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2Fo3F6vyqbO6dmn6OZBFn2%2FAccount%20Intelligence%20Higher%20Res.gif?alt=media&amp;token=9c1aa1ed-915e-40d8-bc4c-a2639a705ada" alt=""><figcaption></figcaption></figure>

Track potential business and CRM records associated with an account using [Opportunities](/pylon-docs/account-intelligence/opportunities).

## Enable or disable accounts

Select accounts in the accounts table and use **Status** to enable or disable them in bulk. Confirm the selected action before it runs.

Disabling an account removes Pylon from its external channels and turns off Pylon functionality on the account. Existing ticket history is preserved.

Enabling an account adds Pylon to its public external channels. For private channels, add Pylon to the channel directly before enabling the account.

***

{% content-ref url="/pages/GS5WrehW7GRhAfQCdqu0" %}
[Notebooks](/pylon-docs/account-intelligence/notebooks)
{% endcontent-ref %}

{% content-ref url="/pages/7eNsxvVzvIF8PQiNXPZD" %}
[Tasks & Projects](/pylon-docs/account-intelligence/tasks-and-projects)
{% endcontent-ref %}

{% content-ref url="/pages/gAte8BEVixexc5X4zGmZ" %}
[Formulas](/pylon-docs/account-intelligence/fields/formulas)
{% endcontent-ref %}

{% content-ref url="/pages/xmV6ZVrzvIHQcahAUYwB" %}
[AI Fields](/pylon-docs/account-intelligence/fields/ai-fields)
{% endcontent-ref %}

{% content-ref url="/pages/jjszFPoAYTX0gMdqeHbm" %}
[Views](/pylon-docs/account-intelligence/accounts/views)
{% endcontent-ref %}

{% content-ref url="/pages/KwZgqP7j5peulcTwyeTo" %}
[Copilot](/pylon-docs/account-intelligence/accounts/copilot)
{% endcontent-ref %}

{% content-ref url="/pages/ztrI63HFvw1QcxuqbiTg" %}
[Memories](/pylon-docs/account-intelligence/accounts/memories)
{% endcontent-ref %}


# Views

Customize how you view and act on accounts

Create views for:

* Books of business for different account managers or CSMs
* Accounts that are at risk or have upsell opportunities based on a wide array of signals
* Customers with revenue > $5,000 who onboarded in the last month and their progress against the onboarding [Project Templates](/pylon-docs/account-intelligence/tasks-and-projects/project-templates)

## Sharing and editing

When saving a custom view, use **Who can view?** to choose **Anyone**, **Some members** (specific users and teams), or **Only me**. Use **Who can edit?** to choose who can update the saved view. Editors must also be included in its viewing audience.

Editors can save changes to the shared view, rename it, change its sharing settings, and delete it. Other viewers can change filters, sorting, and columns temporarily and create their own view, but can't overwrite the shared view.

## Spreadsheet

Use the spreadsheet view to quickly make edits to fields on accounts and visualize account fields.

Customize your columns by choosing fields you've set up on your Accounts to display. Columns can be reordered or resized. Finalize your view before saving into a view for yourself or your team.

You can also manipulate your view with Account-based filter fields, similar to how you would with Issue [Views](/pylon-docs/support-workflows/issues/views#filters).

Here's an example of a custom Accounts view set to filter for current customers:

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FpptVogkaZZyxuUiMQ46E%2FCleanShot%202025-03-24%20at%2021.40.59%402x.png?alt=media&amp;token=9dd51230-b656-4cc1-a41f-de1bd3f16c94" alt=""><figcaption></figcaption></figure>

### Aggregations

Add column level aggregations, for example to sum revenue across a book or count the number of accounts that have a field filled.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FgmsVxsUEXRoY5MIOP2e2%2FCleanShot%202025-08-10%20at%2020.57.08%402x.png?alt=media&amp;token=1ed2c804-693d-4c13-9a5a-eb706bc84f63" alt="" width="167"><figcaption></figcaption></figure>

### Formatting

Create conditional formatting rules to change font color cell color based on a range of conditions.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FSzN4iGnRdw3hlBEOJChs%2FCleanShot%202025-08-10%20at%2020.42.33%402x.png?alt=media&amp;token=4f609315-2278-47ac-baf4-0ee04cb2c593" alt=""><figcaption></figcaption></figure>


# Copilot

Use AI to help quickly pull up information from an account

{% hint style="info" %}
Account Copilot draws from Pylon issues, [Call Recording](/pylon-docs/integrations/call-recording) integrations, [Notebooks](/pylon-docs/account-intelligence/notebooks), and any other [connected data](/pylon-docs/platform/training-data).
{% endhint %}

### Ask AI

Ask AI allows you to ask open-ended questions to help answer questions about any account. All answers will also pull up citations to related content.

<figure><img src="https://982123570-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F9hXBoCTTNw5flARlUVJf%2Fuploads%2FvFvyeg5qucGnbu5AIleq%2FCleanShot%202025-03-26%20at%2011.21.48%402x.png?alt=media&amp;token=f5f1d1b3-a122-4032-bfc9-022749fb12e0" alt="" width="375"><figcaption></figcaption></figure>




---

[Next Page](https://docs.usepylon.com/pylon-docs/llms-full.txt/1)

