').text(selectedLabel));
html.append(closedEnded);
}
// Handle Open-Ended Question Section
var openEndedQuestion = response.survey_response.answers.find(answer => answer.type === 'open_ended');
if (openEndedQuestion) {
var openEnded = $('
');
openEnded.append($('
').text(openEndedQuestion.question.headline.value));
openEnded.append($(' ').text(openEndedQuestion.value));
html.append(openEnded);
}
return html;
}
```
# Conclusion
The new Customizable CSAT survey API is quite easy to use and allows for insights that currently aren't available via native UI features in Zendesk. I do hope that sooner rather than later the Agent Workspace will natively reflect the new survey responses, making apps like mine unnecessary.
As for the API itself, I'd love for a way to retrieve surveys for a given ticket or user more directly than going via the Audit Log api for a given ticket. There's also currently no POST or PUT endpoint so you can't create integrations that allow customers to give feedback. You have to go over the native Messaging or Email triggers.
## Sign up for Internal Note
Turning Zendesk into practice. – A newsletter about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Using Switchboard to combine Zendesk Bots and AI Agents powered by Ultimate
URL: https://internalnote.com/using-switchboard-to-combine-zendesk-bots-and-ai-agents-powered-by-ultimate/
Last updated: 2025-04-14T07:07:34.000Z
Earlier this month I wrote a big article on the history of Zendesk Conversation channels. This article explained the multiple solutions Zendesk offered with regard to chat channels ranging from the old Zopim Chat right up to their newest AI Agents powered by Ultimate.
[A History of Zendesk chat and messaging channelsOver the years, Zendesk evolved from simple email ticketing to offering a full suite of customer care solutions. They now support multiple channels, AI agents, social integrations, and web widgets. This article will dive into how their complex platform works, helping navigate conversational setups.Internal NoteThomas Verschoren](https://internalnote.com/history-of-zendesk-messaging/)
One of the sections of the article showed the following flowchart, showing a setup where a customer has both an AI Agent running on the existing Zendesk Bot technology, and a modern bot powered by Ultimate.

Since more and more Zendesk users will be doing the upgrade to this more modern and powerful automation solution the coming months, chances are that some of them will run into this exact scenario.
When migrating bot platforms you can't just migrate all your brands and flows at once. Most customers will want to approach this with a phased process where they migrate one brand (or channel) at a time from the *Zendesk Bot* to *Ultimate.* Or, if you're coming from the likes of Ada or Certainly, you might want to temporarily run your Ada bot and Zendesk AI Agent in tandem.
This article will show you how to set this up.
# Some context
Zendesk Suite comes with the Sunshine Conversations platform build in. Sunshine Conversations, or SunCo in short is the engine that connects channels like WhatsApp or a web widget, Bots like Ultimate or Zendesk, and Agent environments like Zendesk together.
Within SunCo there's a tool called switchboard. The switchboard orchestrates the interaction between customers, agents and bots by routing an incoming conversation to the right AI Agent, and escalate to the right platform.
Each Zendesk environment, regardless of having actively used SunCo or not, has a switchboard. This switchboard links your messaging channels to the Zendesk Bots, and handles the handover from bot to agents in the Agent Workspace.
The switchboard has a list of switchboard integrations linked to it. These integrations are your bots and agent environments. The switchboard has a default integration it routes *all* conversations too, and your integrations all have a default next responder. So for example you can have the Zendesk Bot as the default integration, and it hand off conversations to the Zendesk Workspace.
Your entire SunCo setup has a list of integrations linked to it, these are your social channels, web widgets and mobile SDKs. Each integration has a default responder (one of the switchboard integrations), and also lists a next responder for when e.g. the bot escalates to an agent. Those responders can be the default ones, or ones specifically set for that integration.
All interactions with the switchboard and its integrations happens on the API level, so when you want to make change or inspect the switchboard you need to setup a Sunshine Conversation API credentials in the Admin Center.

💡
You can find more info on the `url`, and `appId` and tokens to be used in the [SunCo documentation](https://docs.smooch.io/guide/authentication-overview/?ref=internalnote.com).
# Gathering the initial context
## Switchboard
The first API call we're going to make is one to `{{url}}/v2/apps/{{appId}}/switchboards`
This returns our main switchboard used by our Zendesk instance. From this data we need to copy the `id` of the switchboard, in our case *5f8ece73c031ec000c74a680.*
```json
{
"switchboards": [
{
"id": "5f8ece73c031ec000c74a680",
"enabled": true,
"defaultSwitchboardIntegrationId": "6419d5aad477770116cfa596"
}
]
}
```
## Switchboard integrations
Once we have our switchboard, we can collect its integrations. We do this by making an API call to `{{url}}/v2/apps/{{appId}}/switchboards/{{id}}/switchboardIntegrations` with `id` being the switchboard id we captured in the previous step.
This returns an array of all the current switchboard integrations. You'll find two important ones in this list: `zd:agentWorkspace` – in other words, your agents – and `zd:answerBot` – your Zendesk Bots.
```json
{
"switchboardIntegrations": [
{
"id": "5f8ece7337f5bd000d6ae0ff",
"name": "zd-agentWorkspace",
"integrationId": "5f8ecbf2e2059d2c993eab02",
"integrationType": "zd:agentWorkspace",
"deliverStandbyEvents": false,
"nextSwitchboardIntegrationId": "6419d5aad477770116cfa596",
"messageHistoryCount": 10
},
{
"id": "6419d5aad477770116cfa596",
"name": "answerBot",
"integrationId": "5f8ece75e2059d2c9995186b",
"integrationType": "zd:answerBot",
"deliverStandbyEvents": false,
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff",
"messageHistoryCount": 10
}
]
}
```
If your instance has multiple brands and bots you might wonder why you're seeing only one `zd:answerBot` in this list. Zendesk obfuscates the list of bots in your instance and takes care of routing the right channel (brand) to the right bot with internal logic not accessible over the SunCo APIs. But no need to worry, you can (un)link Zendesk bots to channels in the Admin Center and Zendesk takes care of their own native bots.
The item we want to note down here is the `integrationId` of the `zd:answerBot`, in our case *5f8ece75e2059d2c9995186b.*
## Integrations
And finally we need a list of the existing integrations in our instance. We need the IDs of these integrations so that, once we link the Ultimate bot, we can revert some of these channels back to being linked to the Zendesk Bot.

We can collect all integrations by calling `{{url}}/v2/apps/{{appId}}/integrations` . This returns a long list of channels similar to this one (I removed some elements to make it more readable)
```json
{
"integrations": [
{
"id": "61ea8723f4aa6100eb8a69e5",
"type": "web",
"displayName": "Internal Note",
"defaultResponder": {
"id": "6419d5aad477770116cfa596",
"integrationId": "5f8ece75e2059d2c9995186b",
"integrationType": "zd:answerBot",
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff"
}
},
{
"id": "646b411abc0c536ba1a98263",
"type": "whatsapp",
"displayName": "WhatsApp",
"defaultResponder": {
"id": "6419d5aad477770116cfa596",
"integrationId": "5f8ece75e2059d2c9995186b",
"integrationType": "zd:answerBot",
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff"
}
},
{
"id": "6706411852c663af3215a44f",
"type": "web",
"displayName": "AI Agent (Ultimate)",
"defaultResponder": {
"id": "6419d5aad477770116cfa596",
"integrationId": "5f8ece75e2059d2c9995186b",
"integrationType": "zd:answerBot",
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff"
}
}
]
}
```
If we look closes to one of the integrations we'll note a few things:
```json
{
"id": "61ea8723f4aa6100eb8a69e5",
"type": "web",
"displayName": "Internal Note",
"defaultResponder": {
"id": "6419d5aad477770116cfa596",
"integrationId": "5f8ece75e2059d2c9995186b",
"integrationType": "zd:answerBot",
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff"
}
}
```
The `id` is the id of the integration, and is what we use in the API to make changes to its configuration. Note down the IDs of the channels you want to keep on Zendesk, in my case it's one of the web widgets and my WhatsApp channel.
The `defaultResponder > integrationId` is where we define which Bot (or switchboard integration) answers when a customer talks to that channel. In our case this is currently always the Zendesk Bot. The `nextSwitchboardIntegrationId` defines who should pick up the conversation if the bot needs to escalate. In our case this corresponds with the Agent Workspace.
# Connecting Ultimate
Connecting Ultimate to Zendesk happens via a Sunshine Conversation integration. This is entirely handled within Ultimate via a nice UI flow, but you do need to grab a set of Sunshine Conversation API credentials from the Zendesk Admin Center first. I **highly** recommend creating a new pair of credentials for this so you can keep a clear overview of tokens used for your own API work, Ultimate, and [outbound messages](https://internalnote.com/relay-app/) via e.g. the Relay app.


When linking Ultimate to Zendesk you can choose between SunCo or SunCo groups. I prefer the latter. The setup is a bit more convoluted but it allows for linking multiple Ultimate bots to Zendesk. You can use Ultimate's routing rules to define which bot should answer which channel, similar to how you would setup Zendesk Bots and multiple channels in Zendesk itself.

Once you link Ultimate **all** your channels will answer with the Ultimate Bot you just configured. If we take a look at our previous integrations list for example, we'll now see that our integration has a new `defaultResponder`, while retaining all other settings.
```json
{
"id": "61ea8723f4aa6100eb8a69e5",
"type": "web",
"displayName": "Internal Note",
"defaultResponder": {
"id": "670646ef88ab3af5a96c49b1",
"integrationId": "670646eeec1612bbbc225995",
"integrationType": "ultimate",
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff"
}
}
```
## Reverting some channels back to Zendesk
In my setup I have two brands. One is Internal Note, one is my Ultimate demo environment.
While I want to keep the web widget I created in Zendesk for Ultimate to remain linked to the Ultimate AI Agent, I want to make sure that my Web Widget and WhatsApp channel for Internal Note still answer with a Zendesk Bot. Otherwise all [demos](https://internalnote.com/tag/bots-and-messaging/) I build for this website will break.
[Learn how to build a full-featured Flow Builder Bot for Zendesk.In this article we will build a full-featured Flow Builder Bot for Zendesk. We’ll use every step type, use API calls and variables and show you how to create a bot yourself in a full length video tutorial.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-dinosaurs/)
In order to revert some integrations back to the Zendesk Bot we need to execute a final API call for each integration we want to revert.
We need to send a PATCH command to the following url: `{{url}}/v2/apps/{{appId}}/integrations/{{id}}` with `id` being the id of the integration we want to update.
The payload of this patch command contains the `id` of the `switchboardIntegration` we want to set as its `defaultResponder`, in my case the `id` of the `zd:AnswerBot` collected earlier in this article.
```json
{
"defaultResponderId": "6419d5aad477770116cfa596"
}
```
Once you've executed this command for each integration, you'll end up with a new integrations list that looks like this:
```json
{
"integrations": [
{
"id": "61ea8723f4aa6100eb8a69e5",
"type": "web",
"displayName": "Internal Note",
"defaultResponder": {
"id": "6419d5aad477770116cfa596",
"integrationId": "5f8ece75e2059d2c9995186b",
"integrationType": "zd:answerBot",
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff"
}
},
{
"id": "646b411abc0c536ba1a98263",
"type": "whatsapp",
"displayName": "WhatsApp",
"defaultResponder": {
"id": "6419d5aad477770116cfa596",
"integrationId": "5f8ece75e2059d2c9995186b",
"integrationType": "zd:answerBot",
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff"
}
},
{
"id": "6706411852c663af3215a44f",
"type": "web",
"displayName": "AI Agent (Ultimate)",
"defaultResponder": {
"id": "670646ef88ab3af5a96c49b1",
"integrationId": "670646eeec1612bbbc225995",
"integrationType": "ultimate",
"nextSwitchboardIntegrationId": "5f8ece7337f5bd000d6ae0ff"
}
}
]
}
```
# End User experience
The above is quite technical, but luckily for our end-user we end up with a nice experience with two very web widgets that respond with either a Zendesk or an Ultimate powered AI Agent.


### Filter custom ticket statuses per form.
URL: https://internalnote.com/form-based-custom-statuses/
Last updated: 2025-09-08T06:40:45.000Z
💡
This is a Spotlight article. A short article on a new feature that's not emailed to subscribers but will be part of the monthly [roundup](https://internalnote.com/tag/zendesk-roundup/). This lowers the amount of emails you get, while still get the information you want.
Last year Zendesk released [Custom Ticket Statuses](https://internalnote.com/tag/custom-ticket-status/), a way to expand the native new, open, pending and solved ticket statuses with custom statuses that better match your company's processes.
These statuses are useful to eg highlight that a ticket is on-hold while you wait for an external supplier, or pending until the customer confirms something. It allows you to add a different open status for tickets that got a reply, versus those that get an update with an internal note or side conversation.
While these custom statuses are quite useful, they do clutter up the Submit menu, especially if you have a lot of them.

Example of a submit menu with a lot of custom statuses
Not every custom status is useful in every scenario though. A support form has no use for a "waiting for quote feedback" status that a sales form might need. Or a form to request returns and refunds might need your "waiting for shipment" or "refund method requester" status, whereas your product form might need a "waiting for supplier" status.
# Ticket statuses by form
The new *Ticket statuses by form* feature in Zendesk will fix this issue. You can now select specific statuses to be displayed per form, reducing long lists of statuses to short, more specific options.


An overview of forms and custom statuses
This new options is added as an additional tab to the Ticket Statuses menu. (Although arguably, since you select a form and add statuses to it, this might as well be an item of the forms menu, similar to how you add ticket fields to forms in that menu)

When you select a specific form you can toggle all the statuses you want to appear in the menu. Note, you can **only** filter custom statuses, the native open, pending, on hold and solved statuses will always appear in the menu.
Similarly, even though existing custom status you created *before* this feature was launched will by default by enabled for all forms (you can deselect them if needed), custom statuses that are added *after* this release will be disabled by default on all forms. It would be nice if the process of adding a custom status had a step to pick your forms in the same flow, but alas, that's not possible for now.


Once you filter your menu, changes are applied immediately to the Agent Workspace.

The same ticket view now with a reduced list of statuses.
## Sign up for Internal Note
Turning Zendesk into practice. – A newsletter about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Zendesk News Roundup for November 2024
URL: https://internalnote.com/roundup-2024-11/
Last updated: 2024-12-01T09:44:38.000Z
AI Agents. Agent Copilot. The new Zendesk Voice. Zendesk's AI Summit earlier this month turned out to be a giant release of new AI features across the entire Zendesk Suite.
If you want to read up on what's been announced, feel free to dive into my [AI Summit](https://internalnote.com/tag/ai-summit/) series before you read this month's roundup. Even though plenty of fun new things were released this month, I'm sure the really cool stuff is in the AI Summit articles.
When I started this blog three years ago I had a goal in mind to where I wanted to go with this platform. I've not yet checked of all items on my list, but earlier this week I did manage to cross of one **giant** one with a very cool share of one of my article by Zendesk CEO Tom Eggemeier on LinkedIn 🤯🤯🤯
[Tom Eggemeier on LinkedIn: AI Summit - the new Zendesk VoiceGreat piece on Zendesk Voice from Thomas Verschoren of Premium Plus - Zendesk's EMEA Partner of the Year Plus. He reinforces how essential it is to elevate and…LinkedInTom Eggemeier](https://www.linkedin.com/posts/tomeggemeier%5Fai-summit-the-new-zendesk-voice-activity-7257158138833903617-XcKm?utm%5Fsource=share&utm%5Fmedium=member%5Fdesktop)
Let's dive in the new stuff.
# 🏢 Company
### Increase in phishing attempts to Zendesk accounts
Let's start the roundup with an important notice: scammers have been actively to [phish Zendesk users](https://support.zendesk.com/hc/en-us/articles/8257723564186-Advisory-Increase-in-phishing-attempts-to-Zendesk-accounts?ref=internalnote.com) by emailing them trying to get access to their instance, pretending to be Zendesk.
🔒
Zendesk will ****never** reach out to you to change or ask for passwords in such a way.
My advice: enable 2FA on all your accounts, and hope Zendesk launches their [new two-step verification](https://support.zendesk.com/hc/en-us/articles/7955412933274-Announcing-two-step-verification-2SV?ref=internalnote.com) for unknown browser logins sooner rather than later!
If you're interesting in securing your Zendesk instance even more, take a look at the article below.
[Zendesk Security ChecklistOne of the big Trends for 2024 is the idea that security no longer is an add-on but should be seamlessly incorporated throughout the customer journey. To get started the right way, I’ve written a Zendesk Security Checklist. It’s a practical approach to improve the security of your Zendesk instance.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-security-checklist/)
### Admin Center revamp
The Admin Center got a nice update with a couple of new features on the home dashboard:
- **Zendesk updates**, a new place to discover all updates available on the platform. (Although, why go look for it when you can get them via email like this? 😇)
- **Feature usage**, a small dashboard that shows you how often you use triggers, automations and macros
This expand the previous updates to the Admin Center Home page with the availability of Storage usage, API usage and Automated resolutions status counters.

# 🎉 New Releases
## 🤖 AI Agents
### Multi Conversations

> Admins will be able to turn on multi-conversations for their account through the Admin Center and select the channels through which users can start new conversations.
> Agents will continue to see all incoming conversations linked to a user's profile, just as they do today, making it easy to view and address multiple conversations from an end user.
This is a very welcome release that's been a long time requested. The old [Sunshine Conversations](https://internalnote.com/history-of-zendesk-messaging/) widget used to support this feature, and I'm glad it's now available for all customers via the native Zendesk Widget.
If you want to get more information, take a look at my latest *Spotlight* article:
[Multiple Conversations in the Zendesk Messaging WidgetThe new multi-conversations in Zendesk Messaging allows for, well, multiple concurrent conversations with AI Agents and your team in the Zendesk Web Widget and Mobile SDK. This feature is now available to all customers.Internal NoteThomas Verschoren](https://internalnote.com/multi-conversations/)
### Meta pricing
> We have an exciting update from Meta regarding service conversations on the WhatsApp Business Platform. Starting **November 1, 2024, service conversations will be free within the 24-hour customer service window**. This is regardless of volume, instead of the current capped 1,000 free service conversations. (Thanks [Chat Inc](https://chatinc.com/?ref=internalnote.com) for letting me know)
You can find the full announcement [here](https://developers.facebook.com/docs/whatsapp/pricing/updates-to-pricing/?ref=internalnote.com), but this is a welcome change for those that use [WhatsApp notifications](https://internalnote.com/sunshine-conversation-automations/).
## 👨🏻💻 Agent Workspace
### Follower and CC conditions in Views
A few years ago I wrote a little app for [Premium Plus](https://premiumplus.io/?ref=internalnote.com) that made it possible to view Followed and CC'd tickets in views. That app became quite popular and filled a gap in Zendesk's features.
[Follower View | Premium PlusFollower View Adds a custom view which displays Followed, CC’d or Assigned tickets. Install now €0.99 / month / agent About the app Zendesk has a couple of ways to keep agents informed on whats happens to their tickets. When using CCs, you are allowing agents to copy in other…Premium Plus](https://premiumplus.io/integrations-apps/follower-view/?ref=internalnote.com)
Now Zendesk has finally *sherlocked* my app and made CC and Followers available as conditions for Views. Which means you can now create a view that contains all your followed, cc'd or assigned tickets in one overview.

Better late than never, but with the arrival of [Agent Home](https://internalnote.com/tag/agent-home/) and its native filters for these types of tickets, I don't expect lots of people to use this new view conditions.
### View categorization
Speaking of views, for those who are a fan of lots of views, you can now [categorize](https://support.zendesk.com/hc/en-us/articles/8043835835674-Announcing-the-ability-to-categorize-views?ref=internalnote.com) views similar to how you can group macros. You can leverage the `::` syntax to add a category to a Views' name, making those views appear grouped in the Agent Workspace.


For example, a view called *Topics::Active problems* will now show up as *Active Problems,* under a dropdown menu called *Topics*. It's a nice addition that fixes the issue of having a long list of views, but I do fear it will motivate companies to keep using lots and lots of views, instead of adapting a more focused Approach to Views
[My approach to Zendesk ViewsIn this article I explain my approach to Zendesk Views, and how you only need 8 views to make an efficient setup.Internal NoteThomas Verschoren](https://internalnote.com/my-approach-to-zendesk-views/)
### Form Based Ticket Statuses
Last year Zendesk introduced [Custom Statuses](https://internalnote.com/tag/custom-ticket-status/) as a way to expand the native new, open, pending, on hold and solved statuses we've always had in Zendesk.
It's a great feature that, similar to Layout Builder and Pinned Apps, allows you to make the Zendesk UI fit the way you work. With this latest release Zendesk now allows you to show specific custom statuses for specific forms, making the UI fit even better with how you work,

💡
I've got a [Spotlight](https://internalnote.com/404/) article planned on this topic for Thursday. So keep your eye on this blog if you want to learn more.
### Advanced AI updates
Following the releases at the [AI Summit](https://internalnote.com/tag/ai-summit/), Zendesk released some smaller updates to how some of the features now work.
- **Suggested Macros** now take the entire ticket conversation into account and don't only react to the initial ticket message. This means agents will get new suggestions throughout a tickets' life.
- **Similar Tickets** (currently in EAP) has an updated recommendation engine which means more related tickets should now show up.
- **Similar Tickets** now also does not require intents in Intelligent Triage to be enabled. It'll just work for every instance with Advanced AI.
### User suspensions for messaging
Agents can now [suspend](https://support.zendesk.com/hc/en-us/articles/8258324950042-Announcing-user-suspension-for-the-messaging-channel?ref=internalnote.com) users who misbehave in a Messaging conversation. Those users then show up in the Suspended view in the Customers Tab of Agent Workspace, and can be unsuspended as needed.
Do note, if a guest user that isn't authenticated clears they browser cache they can reconnect since they'll show up as another visitor on your instance.

## 🔎 Copilot Autoassist and Help Center
### Shared Media
Zendesk's work on the Media library in Zendesk Guide keeps moving forward month by month. Where last month gave us localized assets and the option to upload assets via API, we now get the ability to share assets across editors
To be honest, I didn't even know this wasn't possible before.
I do wonder when we'll get a Media library link in the Guide sidebar though. This feature is getting quite powerful and it's a pity it's hidden in the article editor this way.

### Redirect API
This API has been in EAP for a *long* time and is now finally available to everyone. Quite useful to improve your SEO score after a migration to Zendesk, or to create vanity URLS that point to specific articles.
[Redirect Rules for Zendesk GuideUse the new Redirect Rules API for Zendesk Guide to redirect customers to other pages instead of finding a 404 error for non-existing urls.Internal NoteThomas Verschoren](https://internalnote.com/redirect-rules-for-zendesk-guide/)
### Article Multiplacement
To conclude the Help Center and Copilot section of this roundup, we get the new [Article Multi placement](https://support.zendesk.com/hc/en-us/articles/7867489163930-Placing-articles-in-multiple-sections-with-article-multiplacement-EAP?ref=internalnote.com) feature that allows you to publish one support article across multiple Help Centers or section.
This is a very useful feature for scenarios where you have one article (for example: how to update your device) which applies to multiple products (phone and tablet). Or if you have an "delivery options" article that applies to both your consumer and b2b brands.

## 🧱 Open and Flexible Platform
### OpenID Connect
OpenID connect is now supported as a [single sign-on](https://support.zendesk.com/hc/en-us/articles/7957465432474?ref=internalnote.com) option for end-users.
### User Deletion experience and bulk Importer
Zendesk has been gradually moving stuff in- and out of the Admin Center and into other places of the platform to make everything feel a bit more cohesive.
Copilot procedure management for example has been moved into Zendesk Guide's Admin Center so that all Knowledge Management features are now in one place (I kinda expect Macros to be next to be honest)
Similarly, they've been moving all day-to-day end-user and organization management out of the Admin Center and into Agent Workspace under the new Customer and Organization sections. You can use the new Bulk delete users option there to remove [those suspended users](https://internalnote.com/automatically-deflect-zendesk-spam-tickets-via-triggers-and-web-hooks/) in bulk.


The old and new interface for Deleting users
On the opposite side, the ability to import users in bulk has also been updated, but this feature remains in Admin Center as part of the new bulk importer that already supported organizations and Custom Objects.
### Refresh of the Routing configuration page
Omnichannel Routing is – in my opinion– one of Zendesk most powerful and most complex additions in a long while. The new assignment rules that take skills, queues, availability and a bunch of other features into account allow for a lot of customizations and can adapt to almost any workflow or assignment approach.
But with great customizability comes great complexity and the admin panel to manage those routing options starts to look more like something straight out of Windows 7 with multiple nested options, checkboxes and drop-downs.
This month Zendesk reorganized the entire menu and made it a lot cleaner to look at, even though all the features and setup complexity remain as is. Although I do like the division between "Global Settings" and more specific grouped email and messaging settings.
I do wonder what will happen once [Zendesk Voice](https://internalnote.com/ai-summit-the-new-zendesk-voice/) gets added to the mix. Do we use queues to route voice calls? Or will this menu get even longer? Time will tell.


Image taken from the Zendesk Support article.
## 📊 Reporting and Insights
### Customizable CSAT updates
Last month Zendesk launched their new [customizable CSAT](https://internalnote.com/preview-of-the-new-customisable-csat-for-zendesk/) and with it expanded the native thumbs up/down with more options.
Initially the emails send out via this new feature contained a simple *Share Feedback* link, but since then these emails have been expanded with built-in options for the customer to click on, immediately collecting their choice when they do so.
You can now also choose if you want to link to the original ticket (which opens in the customer portal section of your help center), or not.
```html
Hello {{ticket.requester.name}}, we’d love to hear how we did on your recent request . If you’re up for it, please take a moment to answer a few questions. We really appreciate it.
{{satisfaction.survey_section}}
```



Legacy CSAT, EAP Customizable CSAT, new experience
# ⚠ Major Changes
There's a lot of small but important changes to Zendesk this month it seems.
## Automatic Resolutions
Automatic Resolutions are Zendesk's new way of charging for the work their AI Agents do. As mentioned in my [AI Summit - Omnichannel Agents](https://internalnote.com/ai-summit-ai-agents/) article, you pay for when the bot actually deflects tickets, and don't pay when your agents get involved in the conversation.
It's a fairly clean way to keep the cost of agents and AI agents in balance, and your usage can be seen via the new status widgets on the Admin Centers' homepage.

And yep, if you the reader uses my demo bot flows, I get charged for that via AR :-)
If you want more insight and maybe exclude tickets handled by an AI Agent from your reporting in Explore you can use [tags to filter those tickets out](https://support.zendesk.com/hc/en-us/articles/8035023504666-What-changes-on-my-account-when-I-migrate-to-automated-resolutions?ref=internalnote.com). These tasks used to start with `ab_` (Answer Bot), but with the move to Automated Resolutions, these will now start with `ar_`
- `ab_marked_unhelpful` changes to `ar_marked_unhelpful`
- `ab_resolved` changes to `ar_marked_helpful`
- `ab_suggest_true` changes to `ar_suggest_true`
- `ab_suggest_false` changes to `ar_suggest_false`
## Login option changes
> Zendesk Chat will no longer offer end users the option to fetch their name and email address from Google or Facebook to identify their name and email address to businesses. This change only applies to end users who are not using Google or Facebook to sign in; end users who are currently signing in using this method will still be able to do so.
Zendesk Chat is slowly fading away, one login at a time it seems. [More info here](https://support.zendesk.com/hc/en-us/articles/8157106527258?ref=internalnote.com)
> On November 18, 2024, we’re removing X (formerly Twitter) as a sign-in option for end users.
Twitter on the other hand is [very quickly](https://support.zendesk.com/hc/en-us/articles/8176344568218-Announcing-the-removal-of-X-formerly-Twitter-as-a-sign-in-option-for-end-users?ref=internalnote.com) going the way of the dodo.
> Historically, developers using ZIS could reference the access token of an OAuth connection in a flow or custom action using the path `$.connections.{oauth_connection_name}.access_token`.
> When Zendesk announced support for additional authentication methods in ZIS connections, we introduced a new way to make use of connections in ZIS actions with the `connectionName` property.
> Until now, both referencing methods were supported. Going forward, bundles can no longer be uploaded or updated if they contain an OAuth access token reference path.
Out of interest dear reader, have you used [ZIS](https://support.zendesk.com/hc/en-us/articles/8263007584026-Deprecation-of-OAuth-access-token-reference-path-in-ZIS?ref=internalnote.com) already? I'm so used to use Cloudflare Workers to automate my Zendesk instances that I haven't really dived into ZIS yet..
## Incremental Export API Change
> Until now, the Incremental Export API attempted to include data up to the moment of the request. However, this can lead to data inaccuracies, so we're changing this behavior. Now, all ticket creation and updates that occur in the minute preceding the request are excluded.
> The API will account for this in the recorded end time, so it can pick up seamlessly where it left off for subsequent requests.
Small but important update for those exporting data.
# 💡Insights
## Cards Against Complexity
Jan from [Next Matter](https://internalnote.com/sponsor-next-matter/) invited me on his Cards Against Complexity podcast to talk about the Zendesk AI Summit, Internal Note and automation in Zendesk. I'm not used to be on camera but it turned out a fun conversation!
## AI Summit Deepdive
## Getting started with Zendesk AI
Nice article by Jeff Adkins on getting started with Zendesk AI.
[Getting Started with Zendesk AIA Starter Roadmap for Admins and Support LeadersConnective Intelligence: AI, CX, and BeyondJeff Adkins](https://jeffadkins.substack.com/p/getting-started-with-zendesk-ai?r=328dv4&triedRedirect=true)
# 📝 Articles this month
[Multiple Conversations in the Zendesk Messaging WidgetThe new multi-conversations in Zendesk Messaging allows for, well, multiple concurrent conversations with AI Agents and your team in the Zendesk Web Widget and Mobile SDK. This feature is now available to all customers.Internal NoteThomas Verschoren](https://internalnote.com/multi-conversations/)
[A History of Zendesk chat and messaging channelsOver the years, Zendesk evolved from simple email ticketing to offering a full suite of customer care solutions. They now support multiple channels, AI agents, social integrations, and web widgets. This article will dive into how their complex platform works, helping navigate conversational setups.Internal NoteThomas Verschoren](https://internalnote.com/history-of-zendesk-messaging/)
[AI Summit - Internal NoteZendesk presented their latest releases at the AI Summit in October 2024\. New announcements include Omnichannel AI Agents, the new Zendesk Voice, Agent Copilot and improvements for Zendesk QA.Internal Note](https://internalnote.com/tag/ai-summit/)
[End-User access for Custom Objects and Lookup Fields (EAP Preview)Zendesk’s Custom Objects, released last year, enable you to expand platform data, like linking assets or contracts to tickets. Initially, end-users couldn’t interact with custom objects, but a recent update allows you to add Lookup Fields in forms.Internal NoteThomas Verschoren](https://internalnote.com/end-user-access-for-custom-objects/)
[Using Messaging triggers: Customer Wait Time & Messaging CSATZendesk’s new Messaging triggers enable automations similar to email tickets. You can notify customers of wait times, request CSAT feedback, or let them close a conversation. These triggers enhance the customer experience by allowing more customized interactions within Messaging.Internal NoteThomas Verschoren](https://internalnote.com/messaging-triggers-customer-wait-time-and-messaging-csat/)
# And Finally...
Normally I end my roundups with a fun bit of Zendesk Trivia I discovered.
This week, I'm going to use this section to announce a few structural changes on the blog in the next few weeks.
I've managed to write and publish an article on Zendesk every Tuesday for the last two years. Since Zendesk's release cycle has been so fast this year, I'm currently running behind on writing about major topics like Zendesk QA, Ultimate and ZIS, while having article ideas to write about well into 2025 already.
To make sure I can write with quality about Zendesk and to not overload your inboxes with emails, I'm going to introduce the concept of [*Spotlight*](https://internalnote.com/404/) articles. These are short articles that will solely be posted on this website that highlight interesting new releases as they happen.
These articles will not be emailed to you, but will be added to each months' [roundup](https://internalnote.com/tag/zendesk-roundup/) so you can dive into them if they seem of interest. The first one was published last week, and more will be published on Thursdays if something cool is launched.
Secondly, I'm changing access to the content I'm writing. I've made it a point of making all content available without a paywall for everyone who subscribes to this blog since I'm a firm believer that knowledge and insights are only valuable if they are shared.
I will still do that but I'll start publishing some articles behind the [Internal Note Plus](https://internalnote.com/#/portal/signup/63f0d0f4034c3d004d5ef75a/yearly) subscription initially, making them publicly available to everyone after about a month's delay. This way I can hopefully convince more reads to support this project by becoming a Plus member, while still making content available to everyone.

My new monthly schedule
If you *really* like what I do, can I ask you to consider subscribing to Internal Note Plus via my [monthly](https://internalnote.com/#/portal/signup/63f0d0f4034c3d004d5ef75a/monthly) or [yearly](https://internalnote.com/#/portal/signup/63f0d0f4034c3d004d5ef75a/yearly) tier?
Thanks!
### Multiple Conversations in the Zendesk Messaging Widget
URL: https://internalnote.com/multi-conversations/
Last updated: 2025-09-08T06:44:07.000Z
💡
This is a Spotlight article. A short article on a new feature that's not emailed to subscribers but will be part of the monthly [roundup](https://internalnote.com/tag/zendesk-roundup/). This lowers the amount of emails you get, while still get the information you want.
When interacting with the Zendesk Messaging widget there's always been a few frustrations that customers mention. One of them is that the Messaging widget was, by design, a single threaded conversation. Meaning as a customer you can only talk to either an AI Agent or a human agent upon escalation. While that agent is handling your question, you can't start a second one to ask another question.
This might seem like a small issue, but imagine you've got a support ticket raised for a lost package, and it takes a week or two to get it closed. In the meanwhile, each time you open the Messaging widget, you'll see your conversation with its latest updates.
During those two weeks you have another question you want to ask on a different topic. As an end-user your only available option is asking it to the agent handling your package issue, since there's no way to reach the AI Agent unless the original ticket is closed. Where an AI Agent would give you your answer in seconds, you now need to wait for an actual agent.
As that actual agent, things also get annoying. Your now open to any kind of question from that customer since your first line of defense, the AI Agent is down until you close that ticket for that customer. If the customer reaches out with questions for other departments, or for items that require different skills, you're kinda stuck. You need that package ticket assigned to you to resolve it, but need to pass the other questions the customers asks to team members.
Single threaded conversations can get annoying fast.
# Enter multi-conversations
This is where the new multi-conversations for Messaging widget (and sdk) come in. This upgrade to the Messaging experience upgrades the widget to allow for more than one conversation.
Whenever a customer is in an active conversation, they can click a *back* button in the widget. This opens the new conversation view showing them a list of all conversations they had with you.
They can then choose to start a new one, or jump to another conversation.

This works for both authentication and non-authenticated users. However, when a browser session expires or local cache is wiped, your unauthenticated users will get greeted with an empty widget again, just like with the old experience and can then start another conversation (or more than one).
For authenticated users the widget will restore **all** their conversations upon login.
[Authenticate Zendesk MessagingZendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.Internal NoteThomas Verschoren](https://internalnote.com/jwt-messaging/)
## Proactive Messages
If you greet your customers with proactive messages, a customer interacting with them will automatically be routed to a new conversation, as to not interrupt any existing flows.
[An in-depth overview of Proactive Messages for ZendeskDiscover the new Zendesk proactive messaging. Learn about the main features and advanced flows, including the ability to show proactive messages based on specific marketing campaigns. Target customers based on their locale, or offer a premier experience to VIP users.Internal NoteThomas Verschoren](https://internalnote.com/proactive-ticketing-for-messaging/)
# Activating multi-conversations
Activation of this new feature is done via the Admin Center. If enabled it's enabled for **all your brands and channels** **and can't be disabled anymore.**
But given the benefits of this feature, chances are rare you'll want to disable this.




You can however disable the ability to create new conversations. For unauthenticated users this means they'll always have one conversation, except when you send them proactive messages. For authenticated users this means they still see a list of all conversations, but can't create a new one unless the existing one is resolved.
# Agent Experience
For agents nothing really changes. Your customers will still create the same conversations which might get escalated to your team. However, the annoying "customers goes off topic since they can't raise a new ticket" issue is gone, and agents can actively ask customers to create a new ticket if they happen to go off topic.
There's one important note though. Since we've always had a single conversation per customer until resolution, and we now allow for multiple concurrent conversations you will see an increase in customer interactions. And since conversations can now be ended via the new End Session button, and customers are more inclined to start creating multiple conversations per topic, your average conversation length (and thus resolution time) will go a bit down.

One question I do have, is one about routing. If a customer starts two concurrent conversations for different topics, would they expect to be routed to the same agent? Or would they just ignore the fact that their two conversations might be escalated to different agents?
# A few caveats
- All older Mobile SDK versions do not support this feature. You'll still see the single conversation view there. So best to move to the latest version via developer.zendesk.com (If you already use the Zendesk SDK this should be a *simple* swap of the embedded SDK to the newest version)
- The [release notes](https://support.zendesk.com/hc/en-us/articles/8195486407706-Understanding-multi-conversations-for-messaging?ref=internalnote.com) also mention a lack of support for V1 SunCo APIs. This theoretically means you can't auto-post [messages](https://docs.smooch.io/rest/v1/?ref=internalnote.com#conversation) like I showed in this [article](https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk/). But I've rarely seen people use this over messaging...
- Social channel linking (allowing an end user to move the conversation from the Web Widget to a social channel) is only available for the first conversation started by the end user. End users can’t continue subsequent conversations on social channels.
# Conclusion
My one line conclusion: Go enable this. Today. There's zero downsides.
### Using Messaging triggers: Customer Wait Time & Messaging CSAT
URL: https://internalnote.com/messaging-triggers-customer-wait-time-and-messaging-csat/
Last updated: 2025-09-08T06:40:50.000Z
When working with Tickets in Zendesk you can use triggers to automate interactions with customers. You can send out a confirmation email when a ticket is received, you can [send out reminders](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/) for pending tickets, or ask the customer for CSAT via an automation.
Doing the same for Messaging tickets however is tricky. Not every action you're used to do for email tickets can be replicated with the regular Zendesk triggers.
Back when Zendesk offered Zendesk Chat, you had a specific section to create triggers for chat conversations. You could do things like send a welcome message, remind customers of a lack of replies and so on.

After the migration to Messaging a lot of these capabilities were lost, and it's only with the recent release of Messaging triggers that you can now recreate a lot of these flows again.

This article will give show a few flows that you can built with these triggers.
# Showing customers their Wait Time
Thanks to a recent release Zendesk now makes it possible to tell customers their [estimated waiting time](https://support.zendesk.com/hc/en-us/articles/8009787999514-Displaying-estimated-wait-time-in-messaging-conversations?ref=internalnote.com) when they want to talk to Agent. This way customers know what to expect and don't get frustrated by an unknown waiting time.
💡
This first example borrows from the Zendesk support article but I hope to highlight some additional details in these steps.
## Setting it up
To set this up you can create a new messaging trigger with the following steps:

As for the Responder Message, you can use any text as long as it contains the `@wait_time_min` and `@wait_time_max` placeholders.
> Your estimated wait time is @wait\_time\_min-@wait\_time\_max mins.
After you setup this trigger a customer will – upon escalation – immediately be informed of the estimated wait time, based on the amount of customers in the queue.
💡
During my testing I noted that this performs best if you have a good [queue or Omnichannel Routing](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/) setup, since the time is calculated based on tickets being routed. If you let agents cherry pick their conversations than the estimated number might be way of.
Once the queue empties and the customer can be passed to an agent, we can tell the customer it's their turn before handing it over to the agent via second trigger:

You might notice this trigger has a *Group status* and *Group* condition. If you route your conversations to more than one group, you need to create a notification per group in your instance. This way the trigger will **only** take that group (and its agents) into account for calculating the queue length, and you don't send timings to customers who do not need to wait. So if you have three customer care teams, you'll end up with three *estimated time* triggers, and three *it's your turn* triggers.
## End-User Experience
For an end-user the experience is quite nice. The bot sends them a message telling them about their waiting time, tells them it's their turn and then passes it to an agent.

## Customize with adding queue time
One issue I notice during testing is that in scenario's where the queue is short, with only one or two people in a queue, the "*It'll take 1-3 minutes*" message and the "*It's your turn!*" message can appear immediately one after the other.
To prevent this weird behavior, you can add an extra step to your conditions and check for queue length. In my setup for example I only trigger the Estimated Time alert if the queue is larger than three people.

# Asking for CSAT in Messaging
At the end of a customer interaction you can ask your customers to provide their feedback via a feedback form. With email based tickets we can use an automation to send out an email after a short delay. And now, with the messaging triggers, we can send out a similar notice to customers directly within the Messaging conversation.
This new capability integrates nicely with the new Customizable CSAT for Zendesk which launched earlier this month.
[Preview of the new Customisable CSAT EAP for ZendeskThe new Customisable CSAT EAP for Zendesk has arrived, finally allowing you to change your rating scale, choose emoji, numbers or labels, and customize your follow-up questions. This article contains an initial overview of the new feature, and shows how it works with existing API integrations.Internal NoteThomas Verschoren](https://internalnote.com/preview-of-the-new-customisable-csat-for-zendesk/)
## Setting up Messaging CSAT
Setting up Customer satisfaction for Messaging happens within the new Customer satisfaction Business rules section of the Admin Center.
You can activate the Messaging trigger, and drill down to its settings to tweak settings like the channels where we should ask for CSAT, or you can filter out specific intents, customers or tags.


## Customer Experience
For customers this integrates nicely with the existing Messaging flows as a new modal view that pops up within the Zendesk Widget. When triggered in social channels this can either popup as a similar modal if supported, or will show a button that links to a webpage to leave their feedback in a similar layout.

💡
Fun fact (for me at least): this is the first example of a first-party [Conversation Extension](https://developer.zendesk.com/documentation/zendesk-web-widget-sdks/conversation%5Fextensions/?ref=internalnote.com) I've seen in use in the Zendesk Widget.
# Allow customers to close a ticket
Earlier this month Zendesk launched the capability for Agents to end a conversation and triggering CSAT and a return to the Zendesk Bot for the customer.
A request I hear a lot is the capability for customers to do the same. Sometimes you just want to close the conversation and begin anew with a new topic. Especially in scenarios where the issue is resolved, and you're stuck waiting for an agent to close the ticket before you can talk to the bot again.
By leveraging Messaging triggers we can *hack* this capability within Zendesk.
## Setup
First off, we need to create a Messaging trigger that looks for specific keywords like *Close Conversation*. You can add one or more variants in the *ANY* sectionof the conditions if you want.
We then tag the conversation with a specific tag like `close_conversation`.

Next we need to create a trigger that looks for updated tickets in the Messaging channel that contain that tag, and set the status to solved.
This will trigger CSAT, after which the customer goes back to your bot!
💡
We can not do this with regular ticket triggers since those triggers can only "read" email contents and not messaging replies.
# Conclusion
The above gives you a taste of what's possible with Messaging triggers. And when you dive into the options you can send messaging when tickets change groups, you can send reminders when a customer waits to long to respond, or you can tag tickets with specific keywords to change priority or routing.
What are you building next?
### End-User access for Custom Objects and Lookup Fields
URL: https://internalnote.com/end-user-access-for-custom-objects/
Last updated: 2025-09-08T06:41:07.000Z
When Zendesk released their [Custom Objects](https://internalnote.com/tag/custom-objects/) last year, they made it possible to expand the existing ticket, user, organization objects in the platform with any data type you needed to enrich your ticket and agents experience.
You can use custom objects to store assets like computers or printers, you can store service contracts or purchased licenses, or you can use it to build fun demo's and store [movies](https://internalnote.com/custom-object-placeholders/) or [Pokémon](https://internalnote.com/creating-a-pokedex-with-zendesk-custom-objects/) within the platform.
Custom objects can be linked to tickets via Lookup Fields and, when linked, will show more detailed detail right next to a ticket when an agent handles it. When linking – for example – service contracts you can see its duration and services within the contract. Or when linking an employees laptop you can see its type, operating system and warranty duration.
One element that was missing was a way for end-users to interact with custom objects. Where agents could fill in lookup fields in the ticket sidebar, you couldn't make these same fields available to end-users, like you can with regular drop-down or text fields.
In part 4 of my Custom Objects series last year I showed a workaround leveraging the Zendesk API, an external worker and modifications to the Help Center. But luckily, with Zendesk's latest [Custom Objects release](https://support.zendesk.com/hc/en-us/articles/8286928528026?ref=internalnote.com), this can now be done natively!
[Zendesk Custom Objects - Part 4: End-User and FormsThis is a four-part series on Zendesk’s new Custom Objects feature. The articles cover setup, data import, using Custom Objects in forms and with agents, expanding user profiles, and displaying Custom Objects in Help Center forms.Internal NoteThomas Verschoren](https://internalnote.com/custom-objects-part-4-end-user-and-forms/)
# What's possible now
Mid summer Zendesk released the ability to use placeholders in macros that pulled data from Custom Objects. To demonstrate that capability [I created](https://internalnote.com/custom-object-placeholders/) a Custom Object to store movie details. If a visitor of my movie theater showed interested in a movie, we could use those placeholders to reply to their email with more information.
In that article I purposefully used email as an example to work around the fact that there is no elegant way to ask for that information in forms. Or at least not while filling in the ticket field that contains the movie without resorting to custom code.
Now, with this new Custom Objects for the Help Center release we can take an existing or new Lookup Field and give permissions to an end-user to view or edit that field from within a form or request page.
This way, I can ask a customer to select a movie, a trainer to select a Pokémon or an employee to select a laptop from a nice list.
You might wonder what the benefit of these kind of Lookup Fields is compared to regular drop-down fields. For one, Lookup fields can be filtered and only show those records that apply to the current user, organization or other condition.
Secondly, even though the customer still sees a list of options, your agents can see all related data to a customer's choice (warranty date, SLA type, movie genre,...) giving them more context when working on tickets. And the record editor in Agent Workspace is a lot nicer to work in than the dropdown editor in the Admin Center.
# Setup
💡
This feature requires a Help Center theme running on the latest version 4 APIs. You get this update automatically if you run an unmodified Copenhagen theme. If your theme is customized, reach out to a developer or download a recent version of a new Zendesk theme. More info [here](https://support.zendesk.com/hc/en-us/community/posts/8043398017306-Which-Guide-theme-am-I-in-and-how-to-move-to-the-latest-theme?ref=internalnote.com).
Making Custom Object data available to end-users is a three step process.
## Create a custom object
This first step is obvious, but in order to make data available to the end-user, you should create a Custom Object type in the Admin Center, and add data via the Record editor in Agent Workspace, or by bulk importing data via the Admin Center.

## Create or Update a Lookup Field
The next step is adding the Custom Object to your forms. If you previously created a Lookup Field for your agents, you can update its settings to make them viewable or editable to end-users.

If you haven't yet, create a new Lookup Field and make sure to select either the *Customers can edit* or *Customers can view* option*.* When doing so an alert will appear underneath the options to update your custom object with view permissions for end-users. Do so.

Just like with any ticket field you can give the field an end-user visible name and description.
💡
End-users are only able to **view* custom object data. They can select an object via a lookup field to link it to the ticket, but they are not able to modify the objects themselves.
## Add your lookup field to a webform
As a final step, you can update your webform to add your new Custom Objects Lookup field.
If you already created an *Agent Only* field in the past, you can skip this step.

# End-user Experience
When a customer now opens our Movie form they see a new dropdown to pick their movie. They get a dropdown of all available movies (pulled from our custom objects) and once they submit the ticket, this choice will be visible to Agents in the Agent Workspace.


# Migrate from old article code
If you previously used [my workaround](https://internalnote.com/custom-objects-part-4-end-user-and-forms/) to get Custom Objects working for end-users, you'll need to take the following steps to undo your work and enable the native solution:
1. In the admin center:
1. Enable end-user edit rights on your Lookup Field
2. Delete the intermediate field we created
3. Delete (or deactivate) the trigger that copied the value from the intermediate to the lookup field
2. Go to your Help Center theme and open the `new_requests.hbs` page. Remove the javascript block we added to detect the form and intermediate field, as well as the code that gets the data from the external worker
3. Remove the external worker and remove the API key we used to make it work.
# Filters
One final features that's pretty cool with these new Lookup Fields capabilities are Filters. When linking a Custom Object to a Lookup Field you can filter the data shown in the dropdown.
If you have, for example, a single Object type for Assets containing laptops, phones and printers, you can use the Filter *type | is | laptop* to only show laptops in your "Select a laptop" lookup field
Or, if you have a list of Pokémon in your custom objects you can link each Pokémon to a trainer by adding a Lookup Field to the Pokémon object that allows you to select a trainer.
If you then create a ticket Lookup Field "Select a Pokémon" you can use the filters to set *Trainer | is | requester* When a logged in user then uses your contact form they will only see those Pokémon that belong to him. (Or in a more realistic scenario, an employee will only see their devices)



# Limitations
As always, even though this feature is a *major* release that will unlock tons of new flows and possibilities, there a few things I'd love to see happen with Custom Objects:
- You can't make Lookup Fields that link to organizations or users accessible to end-users. I assume this is for security reasons as to not accidentally leak your entire customer base in a dropdown, but for e.g. scenario's where you want to select a vendor, partner or manager, having those kind of fields would be useful.
- Lookup fields are currently not accessible within Zendesk Bot flows in the Ask for Details step. I'd love to see some feature parity there too!
### AI Summit - the new Zendesk Voice
URL: https://internalnote.com/ai-summit-the-new-zendesk-voice/
Last updated: 2024-11-05T10:00:31.000Z
Welcome to this fourth, and final, installment in my AI Summit series, discussing all the new announcements for the Zendesk platform. If you missed the previous issues, you can find them [here](https://internalnote.com/tag/ai-summit/).
When you look at the Zendesk Suite overall there’s a plenty of of elements that have gotten a lot of attention these last few years. Messaging, Bots, Agent Workspace all got major new features and designs. These changes impact the way Zendesk works in major ways –
The move to messaging turned direct web chat into an asynchronous channel that offers better self service solutions via bots and generative replies. It expanded the traditional chat channel to both web, mobile and social channels and make sure your customers can reach you from anywhere.
Similar, the new Agent Workspace with its omnichannel routing, agent home and context panels give agents a rich environment to handle tickets with context, automations and suggested replies to make ticking handling faster than ever before.
Even Zendesk Guide received some love with a new article editor, generative replies, tone shift and simplify AI features and – soon – support for Custom Objects, cross-brand articles and many more updates.
If you know you’re Zendesk Suite, you know where this is leading. One piece of Zendesk has always felt like the one piece of Duplo in a box full of Lego. And that’s Zendesk Talk. It’s Zendesk built-in voice offering that allows you to receive calls within Zendesk, route calls via a traditional “press 1” IVR to the right group, and it gives you some basic call recording and dashboard features.
But, compared to powerful third party voice solutions like [Babelforce](https://internalnote.com/sponsor-babelforce/), Aircall and others, Zendesk Talk felt like Duplo to me. Yes you can built cool buildings with it, but if you want details, more colors and cooler constructions, you should move to Lego. The same goes for Talk. It works. But it’s crude compared to more modern offerings.

Introducing**, the new Zendesk Voice**
> The relaunch of native voice with end-to-end Al across the entire call journey
At the AI Summit Zendesk mentioned the new Zendesk Voice features spread across the AI Agent, Agent Copilot and QA sections of the talk. Combining all new features together, it’s a complete upgrade of the Talk we know, with powerful new additions that will, later this year, bring it into this AI powered age of CX.
The product announcements spread across 5 elements:
1. Native voice upgrades
2. Al agents for voice, powered by PolyAl (Q4-24)
3. Copilot for voice (Q1-25)
4. Post-call transcripts & summaries
5. Voice QA for native voice + partners
Coincidentally this aligns nicely with the existing solutions available for text based channels like Messaging and email. Each part of the call journey gets improved, and where possible empowered with AI.

A typical call journey. (Image provided by Zendesk)

Before we dive in, first some context. Even though conversational interactions and *chatbots* are all the hype these days, most existing customer interactions still happen over – so called – traditional channels like email and voice. So when you think about automating not only your frontline but also assisting agents, improving automation and deflection rates for voice calls is an important factor.
# Incoming Calls - Al agents for Voice
If we go over the announcements in the order of a normal call journey we need to start with how an incoming call is handled.
Traditionally, for voice channels, this means a prerecorded message welcome in the customer, an announcement that the call may be recorded, and than an IVR asking the customer to press a series of buttons to reach the right team.
IVRs, similar to traditional flow based chatbots, are not that great. A customer makes a guess at each step of the route, hoping to end up with the right team, while fearing they will get disconnected or reach a dead-end with an automated “resolution”.

Similar to how these flows were improved (or fixed) with new automation flows powered by intents and generated replies for messaging, the new AI agents for Voice will remove the needs for static IVRs and turn conversations into dynamic and automated flows.
When a customers calls your number they’l be greeted with an automated response that asks them why they’re calling. The AI Agent then processes the response and can then do a couple of things to help the customer or agent.
For all inquiries the system can result indexed Help Center articles, websites and other product information to generate a *spoken* response to the customer. For more complex inquiries like an order status the AI Agent can ask the customer for an order number and then request the information from your order management platform over API. Similarly, when a customer wishes to book a table or change a reservation, the AI agent can ask for the required date, group size and preferences and execute the booking directly within the call.
And for scenario’s where we do need your actual human agents to take over, we can use this AI Agent the same way we can do it for messaging conversation: we can ask the right questions up front so the agent immediately has the customer id, order number or product type at hand when the call gets transferred.

AI Agent for Voice
So far this all seems like a great solution for a problematic channel. Voice, as opposed to email and messaging is a real 1:1 channel. Where an agent might be able to handle 2-3 messaging conversations at once, and can handle dozens of email threads due to the real asynchronous behavior of those channels, a voice call is live. You’re talking to the agent now and you can’t just put them on hold to talk to another customer at the same time.
So the only way to lower waiting times for customers is to either lower the amount of calls coming in, or by reducing the duration of each call, allowing an agent to handle more customers in a shift.
> With AI-powered voice assistants, over 50% of inbound calls are resolved autonomously, significantly reducing the load on human agents.
Both scenarios can be handled by those new AI agents for Voice. By deflecting conversations with self-service solutions like generated responses or flows that get integrate with backend systems and automate processes, you can lower the amount of calls that require an escalation to an agent. And by collecting context, you can make sure the agent can dive right in, instead of asking first for the what, who, why. This additional context is stored in the new [custom entities](https://support.zendesk.com/hc/en-us/articles/6711181959194-Automatically-detecting-unique-information-in-tickets-EAP?ref=internalnote.com) for Zendesk Intelligent triage.
Combining this with a real omnichannel strategy where you also try to push customers to other channels like messaging or email, gets you to a point where your voice channel can really shine for those complex use cases where its often needed.
## PolyAI
Personally I was surprised when I heard Zendesk had built a new Voice automation solution. All their recent purchases in the last years where focusing on intent models (Cleverly.ai) or ticket automation (Ultimate.ai), and the fact that the Zendesk Talk stack is largely based on Twilio behind the scenes doesn’t make it prime for in-house AI developments on voice. Or at least, not to my limited knowledge of how the Zendesk product teams operate.
So, when they announced at the AI Summit that this new AI Agent for Voice was to be powered by [PolyAI](https://poly.ai/?ref=internalnote.com), a leading voice automation platform, it kinda makes the above logical again. Zendesk [invested](https://globalventuring.com/corporate/information-technology/zendesk-ventures-terry-evans-jr/?ref=internalnote.com) in PolyAI earlier this year, so a deeper partnership between the two companies is kinda logical. Zendesk gets a powerful new partnership that turns their voice offering to eleven, and PolyAI gets access to a big established user base that is used to the concept of AI Agents and already pays for a voice channel as part of the Zendesk Suite offering.
This does turn AI agents for Voice into another add-on though, similar to how the Advanced AI add-on adds more capabilities to Agent Workspace, and Ultimate replaces the native AI Agent solution with a more powerful solution.
The only thing that’s not really clear right now is how this AI agent for Voice will be offered. Will this be a product on Zendesk paper – *a Voice Bot-add-on* – or will this be a tight integration with PolyAI – to be billed separately – time will tell.
# Escalation - Intelligent Routing
When the AI Agent can’t resolve the incoming call itself, it’ll need to escalate the call to an agent.
With Zendesk Talk this means setting up routing to a specific group of agents within Zendesk based on the number called, or a specific IVR choice. Calls are put in a queue and the first available agent in a group (or the first one that picks up the call) handles the conversation.
But similar to how messaging and email are moving from group-assignment towards [agent-routing](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/) with assignment based on skills and availability, the new Zendesk Voice will do the same. While the AI Agent is handling the conversation, it’ll also log key elements like intent, sentiment and language, and this information is used to route a call to the right agent when an escalation is needed. This assignment will be based on the same skills and availability settings that are now available for other channels like messaging.

As for how this routing works, from what I was able to piece together from Zendesk documentation, basic omnichannel routing will be possible based on tags in the IVR (and thus skills).
Deeper routing based on intents and sentiment can be achieved by using Advanced AI, or you can leverage AI Agent for voice and inherit the intent from its initial conversation with the customer.
There's lots of moving pieces in this, so you can be sure, once I get access to everything, I'll do a big[ Omnichannel routing](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/) for Voice update!
# During the Call
## Sentiment & Intent and summarization
During the call Agents will have the same context available as they would have for all other Zendesk channels. The information gathered for routing (Sentiment, Intent, Language) is displayed in Agent Workspace, and the knowledge panel will provide relevant answers based on the content of the conversation.
Agents will also see a summary of the conversations routed through the AI Agent so they can get quickly up to speed with the customers’ needs, without needing to read through a transcript of the entire conversation.
These features are currently not as *coming soon*, so we can expect to see them later this year, or even early next year.

## Copilot for voice
During a call things might change. A customer might call asking about a product feature, and might end up asking for an exchange since their product does not have that feature and they’d rather purchased another product. Or customers inquiry about an existing reservation and end-up upgrading to VIP tickets.
Whatever the scenario, during a call the context and intent of the conversation will evolve continuously, and agents might need to dive into multiple processes.
This is where the new Agent Copilot for Voice comes in. Announced for early next year it will continuously provide agents with new suggested actions on the ticket by listening for new intents, and than offering quick replies in the Knowledge Panel which agents can use to reply to customers.

There’s no word yet on other auto-assist Agent Copilot features as we have for messaging and email, but just the fact that it surfaces relevant articles and content for agents will make handling calls a lot easier.
# Post Call - Transcription & Summarization
Once the call has concluded, Al generates a full transcript and brief summary of the conversation and adds it to the ticket. This feature was already [launched](https://internalnote.com/preview-of-the-new-generative-ai-for-voice/) last year in EAP as *Generative AI for Zendesk Voice* and nicely fits in Zendesk's new Voice lineup.

💡
Important to note is that transcriptions[ are not free](https://support.zendesk.com/hc/en-us/articles/7470764710298-Zendesk-Talk-call-transcription-and-summarization-FAQ?ref=internalnote.com). You need to get either Zendesk Advanced AI or Zendesk QA in order to enable the feature, and they will cost you an additional 0,01$ per minute transcribed.
In my preview of the Generative AI for Voice upon its release last year I noted the following:
> (…) That being said, one major feature is currently missing for me, and that is the **lack of integration with the other Zendesk AI and Intelligent triage features.**
> If you have a summary of the call, why doesn't this also feed the Summary option in the Intelligence Panel? And why can't we see the Intent or Sentiment of the call? All the data is obviously there. And if I copy the conversation transcript into a new ticket, I get the results on the right.
> But, taking into account that feature is in an EAP, I'm sure this will all be nicely integrated once the feature work wraps up and the internal data gets hooked up.
[Preview of the new Generative AI for Zendesk VoiceWhat happens if you give Zendesk AI for Voice one of IT Crowd’s most confusing customer care interactions? Read the article to see the results!Internal NoteThomas Verschoren](https://internalnote.com/preview-of-the-new-generative-ai-for-voice/)
Hindsight is 20/20 and it’s clear I was only partially right in my remarks. Adding a summary to the context panel was a bad idea. A phone call is only part of the ticket live cycle and multiple calls can be part of one ticket. So having a summary for each call as a note on the ticket is clearly the right way to go.
But it’s nice to see that the other feature requests I had, namely intent and routing are now part of the Zendesk Voice offering.
# Quality Control - Quality Assurance
From incoming call to escalation to handing the call and wrapping it up, we finally get to the last part of the call journey: Quality Control.
Announced and released in [August](https://internalnote.com/roundup-2024-08/) the year, Zendesk QA for Voice is a new part of Zendesk’s new QA offering. Zendesk QA runs an automatic review over all your tickets and scores them according to elements like do agents understand the customer, are they friendly and have the right tone of voice, are they working towards a solution,..
Similarly it can spotlight potential risks like churn, bad csat, tickets that require repeated escalations,…
With the new Voice QA Zendesk expands this capability from traditional text-based channels to voice and uses conversation transcripts to audit your tickets.

# Wrap up
So, that’s the new Zendesk Voice. A complete rework of Zendesk Talk featuring AI agents to automate incoming calls, integration with omnichannel routing to make sure the right agent picks up the phone, insights via summaries and intent detection, Copilot to assist agents during the call, and Voice QA that uses transcriptions and summaries to provide actionable insights after the call wraps up.
> An AI Agent. An Agent Copilot. Zendesk QA.
> An AI Agent.
> Copilot
> Zendesk QA.
> Are you getting it? This is not a single product. These are three separate products. And they’re calling it Zendesk Voice.
All kidding aside, getting access to all the new features does require some work.
- You need **Zendesk Suite** to get access to a phone number and the overall voice capabilities in Zendesk.
- You need to buy **Zendesk Advanced AI** to get access to Agent Copilot with its quick replies, sentiment and intent analysis, and transcription and summary features.
- **Zendesk QA** brings you the new Voice QA features
- And finally, you need to get **PolyAI** to get the new AI Agent for Voice.
Long gone are the days of just buying Zendesk Suite and getting everything, and it feels we’re moving back to the days where Zendesk was a set of separate SKUs you could mix and match. The sole difference is that were previously you bought Zendesk to mix and match the channels you needed (talk, voice, help center, support,…), you now buy different add-ons depending on the kind of AI powered assist you need.
Do you want to deflect inquiries across channels and offer automated resolutions? You need to invest in AI Agents.
Do you want to assist agents and make their work more efficient? Look into Advance AI to empowers Agent Workspace. Want to improve the way your team works and get actionable insights? Ask for Zendesk QA.
I do like this new Zendesk Voice. Zendesk Talk was a bit long in the tooth and often overlooked when I work with Zendesk with customers reaching out to third party providers to handle their phone calls. Now more of these customers might be able to handle their conversations without requiring a third party system, although I hope the incoming calls and escalation flows will also become available to those third party providers via the Zendesk Talk partner edition APIs.
## Sign up for Internal Note
Turning Zendesk into practice. – A newsletter about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### AI Summit - Agent Copilot
URL: https://internalnote.com/ai-summit-agent-copilot/
Last updated: 2024-11-05T10:00:38.000Z
Welcome to day three of my AI Summit coverage. Earlier this week I published an [overview](https://internalnote.com/zendesk-ai-summit-announcements/) of all announcements, and a [deep-dive](https://internalnote.com/ai-summit-ai-agents/) in the new Omnichannel AI Agent. Today, we're focussing on Agent Copilot.
At Relate last April Zendesk announced Agent Copilot, their new agent assist tool in early access. Now, at the AI Summit, this product becomes generally available to all Zendesk customers who bought the Advanced AI add-on.

Agent Copilot is positioned as a proactive AI assistant that works alongside agents and helps them resolve tickets faster and more efficient. Aside from helping agents doing their work, Agent Copilot can also assist with onboarding new agents. By proactively showing agents next steps to take, it lowers training time for new agents by removing to need to look up and know all procedures while handling tickets.
There's four big elements to Agent Copilot:
1. Auto-assist mode and suggested replies
2. Procedures that tap into knowledge and other platforms
3. Insights via intent, sentiment, related tickets and summarization
4. Write assist with tone shift and expand capabilities
Let’s dive into them one by one, starting with the biggest two auto assist and suggested replies.
# Auto assist and suggested Replies
Earlier this year I published a preview of the Agent Copilot after it became available as an EAP. You can read the entire overview in the linked article below, but in essence what Agent Copilot does is taking over the comment field in an Agents’ conversation.
[Preview of the new Agent Copilot for ZendeskA few months after its announcement at Relate, I finally had to chance to explore the new AI Co-pilot for agents in Zendesk. This article will explore what the Co-pilot can do, how it works and some initial impressions.Internal NoteThomas Verschoren](https://internalnote.com/preview-copilot/)
The comment field gets replaced with the new auto assist mode, where Agent Copilot can suggest replies and next-best actions for your agents. This could be a request for more information, information pulled from Help Center articles or macros, a confirmation we send to the customer or – and this is where it gets cool – a suggested action in external tools
> Agent Copilot doesn’t wait for agents to prompt it; it proactively assists with suggested responses and next-best actions, ensuring faster resolutions.
In its most basic form Agent Copilot is visible as suggested replies that the agent can *tab-complete*. These suggested replies are based on your existing macros, tickets and articles and allow agents to validate the message, optionally tweak it a bit, and submit it to your customers. It learn over time, and the changes you make to it feed the macro suggestions and content cues in the Help Center.

Where Agent Copilot really shines is when you start implementing procedures and enable the new auto-assist mode. This new mode will replace the comment field with a new auto-assist mode that offers next-best actions to your agents.
💡
This mode used to be called Agent Copilot. With this new release Agent Copilot is the overall name for all AI features in Agent Workspace, and the feature itself is now called auto assist
You can, for example, define a refund order procedure that requires an order number, product and reason for the return, before the refund is executed in Shopify.
Once created, Agent Copilot will read your customers’ replies and look for missing elements like the return reason, and automatically assist with offering prewritten replies for your agents to send to the customer.
If all required elements are collected, Agent Copilot can validate that information in Shopify, and if ok, the auto-assist mode will show a “Refund product” button to your agent that processes that refund directly in Shopify.
## Procedures
As mentioned above, Agent Copilot really becomes powerful once we start creating Procedures.
Procedures are a written down process of the steps an agent should take to handle a specific ticket. Examples are:
- **Subscription Refund** \- In order to refund an accidental renewal of a subscription the agent should ask for the product, email used for the purchase and check if the request arrives it’s within 7 days of renewal in the subscription management system. Once this is all in order, we can refund and let the customer know it can take 3-5 days to show up on their credit card.
- **Exchange a Product** \- In order to exchange a product we need to know the order, product and reason, we need to check if the information is correct, and ask if the customer needs a size smaller or larger.
- **Change Booking** \- for a customer to be eligible for a change in their booked trip they should provide the booking reference number, they need to have bought a flexi ticket, and the journey has to be further than 48h. If all is ok, we can rebook after asking what the new dates are.
As you can see, these are all processes an agent should know in order to handle customer tickets, and involve checking (and asking for) information, looking into external systems, and making changes in external systems.
When customer care teams onboard a new agent, teaching them all the processes often takes way longer than showing them how the ticketing tool itself actually works. With Agent Copilot, you don’t need to learn them all in advance anymore. The system will show you the required steps and responses, allowing even a new agent to be efficient from day one. And for people who do this job day in and day out, the promise of having a tool that handles a lot of the groundwork for you seems great.

With Agent Copilots’ procedures most of the above becomes a thing of the past. Procedures in Agent Copilot are a written down version of those processes. Once we write down e.g. our Subscription Refund procedure, Agent Copilot will recognize customer request about that intent (by leveraging Zendesk AI’s intent models) and will suggest replies an agent can send to the customer asking for the required information.
Once all information is available we can leverage Agent Copilots’ new actions feature to execute those actions via APIs directly in the external systems.
In our example, once we’ve collected the information we can have an action that checks for the renewal date for that subscription and then prompt the agent with a reply that confirms we can refund, or apologizes to the customer and lets them know that they are outside of the seven day limit.
An agent can then click the *Process Refund* button, which will handle all the refund action in the subscription system via API. Or, in case of a negative outcome, they can either submit the prewritten message, or overwrite and **do** execute the refund, since their manager approved a one time exception.

💡
Agent Copilot actions and procedures have **just* been released, and I haven’t gotten the chance to really deep-dive into them, but once I do get access to all the new goodies, I’ll surely do a deep dive article on the topic!
One cool detail is the fact that the procedures live now in Guide, and not in Admin Center. This makes Guide even more a knowledge manager than before with Help Center, articles, procedures and content cues with article management all being small pieces of the bigger knowledge puzzle. I’d kinda expect macros to be moved into Guide soon too, no?
# Insights via intent, sentiment, related tickets and summarization
The next main feature of Agent Copilot is actually a rebranding of existing Advanced AI features.
When Advanced AI was originally released last year, Zendesk added an Intelligence Panel to the Agent Workspace. This new context panel showed information like intent, sentiment, language and summarization to agents. Overtime it expanded to also include macro suggestions, similar tickets, merge suggestions as additional context relevant for the agents.
With these features an agent not only knows what kind of ticket they’re handling, but also gets insight in what the customer thinks and feels, allowing them to jump into the conversation with the right attitude and questions.

While I really like the context panel as an idea, it was a really overloaded piece of UI that was quite dense to parse. And, admittedly, some of the pieces of AI-powered data shown were also traditional already available in other places of Agent Workspace.
Take macro suggestions for example. At the bottom of the ticket view there’s a dropdown that shows all macros, while the suggestion macros section of the intelligence panel also shows some those macros.
With the release of Agent Copilot Zendesk also updated the Agent Workspace to refresh the way all the Advanced AI features are shown in the interface.


- **Intents** are now shown as a subtitle under the ticket subject
- **Summaries** are now a collapsable section at the top of the conversation
- **Macro suggestions** are embedded in the macro dropdown at the bottom of the screen
- **Merge Suggestions** get their own sidebar icon and section
- **Similar tickets** are added to the search dropdown at the top of the screen
Other insights like language and sentiment are now only visible as ticket fields in the leftmost sidebar. It’s a pity, I’d rather have a smily or grumpy face next to the ticket subject or intent. But I’m sure Zendesk will come up with something.
Similar tickets’ new location felt strange to me at first. It seemed hidden in a search dropdown, until I realized the most logical way to look for a similar ticket has always been searching for it, so it actually kinda is in the right spot.
Overall, I dig the new Agent Workspace updates. It feels more cohesive and all the AI richness is nicely integrated in the workspace, instead of being pushed into one sidebar panel. It also allows agents to keep another more relevant context panel or application open now, while not loosing the context provided by Zendesk AI.
# Write assist with tone shift and expand capabilities
To conclude the Agent Copilot section of the announcements Zendesk also pulled the existing writing tools that are part of Advanced AI under the Agent Copilot brand:
- **Tone shift** – which makes a reply more friendly or stern
- **Expand** – which turns a short reply into a longer reply
Even though they seem like two minor bullet points, they’re actually kinda awesome.
Personally, I use them in two ways.
- In one scenario I use the expand feature to turn a Frankenstein response into a cohesive reply. My replies often combine a paragraph copied from a Help Center article, combined with a sentence or two from a side conversation and a few short remarks based on the conversation. One click of the *Expand* feature turns these different elements into one smooth response. I control the information I type or copy/paste, AI takes care of the grammar and text.
- A second scenario is a way to make macros more personal. We all know those social media replies from Telecom providers with dozens of identical replies apologizing for power outages. The tone shift feature makes each of those replies unique by subtly shifting the macro wording per response send.

# Wrap Up
So, that’s Agent Copilot. A major rework of Agent Workspace with deeper integrated context, suggested replies and auto-assist powered by procedures available to your agents.
The feature is locked behind the Advanced AI add-on though, and not available as part of the default Suite. But for customers who want to reduce first-contact resolution (FCR), increase the overall tickets handled per agent or reduce workload (and by extension prevent burnout), it’s a powerful additional to the Zendesk product.
🧑✈️
If you have access to Advanced AI you can enable Agent Copilot in your instance ****today** by going to the **admin center > workspace > agent copilot*.
If you already used Agent Copilot via the EAP and wish to migrate your Agent Workspace to the new design, you can request so via [this form](https://docs.google.com/forms/d/e/1FAIpQLSd%5FG23gkL1exQ-jV5Ea2wc%5FAMf5xNQQKITf-8R98vnVriXRuQ/viewform?ref=internalnote.com).
Agent Copilot is but one side of the coin though. Where Agent Copilot makes handling the tickets that do get created more efficient, it’s counterpart, AI Agent, is there to automate ticket handling before tickets reach your agents, offering self service solutions to customers themselves.
There's also a bit of an overlap on both products. Allowing a customer to handle a product exchange or rebook a journey via an AI Agent, removes the need for an Agent (and Agent Copilot) to become involved, but similarly, if such a request does reach an agent, Agent Copilot can also handle that request for the customer together with the agent.
For now, if you want to both offer self service to customers, and assist agents with the tickets that *do* get created for the same use case, you need to do your work twice. You need to build an automation flow for the AI Agent, and write down a procedure for your agents, while integrating both with your backend systems.
I kinda hope that next year those two systems will grow towards each other from a management perspective, where we can turn procedures into bot flows. But for now, let’s be happy with what we have!
As for the impact, Agent Copilot has only been in EAP for half a year now, and just went GA, but at the event Zendesk did showcase one customer that saw a threefold increase in tickets handled per agent at peak time, going from 40 to 120 tickets per shift, while retaining the same, or higher, CSAT. Not bad!
## Sign up for Internal Note
Turning Zendesk into practice. – A newsletter about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### AI Summit - the new Omnichannel AI Agents
URL: https://internalnote.com/ai-summit-ai-agents/
Last updated: 2024-11-05T09:50:04.000Z
Yesterday Zendesk streamed their AI Summit, announcing a series of improvements to the platform. The focus of the event was positioning the platform as a “complete CX solution for the AI era” and the company announced updates for CX leaders, customers and agents.
[An overview of the Zendesk AI Summit announcementsZendesk presented their latest releases at their AI Summit this week. New announcements include Omnichannel AI Agents, the new Zendesk Voice, Agent Copilot and improvements for Zendesk QA. Read my deep dive article to learn more!Internal NoteThomas Verschoren](https://internalnote.com/zendesk-ai-summit-announcements/)
For customers, one of the biggest announcements at the AI Summit has to be Zendesk’s rollout of new AI Agents features, and with it, the expansion of AI Agents across more channels.
Before I dive into the specifics, first some context.
Earlier this year Zendesk bought Ultimate and with it gained a powerful new ticket automation platform. When I wrote my [overview](https://internalnote.com/zendesk-acquires-ultimate/) of what Zendesk had bought I wrapped up with the following conclusion:
> So, where do we go from here. My ideal outcome would be the following:
> \- The Zendesk Flow Builder incorporates the more complex features from Ultimate with regard to linking to different branches, ad-hoc parameters and predefined integrations as reusable blocks. This becomes available across all Zendesk Suite customers
> \- The deeper reporting on bot behavior, conversation logs and resolution types become available for all Zendesk users
> \- Ultimate intents are mapped against Zendesk intents and appear in the knowledge panel
> \- In a year or two all Zendesk Suite users get access to the pre-trained Zendesk intents and AI features, and all Advanced AI customers, regardless of Suite type, get access to the custom models.
>
> This means that, for now, while Zendesk is busy integrating the (awesome!) Ultimate team into their company, customers buying Zendesk AI still get the prebuilt models, and Ultimate is an upsell to custom models and better training/intent mapping.
> Once the bot builder and reporting and intents are ported over to Zendesk, they can redraw their offering with Zendesk AI available across the board for all Suite customers (which will probably increase price) and reposition Advanced AI as custom models, better reporting and intent training.
That conclusion was right on many points, but wrong on some key assumptions; I made the mistake of thinking Zendesk was going to expand their Advanced AI offering with more powerful bot capabilities, whereas in reality Zendesk went the opposite way.
Since this summer, every Zendesk customer now gets a powerful AI Agent, powered by Zendesk out of the box. It offers generative replies based on Help Center content, a bot builder that offers flow based answers, and leverages prebuilt intent models for specific industries to show customers the right response. It’s included in Zendesk Suite, and (starting this fall) you pay for it via Automated Resolution pricing, or in other words, you pay for the times it does it job, and you don’t pay when the AI Agent passes the conversation to an Agent.
The Advanced AI add-on now focuses on the Agent Workspace and Admin side of Zendesk, offering powerful Copilot and insight capabilities, but more on that in tomorrow's article.
So, where does this leave Ultimate?

Well, for customers that need more than Zendesk’s default offering, and especially those interested in end-to-end email automation, custom AI models, additional language support, robust analytics and advanced integrations, Zendesk now offers *AI agents, powered by Ultimate*. A more powerful add-on that gives you more automation capabilities, replacing the native Zendesk conversational bots and auto replies via email.

In the documentation released after the AI Summit, Zendesk not only confirmed the new positioning of Ultimate and Zendesk Bots, it also announced a series of new capabilities for its platform.
The focus of the AI Agents section of the presentation came down to four new releases, each focussing on how Zendesk AI can help your customers:
1. Al Agents for email
2. Al Agents for voice, powered by PolyAl
3. Zero-training
4. More controls & governance
Looking at these releases it’s clear Zendesk is expanding its AI Agent offering into a true Omnichannel solution. Conversational bots for messaging, email automation for – well – email and webform based communication, and new this year: AI Agents that handle your voice channels. All of them build to handle customer queries instantly and autonomously, providing answers, automating (parts of) the process and providing context to agents if tickets are escalated.
☎️
I’ll handle the AI Agents for Voice in a later article this week
# Al agents for email
A few years ago Zendesk introduced Answer Bot. A basic form of email automation that parsed a customers email and replied back with three helpful Help Center links that might help the customer. Customers could solve their ticket if the proposed article worked, or reply with more context. Those tickets where than picked up by agents who can handle the rest of the replies.
Answer Bot was a solution of a time before LLM and AI models and it worked, but didn’t really provide a big impact, or at least not for the customers I implemented it for.
At last years’ [AI event](https://internalnote.com/zendesk-ai-drop-keynote/) Zendesk announced their new auto replies, or the capability of writing custom emails that would fire if specific intents were detected. It solved one side of the equation, namely you could more accurately reply with the right content, but it didn’t solve for the actual content of your responses. You had to manually write them, they weren’t personalized to the content of a customers’ email and, to be honest, I never implemented it for any customers.

Now with the new AI Agent powered by Ultimate, we *finally* have a good solution to automate email handling with the (re)introduction of a few new powerful capabilities that were part of the Ultimate platform already, and a few new ones that are really, really cool.
Looking at the screenshot above you can see a UI that has elements of Ultimate in it, but has that simplicity that Zendesk is known for. The new AI Agent builder is positioned as a fast and easy way to get started with your AI automation business setting up your bots' name, knowledge source, channel and then configuring some important settings for behavior, persona and response methods.
🤖
I will call the AI Agent powered by Ultimate just Ultimate in most of this article.
# Generative Email responses
The first big feature that’s now available to those who bought the Ultimate product is generative replies in email. Ultimate pulls information from your Help Center, website, CSV files or other imported content, and uses LLMs to generate a custom reply for your customer based on their email and your data sources.
The customer gets a custom written email with the information they requested, and can either reply with more information, or archive the email, upon which Zendesk can automatically solve the ticket after a few days. Since the AI Agent acts as a regular agent, [your automations](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/) will still apply.

It’s pretty powerful to setup since it doesn’t only automate your first email replies, it can also let the agent know it failed finding an answer, upon which we can add an internal note to the ticket. Since Ultimate can also update tickets with tags or other ticket data, we can leverage this information for when an agent *is* needed by using it as conditions in our Omnichannel Routing queue.
# Conversational Flows
Zendesk has this concept if a [Road to Automation](https://internalnote.com/road-to-automation/) where we can take very specific steps to go from tickets that are all handled by agents, to 60%, or even 80% of tickets being automated by AI Agents.
When looking at AI Agents in a messaging context, we implement this by moving gradually from offering only fully generated replies based on knowledge content, to more custom build flows that ask questions, shows options and uses API integrations to guide the customer towards a solution.
Doing this in a chatbot context is *easy*, in the sense that we are in a live conversation with the customer, can show buttons, carousels and options on screen and give and get immediate feedback from customers.
Until now, doing this via email was not possible and both Zendesk and Ultimate only offer so called first-reply automations, where we could only handle the first reply of a customer.
This already allowed for some pretty nice use cases, for example, we can receive an email and check for an order number. If the order number is there, we can call our backend systems over API, look up the order status, and reply to the customer with a (custom generated) email that contains their actual status. Or, in scenarios where the email didn’t contain any order numbers, we can reply with instructions on where to find it.

But what if the customer finds the order number and replies back? Until now, those emails had to be handled by your agents since Ultimate only processes the initial ticket being created and ignores the rest of the conversation.
But with the release of the new conversational flows for email, we can handle email conversations exactly the same way as we do chatbot conversations. If a customer replies back with an order number, we can process that response, call our API and let them know its actual status.
And imagine a scenario where we tell the customer that “hey, your package was delivered”, and actually they haven’t received anything. Here too we can, upon reply from the customer, immediately jump into our “Lost package use case”. All without resorting to agents.

This last feature is currently in EAP though, so when I do get full access to it, I’ll surely do a write up on the feature!
# Zero-training
As you can see from the features described above, the capabilities of the Ultimate platform are a lot more powerful than Zendesk’s existing conversational and email bots. They can pull from more sources, they can reply more personal and can deeper integrate with external platforms.
There is another feature though that makes it worthwhile to look into Ultimate. All AI automation and intent detection that comes natively with Zendesk Suite is based on, so called, prebuilt AI Models which focus on specific industries like Retail, Finance or Education. This offers a great out of the box experience since you can get started with Zendesk AI without any setup or training, but creates issues when your customers start asking questions about topics Zendesk AI doesn’t know about.
There are flows to request new intents from Zendesk, but ideally you would be able to add your own intents to the platform. Ultimate always had that capability.
If I want to add a “How to escape from an Imperial Star Destroyer” to my Rebels’ bot, I can create an intent, add around fifty training phrases with different variants of the question and train my AI model. A few moments later, my bot understands the intent, and I can start replying with information about the topic pulled from my knowledge base, or I can create a custom flow with options and integrations.

It’s a great feature that allows for perfectly fitting your AI Agents into the way your company works and thinks.
The only downside of this approach is that we still need to train our AI model. We need to add training phrases, we need to make sure that the system doesn’t get confused by overlapping intents (changing and canceling an order for example) and adding a new intent means typing or generating dozens of training phrases that might, or might not match the way your customer thinks.
With the rise of OpenAI and bigger LLMs, we’re used to AI platforms that just *get* what I’m talking about. Similarly to how generative replies in conversations and emails pull information from a Help Center and write down a custom reply, it would be nice if I can just tell Ultimate I want to add a use case for “Customer want to get a refund”, and the system would *just know* what I mean and can immediately map all customer queries about this topic to that use case.

And, with the release of Zero Shot Bots (or zero training as it’s called now) Zendesk did exactly that. We can add a new use case, give it a name and a clear description and.. voila. My AI Agents now knows about a new use cases and can assign conversations about that topic to it, ready for generative responses or custom flows.

It might seem like a small difference, we’re just omitting the step of adding training phrases right? But in reality, it makes a huge difference on implementation time. If you now think “I should add a flow for those times “a customer asks about our shipping times”, you’re basically halfway there.
By just writing down that use case, your AI Agent can detect that concept, and what’s left is either adding Help Center articles with information on the topic, or building out a custom flow to handle the request with more nuance.
# More controls & governance
Wrapping up this section of the AI summit presentation was a section about controlling your AI Agent.
First off you can set a predefined or custom tone of voice for your AI agent that matches your brand. You can define where data and response are sourced from, and control which terminology the bot should, or shouldn't use.

All of these feels like an expanded version of what's already available in both Zendesk and Ultimate, but I do appreciate the fact that AI for Zendesk is not only about features and improving workflows, but that data governance, privacy and security are part of the platform they're designing from day one (or year twelve to be honest).
# Thoughts
As you might have read in between the lines, I’m a big fan of the Ultimate platform, and I’m glad to see Zendesk is clearing up the way they are offering AI Agents to customers by making one an included part of the platform, and making the other even more powerful and positioning it clearly as the *advanced* AI Agent.
I do see a future where the existing Zendesk Bot disappears and gets fully replaced by Ultimate, similar to how Zopim Chat is almost entirely replaced by Messaging now.
But for now Ultimate feels to be a few years ahead of the existing Zendesk Bot, and to be honest most of the competition, when it comes to features and capabilities, so offering it as an add-on on top of the already powerful Zendesk Suite seems a logical choice. Similar to how Advanced AI is there for those we need an assist for their agents, AI Agents powered by Ultimate are there for those who want to make their self-service and ticket automation more powerful. Not everyone needs it, but those who do will be glad it exists.

One small tidbit to wrap up the article: how awesome was this slide showing how terrible the setup experience at other platforms is? When I gave the code in this slide to ChatGPT and asked which platform this might be code from, it gave me this:
> 🤖 The code snippets you shared align well with the structure of how Salesforce Commerce Cloud handles these processes.
Quite the subtle dig at the competition, and reminds me of [this](https://www.reddit.com/r/MacOS/comments/18bacds/this%5Fis%5Fstill%5Fthe%5Fdefault%5Fpc%5Ficon%5Fin%5Fmacos/?rdt=53236&ref=internalnote.com) all time great macOS icon.
## Sign up for Internal Note
Turning Zendesk into practice. – A newsletter about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### An overview of the Zendesk AI Summit announcements
URL: https://internalnote.com/zendesk-ai-summit-announcements/
Last updated: 2025-07-06T17:51:46.000Z
Today Zendesk broadcast their AI Summit, an event focusing on innovations in Zendesk and Zendesk AI across its entire suite of products.
The actual event was held last week in New York as an on site event for customers, and today’s broadcast streamed the product release section of the event for everyone to watch.
Host of the presentation was Sarah Al-Hussaini, former co-founder of Ultimate and current VP of product at Zendesk.

The event started with a quick intro video highlighting all aspect of AI across Zendesk, and quickly moved into a conversation between writer Adam Grant and Stephanie Mehta, of Inc Magazine, focusing around how AI influenced are world.
The conversation was interesting with a few quotable topics like the question who will have the biggest impact: *those that use AI, or those that build AI*, while also focussing on the fact that there is a big part of the world growing up with conversations first who will quickly become used to having AI available. It’s an interesting discussion, and worth a listen. (Zendesk will have a digital broadcast available on demand not their website soon)

Interesting as the topic might be, I tuned into the event for product updates, so I was glad to see Sarah pass the stage to Zendesk’s CTO Adrian McDermott and Lisa Kant, SVP Product to guide us through the latest innovations in Zendesk.
They announced a lot of new features in this dense half hour presentation at a very rapid pace. While the presentation itself was scarce on details, Zendesk also uploaded tons of documentation to their website, so combining those with the latest EAP releases will give you a pretty good grasp on what’s been announced.
I will split this AI Summit overview into four articles.
Today will set the scene with an overview of how Zendesk positions itself on the market, followed by a high level overview of all the announcements. Tomorrow, and throughout this week I’ll publish three more articles each focusing on a key aspect of the presentation.
1. 🤖 [Deep dive in the new Omnichannel AI Agents](https://internalnote.com/ai-summit-ai-agents/)
2. 🧑✈️ [Overview of Agent Copilot](https://internalnote.com/ai-summit-agent-copilot/)
3. ☎️ [The new Zendesk Voice](https://internalnote.com/ai-summit-the-new-zendesk-voice/)
💡
(And.. hey Zendesk if you’re reading this:
Doing these write ups remotely after a digital presentation is quite an endeavor. Please invite me next time? 😇)
## Sign up for Internal Note
Turning Zendesk into practice. – A newsletter about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.

At Relate last year Zendesk, and again at this AI Summit positioned itself as the *Complete CX solution for the AI Era*, a suite of solutions that impacts all parts of your customer experience by offering four key features:
1. **AI-powered customer experiences**, leveraging AI to automate customer interactions via AI agents across all channels
2. **Workflow automation**, by enabling routing based on intents, and providing insights via summaries and intent detection
3. **AI-driven agent assistance**, by leveraging processes, knowledge, existing tickets and macros.
4. **Insights and analytics**, by auditing all your tickets and surfacing trends and outliers across all user interactions
Over the last year Zendesk already released tons of new features that broaden the impact of those four key elements.
The existing AI agent included in suite and powered by Zendesk got generative replies, more complex bot builder flow with parameters, and integrated deeper in Agent Workspace with a revamped conversation view for agents.
Advanced AI, the engine that powers both workflows and agent automation saw a general release of its knowledge base integrations, macro suggestions, suggested replies and tone shift features, while growing its AI models to tons of new industries including education, travel and employee service use cases. And Zendesk QA, Zendesk’s most recent acquisition got Bot QA and new Spotlight and AutoQA features over the past few months.
But even with those new releases, what was missing for me was a cohesive story for customers. Lots of the announcements of Relate, especially those around Copilot, were still in EAP and it felt that the friction between Ultimate and Zendesk Bot (or the confusion about what would happen) and the additional of AI bits and pieces across both Zendesk as a product and Zendesk as a license made the product line-up confusing.
This AI Summit presentation not only fixes a lot of the above, but also makes true on promises of earlier presentations and releases with a big line-up of product focussing on three main paths: your customers, your agents and your leaders.

Path one focusses on CX leaders and shows you how you can get **insights** in your data by leveraging Intelligent Triage and its Omnichannel Routing combined with deep insights via AI powered reporting. Traditionally a lot of the data in your company is locked in conversations and it’s costly and time consuming to read all conversations and extract valuable data from it. With AI we can automate this process and surface trends fast, automatic and at scale.
The second path is all about your customers and your customer experience. It’s about how Zendesk’s AI agents can help you **automate** up to 80% of your customer interactions while retaining, or improving your customer satisfaction ratings.
And finally, the third path focuses on tools that can **assist** your agents with resolving issues faster by leveraging Agent Copilot, reducing your average handling time by up to 20% and improve agent training on onboarding at the same time.
Or to put it differently, I asked Jon Aniano, SVP Product at Zendesk, how he would define the scope of this AI Summit:
> Zendesk’s goal for AI Summit is simple: to deliver the outcomes and benefits of the AI revolution to all CX and ES leaders - that means better & easier automation across all channels, transforming the role and quality of life of agents with copilot, and bringing automatic insights to operations leaders instantly.
Today’s article will give a high-level overview of the announcements, and as mentioned earlier, the next three days I’ll deep dive on each topic separately in more detail.
So, lets get started with the announcements:

Let’s dive in with the first star of the day: Zendesk’s AI agent and the new AI agent builder.
Powered by Ultimate, this new release will empower both conversations over web and social, and will also enable ticket automation over email channels.
The AI agent powered by Ultimate already offered robust omnichannel automation before this event, but this new release will add a couple of new capabilities making it easier to setting up a new bot, cutting down development and implementation time.
First off is the ability to use knowledge sources like your Help Center, website or blog to generate replies to customer emails or conversations. Similar to how conversational bots work, a customers’ inquiry can now be answered with a fully custom reply over email too. Also new is the capability to have multiple responses in a row and handle an entire email thread right within your AI agent, yet again similar to how chatbots work.
You can for example ask for an order number to assist a customer inquiring about the status of their order and explain the customer where they can find it. Once you have that order number, you can fetch the order status from your backend systems via API, and generate a nice reply back to your customers telling them the order should arrive in the next few days, followed by a tracking number.
This new capability unlocks the same kind of automation we’re used to for chat conversations, but now over email.
> AI agents boast an impressive 80% understood rate, resolving customer inquiries more efficiently.
Next was the announcement of the new Zero training option for AI agents. This feature does away with the concept of training a bots’ AI model by entering training data or training phrases in order to get your AI agent to understand new concepts like “How to replace a hyperdrive”.
With the new Zero Training you *just* need to enter a name for your use case and a short description, and your AI agent will immediately grasp the concept. You can then choose to have it answer based on your knowledge sources, or you can build a custom conversation flow to handle more complex scenarios.
From my experience with this feature during its early access program this cuts both implementation time and keeping your AI agent up to date with changes in your company in half.
And to wrap up the (text based) AI agent section, we got an update on expanded rule sets to maintain control on generative replies and check tone, terminology and other responses by your AI agent.
Your browser does not support the video tag.
Aside from text-based channels like messaging or email, Zendesk also has a phone channel as part of the Zendesk Suite. And at todays’ event Zendesk Talk got replaced with the **new Zendesk voice**.
The new capabilities of Zendesk Voice were interwoven across all parts of this presentation, and we got our first mention in the AI agent section of the presentation with the announcement of AI agents for Voice, powered by PolyAI
[PolyAI](https://poly.ai/?ref=internalnote.com) is a platform that leverages generative AI to create a so-called *Voice Bot*. It understands the customers’ questions, maps them to an intent and can then reply to the customer with generated replies based on knowledge sources, guide them through complex answer flows, or escalate to an actual agent, while asking the customer for the right information while doing do.
> With AI-powered voice assistants, over 50% of inbound calls are resolved autonomously, significantly reducing the load on human agents.
Notable here is that this is a partnership. Zendesk hasn’t bought PolyAI and hasn’t build this technology in house either. The two companies worked together to ensure an – at least as presented here on stage – seamless integration, helping you automate your most expensive support channels.
With the addition of voice to the AI Agent family, Zendesk now has a true Omnichannel Al agent solution, offering automation across conversations, email and voice, completing the automating customer experiences part of their promise at the start of this presentation.

The second big part of the AI Summit was all about the Agent Copilot.
Zendesk announced this new capability at [Relate](https://internalnote.com/zendesk-relate-day-1/) in April and has since been busy building out the product and feature.
They did a surprising switch here though. At Relate they announced Copilot as a mode in the comment field assisting agents with automating their replies and presenting next best actions. It lived alongside other Advanced AI features like the intelligence panel with intents, sentiment and summaries, and agents got additional context with other tabs in that panel that presented relevant tickets and macros.
It seems that in the last six months they decided that Agent Copilot as a brand was too valuable to be *just a text field.*
So today, they announced the release of Agent Copilot for all Advanced AI Customers. The *new* Agent Copilot assist agents in their ticket handling and contains a bunch of features deeply integrated in an upgraded Agent Workspace.
> Agent Copilot doesn’t wait for agents to prompt it; it proactively assists with suggested responses and next-best actions, ensuring faster resolutions.
The main release is the new auto-assist mode. This mode takes over the comment field and presents the agents with prewritten replies, and action buttons to automate part of the ticket handling. It’s powered by procedures you define for your agents, and pulls in information from your Help Center. And when you need to execute tasks in other tools like your CRM or order management system you can leverage the new Actions in Zendesk to setup reusable integrations. And all this without code and with just human readable text.
The new AI powered Agent Workspace also integrates other (pre-existing) elements like suggested macros, tone shift and other writing tools, summaries and intent prediction across the existing interface, and does away with the Intelligence Panel. This has the benefit that the AI elements feel like a more natural part of an agents workflow, and leaves room for more useful context panels like the [Customer Context Panel](https://internalnote.com/essentials-card/), Knowledge Panel or a [custom object record](https://internalnote.com/essentials-card-for-custom-objects/) to be always in view.
And just like for AI Agent, Zendesk also announced the addition of a Copilot mode for Voice. This new Copilot will be able to listen alongside a call your agents have with a customer, and will continuously prompt for next best actions and suggested replies to your agents by mapping intents and pulling information from your Help Center and procedures. It’s announced at the event with an availability of early next year. So I can only assume we’ll hear more of this at Relate 2025 next year!

And to end up where the conversation started: let’s focus on insights and data.
This is the third big use case for Zendesk AI, namely providing your team leads and company overall insights. Insights which can then be used to take action.
One of the big problems with data is that there’s too much of it, and that unlocking the important information within it has always been time consuming since you basically need to read every email, or listen to every call to get the important pieces.
With the release of Zendesk AI and Intelligent triage it’s now possible to automate this process and have Zendesk AI process all your interactions at scale, surfacing important data for you automatically, and before you know you need it.
A bigger new element for Intelligent Triage is the addition of Entity Detection. This allows you to define custom elements in Intelligent Triage which the system will search for in your tickets. Key examples here are order numbers, your products, hotel names or other parts of the conversations you can use to route tickets to the right team, or give to your agents as context for further support.
Custom entities can be detected and optionally written down to custom fields, which makes it useful for reporting purposes too.
> So where intents are there to know why the customers are contacting you, entities are there to know what they’re talking about.

All these insights become available in new Intelligent Triage (and Copilot) explore dashboards highlighting trends, making to possible to use this data to improve ticket routing, update documentation, or change processes to better meet the needs of your customers.

Measuring why customers are contacting you is one side of the coin, but it’s also important to know how you’re handling those inquiries. Know how efficient and solution-driven your answers are, know the sentiment of your customers and how tuned your agents (AI or human) are to these sentiments in their reactions and tone of voice are just a few of the elements that Zendesk QA and its autoQA feature measures, highlighting key elements like churn risks, dropped customer sentiment or other area’s you’d like to explore.

# Conclusion
To summarize the event, let’s quote Adrian McDermott at the conclusion of the presentation:
1. Leverage AI to get insights they never got before. Smarter more strategic decisions thanks to AI analysis.
2. Preparing for a world where 80% of the experiences are automated, and manage costs with AI agents and automated workflows
3. Empowering teams of human agents who take on increasingly complex cases while guaranteeing quality with Agent copilot.
*(slight paraphrased)*
In truth, the range of new announcement goes way deeper than both this one liner and this article.
Over the next few days I’ll publish three follow-up articles focussing on AI Agent, Agent Copilot and the new Zendesk Voice. Each article will focus on the new release in detail, and will wrap up with some insight on how these features will impact your Zendesk setup.
As for the event overall, I liked it. Zendesk Voice was a very nice surprise. Talk was beginning to feel a bit neglected and old, and this new AI-powered refresh will pull this product forward in a major way. As for how it actually works and if all promised improvements will actually have the impact that is promised remains to be seen, but with I’ve seen from PolyAI it’s bound to be good.
From a product line-up overall, Zendesk is getting more complex again. Where Zendesk Suite offered an all-in solution where you bought Zendesk and decided how many feature you’d need, we’re now back to buying Zendesk Suite and then choosing between a range of add-ons.
But if we put it all together into one flow, it does become easy to decide what you need.

Every customer starts with some version of Zendesk Suite. As they grow as a company, their support requirements will also grow with them and they’ll run into the issue of too many tickets and too much work for their customer care team.
That issue can be resolved in two ways:
1. You can lower the amount of escalated tickets by improving your ticket deflection and self service solution
2. You can improve the efficiency of your agents by providing them more context and automating more of their work.
Not every company needs both solutions, and not every company is a fit for both solutions. If you have a lot of recurring questions or processes that are repeatable, investing in a good AI Agent is your best bet. You can deflect tickets and give customers a better experiences since bots are faster than humans for those type of questions.
If you’ve got a high level of complex tickets or want to go for a white glove treatment for your customers – especially in the luxury sector – then going for an Agent Copilot is the better approach. Agents stay in control of those complex use cases that require a human touch, but the Copilot gives them all the context they need, and automates actions in other systems on behalf of the agent.
Once you’ve deployed either or both of these solutions you will see a decrease in average handling time and an increase in fully automated tickets. But that trend will flatten after a while as reality and changes catch up with your efforts. You’ll need to dive into reporting to find knowledge gaps, detect quality issues and find places to improve both your AI and human agents, as well as your processes. That’s where Zendesk QA comes in.
I’ve used the above approach with plenty of customers, and I’m sure it’s bound to help you deciding what’s the right product combination for you.
Tomorrow I’ll send out a second email with insights on the new Omnichannel AI agent release, followed by two more over the course of the week. Stay tuned!
#### Sources used:
- Zendesk AI Summit broadcast
- Zendesk Website
- Zendesk Newsroom articles
- Zendesk Help Center
- Conversations with product managers at Zendesk
- EAP access
- ****No data or screenshots were taken from internal resources or partner documentation.**
### A History of Zendesk chat and messaging channels
URL: https://internalnote.com/history-of-zendesk-messaging/
Last updated: 2025-03-07T13:25:24.000Z
Over the years Zendesk has expanded their platform from a simple email ticketing based tool to a full Suite of Customer Care and Employee Service solutions across multiple channels offering self service, agent workspace, AI Agents, social integrations and web widgets powered by the Zendesk API, Sunshine Conversations and other API services.
When talking to customers and colleagues it often gets confusing quickly when we want to find out on which combination of channels and services they run, and what's the right combination of those to get to a full setup. And this is especially true when we're moving customers from the classic chat solutions towards modern messaging environments integrated with the Zendesk Bot or Ultimate.
This article will serve as both a useful overview of legacy and existing solutions in there Zendesk platform and a reference for myself to explain this chaos to customers when it comes to explain setting up a good conversational channel for your Zendesk environment.
Zendesk currently has a few technologies in place to handle conversational experiences, and you might have seen or heard some of these terms: Zopim, Chat, Sunshine Conversations, Smooch, Zendesk Bot, Answer Bot, Messaging, Ultimate, switchboard, Web widget, classic widget, sunshine conversations web channel.
That's a lot of brand names and technologies, and it's easy to get lost.
# Introduction
So, what will this article contain? In it's most basic form we can explain enabling a conversational channel to Zendesk as follows:
A customer opens a web widget and asks their question. That question ends up in Zendesk and an agent replies.

A better version of this is:
A customer opens a web widget and asks their question. That question gets answered by a bot, and might get escalated to an agent. This version allows for self service and ticket deflection, lowering agent workload while improving the customer experience.

The above flows are just that, a high level overview of what happens when a customer contacts a company over a conversational channel.
But how does it actually work?
## Terminology
### Widget
A widget is a window where the customer can type there question in, see responses from a bot or agent, and read the conversation. It shows up on the website as a button that opens up into a modal pane.
### Channel
A channel is a unique way via which the customer contacts your team. It's a combination of a platform and brand. Eg. The Web Widget for brand A, or the Facebook Page for brand B, or the Instagram Feed of brand C.
Those channels can be integrated into Zendesk and get a unique `integration_id`which is used in the underlying platform and API calls.
### Business Systems
Tools like Zendesk and its Agent Workspace, Slack, Gmail inbox are all business systems that can receive customer inquires.
### AI Agents/Chatbots
AI Agents or chatbots are systems that automate responding to customers by retrieving information from your knowledge base, showing flows and asking for input for the customer. They receive input from a channel, and output to either the customer or switch the conversation to the next responder, e.g a business system.
### Conversational Platform
A Conversational platform is a set of APIs and business logic that orchestrates the interaction between customers and channels on one side, chatbots, and business systems and agents on the other sides.
Most work with a set of integration APIs or a configuration page to add the different channels, and have some kind of logic, often called a switchboard, to route specific channels to specific bots or business systems.
# Zendesk Chat
To start, let's with the basics and rewind our clock \~ 10 years.
Every Zendesk customer that wanted to use a conversational channel could enable Zendesk Chat as a channel. It enables customers to interact with agents via chat by talking to them in a widget.
Zendesk Chat used to be a separate company called Zopim that Zendesk bought in 2014\. Zopim offered a Live Chat widget and allowed agents to talk to customers in a separate chat interface that lived adjacent to the Agent Workspace.

Over the years Zendesk introduced their own widget (now called Classic Widget) that offered customers to either submit a webform or chat with agents. Here too, messages were routed over the Zopim platform to agents.

## Third Party Bots
Zendesk Chat, or more specifically Chat Enterprise, also offered a rich API which allowed for the addition of chatbots in the flow. Chatbot vendors could connect to Zopim over the API and both the Classic widget or the Chat window would then first offer a chatbot to customers, before the conversation got escalated to agents.
## Answer Bot
Back in 2018 Zendesk made its first venture into chatbots by released its Answer Bot. Powered by keyword search it would ask the customer how it could assist, and it would return three help center articles that might help. If the customer told Answer Bot those didn't help – or were bad suggestions – things got escalated to an Agent.
Answer Bot ran on top of the Zendesk Chat platform similar to how third party bots would run, but was configured entirely within the Admin center of Zendesk.

After the release of Answer Bot customers could now choose out of four options:
- Chat widget without a bot, offering only live chat
- Chat widget with answer bot
- Legacy widget without a bot, offering both chat and forms
- Legacy widget with answer bot
## Zendesk Chat phases
When looking at the Zendesk documentation, or when talking to Zendesk people, you might have heard the terms "phase 3" or "phase 4".
The Zopim integration in Zendesk went over a few iterations. Its first versions were Chat in a completely separate environment with separate logins not linked to Zendesk at all. This evolved into a separate Zendesk chat environment linked to your Zendesk account which was also reachable via a popup/overlay in Agent Workspace.
Currently, all customers that are still on Zendesk Chat use this latest, Phase 4 iteration of Zendesk Chat

# Smooch
In the late 2010s and early 2020s social messaging platforms like Facebook, WhatsApp and Twitter were on the rise and customers started connecting to companies over those channels more and more to give feedback, ask for support or well, complain.
Traditional customer care platforms like Zendesk used to be focused one webform and email based support channels and had only basic integrations with the most basic of social channels like Facebook posts or Twitter mentions.
But parallel to Zendesk's efforts a whole series of startups were beginning to focus on those social channels and started building toolkits to easily integrate social channels and CRM or customer care platforms. One of those platforms – Smooch – focussed on an easy to use API that made it possible to connect dozens of channels to bots and agent platforms. They promised to handle the complexity of routing conversations, maintaining status and, more important, abstracting away the unique elements of each platform by offering generic APIs for creating conversations, sending messages and switching conversations from bots to agents and back.

Zendesk recognized the need for expanding support for social channels in their platform and, in 2018, bought Smooch as an *easy* way to integrate their platform with dozens of social channels at once.
They bought Smooch, rebranded it as Sunshine Conversations and a new API platform was born!
💡
Right before the Smooch acquisition Zendesk released their first version of Custom Objects, User identities and Events and launches it under the Sunshine umbrella as a way to promote the extensibility of their platform. Naming their new acquisition Sunshine Conversations was a logical at that time, but now just feels confusing to me.
# Social Messaging
Integrating a platform like Smooch isn't done overnight.
In its first iteration Zendesk quickly patched and integrated WhatsApp, Facebook Messaging and Twitter DMs into their platform by building a Marketplace app called Social Messaging. Underneath this marketplace app, they routed all connected channels to Smooch and made sure that each channel would end up at the right customers' instance, and assigned to the right brand.

Smooch also offered a way more powerful Bot integration than the Zendesk Chat APIs did. Smooch supported bots across both web widget and social channels, and could more easily handle rich interactions like carousels, buttons and input fields.
By enabling the Smooch's [web channel](https://docs.smooch.io/guide/web-messenger/?ref=internalnote.com) customers could now offer a web widget on their widget that shows a rich chatbot, and escalate to Zendesk agents if needed.

# Sunshine Conversations
Even though customers got access to WhatsApp and other social channels via the Social Messaging app, Zendesk' wasn't going to stop promoting their newest acquisition as a product. Sunshine Conversations (or SunCo) as it was now called is a separate SKU customers can buy that offer some more powerful capabilities.

One of those is access to **switchboard**, an API that allows you to setup routing across different channels and platforms. Similar to the telephony switchboard of the 1900s this API allows you to route a specific channel (e.g. a specific Facebook page) to a specific chatbot. This allows for a lot more customization and enables a nice interaction between multiple channels, bots and agent platforms.

Zendesk still sells SunCo as up to this day for those that need higher API limits, more complex switchboard integrations and (some) third party channels. Most of the APIs that the paid-for SunCO gave access too are now freely available for all Zendesk Suite customers. (more on this below).
# Zendesk Messaging
So far in our little story we've seen Zendesk's early days of conversations with Zopim and Zendesk Chat. We saw a platform shift to SunCo with the Smooch acquisition and now we're reaching modern times with the release of Zendesk Messaging in 2021.
In essence Zendesk Messaging means a migration from conversations powered by Zendesk Chat/Zopim to conversations running on the Messaging/Sunco platform.
For most customers the move to messaging meant a move away from chats in a separate environment to conversations that arrive directly in Agent Workspace and look and feel like regular tickets.
After making the move to Messaging all social channels are moved from their classic setup or social messaging setup to Messaging. Which means all conversational channels like the web widget, Facebook, Instagram, the Zendesk SDK,.. now all appear under one big Messaging channels section in the Agent Workspace.

When Zendesk launched Messaging they also launched a new web widget. This new web widget was based on the design of the SunCo web widget and offered a rich conversational interface for customers to talk to, modernizing and replacing the old UI of the – now called – legacy classic Zendesk widget.
This new Zendesk widget only supports conversations and does away with the Help Center search, web forms and talk integrations the classic widget offered.
With Messaging, the flow of a customer conversation now looks like this:

## Zendesk Bot
When I started this article with "Zendesk naming gets confusing fast" I think this paragraph will proof that nicely.
Shortly after the release of Zendesk Messaging they introduced us to Answer Bot. Not the same answer bot as we knew from Zendesk Chat, but a new version that allows you to build flows via Flow Builder. These flows can guide the customer to specific Help Center articles, show button, carousels,...
[Learn how to build a full-featured Flow Builder Bot for Zendesk.In this article we will build a full-featured Flow Builder Bot for Zendesk. We’ll use every step type, use API calls and variables and show you how to create a bot yourself in a full length video tutorial.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-dinosaurs/)
The new Answer Bot got better over time and in 2023 it got renamed to Zendesk Bot with the introduction of Zendesk Advanced AI. This newer version of the bot allowed for generative responses, link responses to intents and expanded the bots capabilities with more powerful API integrations and parameters.
Since the new bot offers rich flows it means it's only compatible with the new Zendesk widget, leaving the legacy Classic widget in the dust.

# Ultimate
In March 2024 Zendesk announced their acquisition of Ultimate. Ultimate is an AI powered ticket automation platform that offers more powerful AI models, better bot builder capabilities and deeper reporting when compared to Zendesks' in house bots and capabilities.
[Zendesk acquires Ultimate: an in-depth overview of what the platform will gainZendesk is planning on acquiring Ultimate.ai, a leading AI and ticket automation platform. We’ve seen plenty of headlines, but what does this actually mean? This article dives into the nitty-gritty and shows what’s now possible thanks to this platform expansion!Internal NoteThomas Verschoren](https://internalnote.com/zendesk-acquires-ultimate/)
Ultimate, being built outside of the Zendesk, runs on its own technology stack and integrates with Zendesk by leveraging the SunCo APIs. Customers who want to use Ultimate in combination with Zendesk can do so by creating an API token in the Sunshine Conversation API section of the Help Center.
What's nice is that aside from – in my opinion — being a better bot and platform — Ultimate also abstracts away a lot of the integration work other bot vendors would need to do when integrating with SunCo and Zendesk. They handle the switchboard routing, can read [authentication metadata](https://internalnote.com/jwt-messaging/) just like Zendesk's own bot can and can set tags, user information and other data when escalating to Zendesk.

# AI Agents
This brings us to the last era, the one of the Zendesk AI Agents. After Ultimate's acquisition, Zendesk was quick in rebranding the platform and incorporating it into its broader product offering.
Customers who want to offer self service and ticket deflection can choose from a couple of AI Agents Types. They come in four flavors even though they aren't marketed as such.
1. The Zendesk Bot, the existing chatbot powered by Zendesk AI models and available in the Admin Center for configuration
2. Autoreply, email based replies to customers that suggest relevant Help Center articles, powered by Zendesk Guide search.
3. Ultimate Chat bots, powered by Ultimate's Zero shot AI models
4. Ultimate Ticketing automation, offering generative replies to customer emails powered by Ultimate's AI models.
Which one you pick depends on how complex or custom your needs are, but either one of them nicely integrates with Zendesk.
# Platform overview
The Zendesk Conversational platform grew quite complex quite fast. So if we take a look back at our initial flow: we had a customer opening a web widget, interacting with a bot, and ultimately reaching an agent, or resolving the conversation:

We can now expand this flow to the actual technically infrastructure of Zendesk:
💡
Note, this is still an abstraction, but it offers enough detail you can, hopefully, understand the pieces.
## Customer that only used the Zendesk Bot
This is the easiest flow. All native Zendesk channels and social platforms are handled by Zendesk automatically, forwarded to the Zendesk bot, and if needed escalated to your agents.

Behind the scenes however, Zendesk still leverages SunCo. Each of your native channels has an `integrationId`. They have a `defaultResponder`, namely the `zd:answerBot`, with a `nextResponder` of `zd:agentWorkspace`. All of which, luckily, you can just forget!
## Customer that uses the Zendesk Bot across multiple channels and brands
When we enable multiple brands in our Zendesk instance, things work similar from a platform perspective. However, Zendesk routes each channel to the right Bot based on the way the channels and brands are linked.

One weird quirkiness of the API though is that Zendesk exposes only a single instance of `zd:answerBot` as an integration to the Switchboard. So somewhere hidden in Zendesk, unreachable to us, there's a routing table that takes any conversation from the switchboard and passes it to a bot, and makes sure the right bot handles the conversation. But we can only affect this by assigning the bot to the right brand in the Admin Center, and there's no API access to handle this.
## Customer that uses Ultimate
When we move away from the native Zendesk Bot towards Ultimate, Sunshine Conversations begins to play a more visible role.
Upon setup we need SunCo credentials to integrate Ultimate, upon which Ultimate takes over and routes **all** available channels to itself, removing the link to the Zendesk bots. You'll find Ultimate in the SunCo integrations as `ultimateaibot`

## Customer that uses multiple Ultimate Bots
When a customer has multiple Zendesk brands and wants to link those to multiple Ultimate bots, we do not need to resort to any API work. Ultimate supports multiple bots in so-called [groups](https://support.ultimate.ai/hc/en-us/articles/360020358700-Connect-your-Virtual-Agent-Sunshine-Conversations-and-Zendesk?ref=internalnote.com) which allow you to map specific criteria like `integrationID` or website URLs to specific Bots.

## Customer that uses a mix of Ultimate and Zendesk Bots
The final scenario is the most complex use case. Let's say you're migrating to Ultimate bots and you want some channels handled by Zendesk bots, and others by the Ultimate bots.
In this scenario you'll need to get access to the paid version of Sunshine Conversations and start reading the [switchboard documentation](https://docs.smooch.io/rest/?ref=internalnote.com#tag/Switchboards) since you'll need to manually configure the switchboard and link some channels to `zd:answerBot` and others to `ultimateaibot` based on their `integrationID`.

You can read more about switchboard integrations in the following article:
[Using Switchboard to combine Zendesk Bots and AI Agents powered by UltimateZendesk AI agents come in two flavors. The native Zendesk Bot, and a more powerful one powered by Ultimate. But how do you combine both technologies in one Zendesk instance? This article will explain you how!Internal NoteThomas Verschoren](https://internalnote.com/using-switchboard-to-combine-zendesk-bots-and-ai-agents-powered-by-ultimate/)
💡
Zendesk did announce that they'll soon have the capability to manage combinations of Zendesk Bot and SunCo bots from within the Admin Center. But no ETA yet.
## A Tale of two AI Agents
In February 2025 Zendesk announced and launched a simplified line-up of their AI Agents. Gone are the different options and technologies and in comes a less cluttered line-up.
AI Agents now exist as Essential and Advanced options. The AI Agent Essential replaces the existing Zendesk Bot and offers **only** generative replies from the Help Center (and soon email). It removes Flow Builder, Article links and intents and offers powerful generative bot to get you started on the [road to automation](https://internalnote.com/road-to-automation/) and is powered by the uGPT engine of Ultimate.
AI Agents Advanced is a rebranding of Ultimate and offers the full suite of chat and email bot capabilities of the platform.
Let's pour one out for the Zendesk Bot and Flow Builder.
[What’s new for Zendesk AI Agents, essentials and advancedIn this article we’ll dive into Zendesk’s new AI Agent offering, and showing you how you can grow your automation with Quick Replies for the Help Center, AI Agent Essentials and the new Advanced offering.Internal NoteThomas Verschoren](https://internalnote.com/new-ai-agents/)
# Where to go from here
So, after all this, where does this leave you, the reader?
At least I hope you get some understanding in the possibilities Zendesk offers and how the different pieces of their ecosystem interact.
On the other side, I hope that for some people it raises some red flags. If you are still using legacy Chat in combination with the Classic Widget, I'd seriously consider moving to the modern Messaging setup since that's what gets the development, documentation and support resources these days.
If you are using messaging and still use the Classic Widget, I recommend migrating to the new Messaging Widget in order to get support for AI Agents, or conversational flows that just ask for name, email e.a.
If you are somehow using the SunCo Widget, move to the Messaging Widget. It has (almost) the same feature set and actually gets support these days. The SunCo Widget has been on live support for about a year now.
And if you're using Messaging and some kind of AI Agent already, well done. You can just keep using the new features, kick back, relax and enjoy your life.
## Bonus: Zendesk Message
Even though the above is a full overview of all Zendesk conversation products up till today, I skipped over one of them. Right before Zendesk bought Smooch they had a short-lived product called Zendesk Message.
The product provided a brand new interface outside of the regular Zendesk workspace that focused on conversations and chats and did away with any of the traditional concepts like ticket fields, statuses or other powerful features that Zendesk offers.

I [found](https://www.demeterict.com/en/zendesk-stories/introducing-zendesk-message/?ref=internalnote.com) **one** screenshot online after searching for a long time.
Even though this product was short-lived it's amazing to see elements like the Interaction History and speech bubble based layouts in this layout. Elements that only recently showed up in the Agent Workspace. I kinda like this cleaner layout. Less options, less information, and a focus on work todo (left), the conversation (center) and context (right).
## Sign up for Internal Note
Turning Zendesk into practice. – A newsletter about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Zendesk News Roundup for October 2024
URL: https://internalnote.com/roundup-2024-10/
Last updated: 2024-11-03T10:47:55.000Z
Welcome to Octobers' newsletter. When I started preparing this article two weeks ago it felt like a very light issue. That was, until Zendesk opened the floodgates late last week and releases a dozen features all at once.
Thanks Zendesk!
# 🏢 Company
## Rebranded Zendesk QA
Last year Zendesk bought Klaus as a way to bring in Quality Assurance into the Zendesk platform. It allows for automatic processing of all your tickets – both those handled by AI Agents and human alike – and gives you insight in quality or responses, customer feedback, dangers like churn and surfaces tickets that warrant attention.
This month Zendesk fully moved Klaus into the Zendesk platform by redesigning the UI to better fit with the rest of the Zendesk platform, and also made the new features available in two specific license options:
- Zendesk QA add-on: Get Zendesk QA for all your agents
- WEM Add-On: A new add-on SKU bundling Zendesk QA and WFM, it's scheduling and employee management tool.

# 🎉 New Releases
## 🤖 AI Agents
It seems to be quiet before the storm when it comes to AI Agents. Next week Zendesk has their AI Summit (with a [digital broadcast](https://virtualevents.zendeskai-summit.com/series/ai-summit/landing%5Fpage?lang=en&ref=internalnote.com) a week later) so I think we can see a lot new bigger releases then.
# 👨🏻💻 Agent Workspace
### Agent Home
Starting THIS week [Zendesk](https://www.linkedin.com/company/zendesk/?ref=internalnote.com) will rollout their new Agent Home as the new experience for all customers who use Agent Workspace.
This means the old dashboard will be replaced with a new home page that gives agent direct access to assigned tickets, recent updates and followed tickets.It’s a big shift away from traditional view based workflows, but if you want to get the most out of this new experience, I’ve got you covered! I wrote [a full article](https://internalnote.com/agent-home-tips/) with the best tips and tricks to get started.

Leading up to this big release the Agent Home also got an update with an expanded Channel filter that now includes all Zendesk channels ranging from web (forms, api, tickets created by agents), to Messaging (chat, social and web) to Child Tickets created via Side Conversations.
This is a big release!
### Updates to Omnichannel Routing
Omnichannel Routing still seems to be the way forward when it comes to having a strategy for assigning and distributing tickets to your team in Zendesk.
Up til now you could only assign tickets based on capacity. An available agent with the least assigned tickets would get the newest ticket assigned (if skills matched). With the new [round-robin](https://support.zendesk.com/hc/en-us/articles/7990049158554?ref=internalnote.com) option you can now assign based on the last time a ticket was assigned to an agent, giving you a different way to distribute tickets.

Additionally we can now make email tickets act similar to Messaging tickets and have them automatically open in a new tab for agents upon assignment. This way agents don't always need to go back to Agent Home (or a view) to check for new work.

And to conclude this months' routing updates, we now have the ability to add both new tickets that have never been assigned to an agent, as well as tickets that are reassigned to another group to queues. Until now tickets could only go into a [queue](https://internalnote.com/beyond-triggers-moving-to-queue-based-assignment-in-zendesk/) once, but now when you reassign a ticket from your Support team to the Finance team, all queues and routing rules for that group will be applied.
Pretty useful and that will fix the routing logic for many customers!

### Saved searches
The new search function with recent searches and built in filters was launches earlier this year. It offers a quick way to retrieve relevant tickets or users, and – at least for me – offers a nicer experience than the global search experience.

With this month's update you can [save your search query](https://support.zendesk.com/hc/en-us/articles/8045381365786-Announcing-the-ability-to-save-searches?ref=internalnote.com) so that you can run the same searches more easily. You can store up to 20 searches which you can give a unique name. Note, searches are per user so there is no global search filters to be shared.
### Advanced AI
The Merge Suggestions feature for the Intelligent Panel has now been made available for all Advanced AI users. This new panel will surface active tickets from the same requester about the same topic, allowing agents to quickly [merge](https://internalnote.com/merging-tickets/) them before working on the issue.

We also got a new education intent for Intelligent Triage and the Zendesk Bot, aiming to meet the specific needs of managing and updating information about education courses, examinations, admissions, scholarships, and student life.
### View Categorization
> Zendesk is pleased to announce the ability to categorize both your shared and personal views. Categorizing views creates a folder structure in Zendesk Support so that you can more easily navigate your views list.
I've got some [views on Views](https://internalnote.com/my-approach-to-zendesk-views/), but I really like this new categorization feature. The more assignment and a list of your work moves towards Agent Home, the more we can start using Views as a way to get an overview of the outstanding work overall sorted by topic, priority, customer or team. This new categorization makes it possible to collapse similar views into nested sections, making a long list of up to a lot more manageable


In addition to [categorizing views](https://support.zendesk.com/hc/en-us/articles/8043835835674-Announcing-the-ability-to-categorize-views?ref=internalnote.com), the limit for shared views has been increased from 30 to 100\. This new feature does run the risk of enticing people to create even more views than before, but as long as you make sure there is **one** spot to see all work to be done sorted by service level or priority, I think you're good!
### Estimated waiting time
One feature that got lost in the migration from Chat to Messaging was any sense of waiting time for the customer. With the recent introduction of Messaging triggers, these last few feature gaps are now being filled.
> With this change, businesses can now set expectations on wait time with their customers. An admin can set up [messaging triggers](https://support.zendesk.com/hc/en-us/articles/8015292388378?ref=internalnote.com) to share estimated wait times with customers after the messaging ticket is added to the queue. Wait time is estimated based on the ticket's position in the queue. They can also set up triggers to send a message once the messaging ticket is assigned to an agent.
Speaking of Messaging Triggers, keep an eye out for a new article on those later this month! [Subscribe today](https://internalnote.com/#/portal/signup) for free to Internal Note to get this directly in your inbox!
### Ending messaging sessions
It's now possible for agents to end a conversation with a customer right from within Agent Workspace by clicking an *end session* button.
Before this, you needed to solve (and close) the ticket via a macro or trigger to pass control back to an AI Agent, but with this new option, those *hacks* are not needed anymore.
I do feel a conflict between Messaging sessions with its *send* and *end session* button on one end, and the ticket status buttons on the other. The amount of times I've submitted a ticket instead of sending a reply is, well, a lot, and this might add additional confusion by adding yet another button to the Agent Workspace.

## 🔎 Help Center
No new releases this month for the Help Center, but we did get two fun EAPs!
- Support for Custom Objects in end-user forms (EAP to be found [here](https://support.zendesk.com/hc/en-us/community/posts/8009077248282?ref=internalnote.com)).
- Support for multi-placement of articles (EAP to be found [here](https://support.zendesk.com/hc/en-us/articles/7867489163930-Placing-articles-in-multiple-sections-with-article-multiplacement-EAP?ref=internalnote.com)).
Both are long-awaited items and once I get access to these, I surely write about them!
## 🧱 Open and Flexible Platform
### Redaction suggestions
If you use the Advanced Data Privacy and Protection add-on you can now [setup](https://support.zendesk.com/hc/en-us/articles/6669399593882-Automatically-detecting-sensitive-information-for-redaction?ref=internalnote.com) redaction suggestions that highlight PII for your agents in tickets.
### Closed Tickets editing
You can now do limit edits on Closed Tickets via the Agent Workspace or Zendesk API. You can edit the Tags, Subject, and Priority ticket fields on closed tickets making it possible to tweak how these tickets show up in, for example, your reporting after Agents already wrap up the ticket.
## 📊 Reporting and Insights
### Customizable CSAT
Earlier this year Zendesk announced the Customizable CSAT as a better way to ask customers for their opinion. The entire feedback from got a redesign, and customers can now:
- Edit the feedback form title and text
- Select a rating scale range with either 1-2, 1-3, or 1-5 scale increments, compared to the old thumbs up, thumbs down from before.
- Display rating options as numerical, emoji, or custom text
In your reporting these will still show up as Good/Bad though. Read more about this feature in the article below:
[Preview of the new Customisable CSAT EAP for ZendeskThe new Customisable CSAT EAP for Zendesk has arrived, finally allowing you to change your rating scale, choose emoji, numbers or labels, and customize your follow-up questions. This article contains an initial overview of the new feature, and shows how it works with existing API integrations.Internal NoteThomas Verschoren](https://internalnote.com/preview-of-the-new-customisable-csat-for-zendesk/)
# ⚠ Major Changes.
## 2SV Authentication
Starting end of October Zendesk will start rolling out (and enabling) a new security feature to all customers:
> Customers who have Zendesk authentication turned on will be automatically enrolled in 2SV. When customers sign in from a new device, 2SV will prompt them to enter a 6-digit code they must retrieve from the primary email address on file before they can sign into their account.
This will be annoying for customers that share credentials across employees or with third parties, but is a welcome change from a security/phishing/credential leak standpoint.
Read more [here](https://support.zendesk.com/hc/en-us/articles/7955412933274-Announcing-two-step-verification-2SV?ref=internalnote.com)
### Sunshine Conversation integration deprecations
When Zendesk bought Smooch a few years ago they rebranded it to Sunshine Conversations, added the APIs right inside the Admin Panel, and basically left the rest of the platform alone.
Apparently that's now changing with a first set of deprecations of existing platforms:
- Deprecation of Sunshine Conversations’ Slack Connect Integration on Sept 12th
- Deprecation of Sunshine Conversations’ Help Scout Integration on Jan 6th 2025
# 💡Insights
## The information on Resolution Based pricing
> Instead of charging businesses based on how often they use the software—essentially an AI chatbot—to try to resolve customer problems, Zendesk began charging them only when the chatbot completed the task without needing employees to step in.
[Read the article](https://www.theinformation.com/articles/new-ai-business-model-charging-customers-only-when-the-tech-works?ref=internalnote.com)
## Grace Hopper on Data Storage
> \[11:30\] I thought up a couple of curves. I have no numbers to put on them and research hasn't been done yet – But at least I think I can talk about the shape of them. Suppose this is dollars, and this is time --
>
> And an event occurs here. Now the value of the information about that event goes up quite sharply immediately after the event, which the further you get away from the event in time, the more the value of that information levels off. It goes up very sharply and it levels off. Now ultimately, it either gets replaced by a new
> piece of information, or we decide we don t need it online anymore and we transfer to historical files, microfilm or something like that. Of course, in industry they have to save it for the IRS, so the value curve probably look something like that: a sharp rise, a leveling off, and then an eventual transfer to some form of historical file.
> What about the cost of that information? Cost of information is very, very low at the time of the event, but the further you get away from the event in time,
> the more the cost you pile up to start, maintain it, and add any information to it. So the cost curve starts low and then it goes zooming up – **Now there is a lovely crossover point there – that is the point at which keeping that information in our online system is costing us more than it's worth to us.**
I saw this presentation last week and this specific section made me think of [Zendesk's storage pricing](https://internalnote.com/storage-limits/). Keeping all tickets is relevant to feed your reporting, to use them in the Intelligent Panel similar tickets, and as a reference for Content Cues and Macro Suggestions.
On the other hand pulling information from tickets that are 2, 4, 8 years old becomes less and less useful overtime. So each company has some kind of crossover point where the usefulness of those old tickets is not worth the cost of keeping them around.
### Cards Against Complexity: A Podcast
> The podcast where we dive deep into the world of customer experience (CX) with a twist! Whether you're a seasoned CX expert or just starting out, join us for real conversations on complex service topics, and laugh a little along the way.
The team at Next Matter [launched](https://www.nextmatter.com/blog/we-did-customer-experience-in-the-woods-with-our-own-podcast?ref=internalnote.com) a new podcast focussing on CX with a twist. The first episode features Julian from [Babelforce](https://internalnote.com/sponsor-babelforce/). Fun to see how close the Zendesk partner ecosystem works together!
[Next Matter on LinkedIn: "CX in a Hawaiian Shirt" | Julian Hertzog | Cards Against Complexity | Ep…Ep 001 of Cards Against Complexity is live! 🎙️👕 Here's a sneak peek of our first hand of cards with Julian Hertzog from babelforce | Zendesk Voice Partner…LinkedInNext Matter](https://www.linkedin.com/feed/update/urn:li:activity:7245401795240280065?ref=internalnote.com)
# 📝 Articles this month
[Automating article attachments with the Guide Media API and ZapierThis article explains Zendesk’s new Media Gallery for Help Center articles, allowing you to manage images across multiple articles. We show off the Media Library API, which enables automated uploads from external tools like Google Drive using Zapier, improving workflow efficiency for teams.Internal NoteThomas Verschoren](https://internalnote.com/automating-article-attachments-with-the-guide-media-api-and-zapier/)
[Handling duplicate ticketsThis article explores ways to merge duplicate tickets from the same user. Customers often submit multiple requests via various channels, slowing response times. Solutions include using the Customer Context Panel, Zendesk AI-based Merge Suggestions, or automating ticket merges.Internal NoteThomas Verschoren](https://internalnote.com/merging-tickets/)
[Preview of the new cards for Custom ObjectsZendesk’s new Essentials Card lets you customize user profiles next to tickets, and now, Custom Object Cards do the same. You can reorder, hide, or add fields to streamline your agents’ view. A simple yet customizable update to enhance the agent experience.Internal NoteThomas Verschoren](https://internalnote.com/essentials-card-for-custom-objects/)
# And Finally...
> All unassigned messaging conversations become inactive after 10 minutes without end user interaction. The standard omnichannel routing configuration counts only active messaging conversations towards an agent's capacity. This behavior is controlled by the messaging activity routing setting. When messaging activity routing is off, messaging tickets that become inactive while still in a queue can be assigned to any available agent without taking up their capacity.
Omnichannel Routing.. just when you thought you understand it, they [throw](https://support.zendesk.com/hc/en-us/articles/7640406656410-Workflow-Using-omnichannel-routing-queues-to-handle-active-and-inactive-messages-differently?ref=internalnote.com) you another random feature that makes it confusing again 😅😅
Thanks for reading!
## Sign up for Internal Note
A blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Preview of the new cards for Custom Objects
URL: https://internalnote.com/essentials-card-for-custom-objects/
Last updated: 2024-11-03T10:48:03.000Z
Last summer Zendesk released the new Essentials Card for user profiles. It allows you to customize the data shown for a requester next to a ticket. You can hide user fields and reorder them to fit your needs.
[Preview of the new Essentials Card in ZendeskA quick overview of the new Essentials Card for Zendesk user profiles.Internal NoteThomas Verschoren](https://internalnote.com/essentials-card/)
Similar to user profiles, Zendesk has another type of data that can be shown next to tickets and that's [Custom Objects](https://internalnote.com/tag/custom-objects/). When you link a Custom Object to a ticket via a Lookup Field, you can use the record inspector to show its data next to the ticket conversation.

Up to now you couldn't modify this view. Fields were shown in the order they were added in the Admin Panel when you configure the object, and you can't hide fields to be shown.
In the screenshot above for example fields like *Distributor* and *External ID* are useful for some flows like [Custom Object Triggers](https://internalnote.com/multi-select-support-for-users-organizations-and-custom-objects-in-zendesk-2/) but not relevant for my agents.
# Custom Object Cards
Enter Custom Object Cards. Similar to how the User Essentials Card allows you to modify what's shown, we can dive into *Admin Center > Workspaces > Cards* and select a Custom Object type from the list.

Once selected, you can use the rightmost panel to reorder your record fields by dragging them to a new position. You can use the X to remove them from your Agents' view, and similarly you can use the *Add Field* button to add a previously hidden field.

## Agent Experience
After customizing the Card, your agents will see the new layout appear the next time they open a ticket:

# Conclusion
The new Cards for Custom Objects are a nice MVP but I'd love the Record Inspector to show a richer experience than the current plain layout.
Why can't we add some color to the mix and e.g. highlight the *Action* genre in the screenshot above with a green color? Summary could be nicer text than the grey text box, and a bit more visual hierarchy would be a nice to have too.
But aside from those wishlist items — and admit it, everyone has some – I like the way the Agent Workspace gets more customizable month after month.
### Handling duplicate tickets
URL: https://internalnote.com/merging-tickets/
Last updated: 2024-11-03T10:48:11.000Z
Earlier this month at the [Zendesk Partner Days](https://www.linkedin.com/posts/zendesk-partners%5Fthanks-to-everyone-who-made-the-2024-emea-activity-7240037729349066752-kvff?utm%5Fsource=share&utm%5Fmedium=member%5Fdesktop) a conversation came up about the best way to merge tickets made by the same end-user. It's a scenario that happens a lot. A customer has an urgent question and they shoot an email, web form and social message to every support channel they can find.
Not only will this not result in a faster response, it'll actually make matters worse since they are clogging up the ticket queue of agents with multiple identical questions, delaying responses for everyone. And they introduce the risk of getting different responses from different agents handling their tickets.
Since you can't block customers from doing this, we need to resort to features in Zendesk to handle this common issue.
# Approach 1: Customer Context Panel
The easiest solution is leveraging the Customer Context Panel to find all recent tickets from a customer. You can open these tickets in new tabs and merge them with the current ticket, before you move forward handling your customers' ticket.
The downside is that it requires manual work and introduces another step for your agents, but it's a native feature that's available for all Zendesk customers so requires no additional apps or licenses.

# Approach 2: Leveraging AI
One of the key selling points for Advanced AI is that it automates manual steps done by agents. In our case, the manual step of checking for duplicate tickets can be automated by leveraging Zendesk Advanced AI.
The [*Merge suggestions*](https://support.zendesk.com/hc/en-us/articles/6885971957914-Merging-related-tickets-based-on-suggestions-EAP?ref=internalnote.com#:~:text=The%20merging%20suggestions%20feature%20identifies,Workspace%20to%20use%20this%20feature.) options in the Intelligence Panel will offer agents a list of similar active tickets from the same requester. Agents can select tickets and merge them, thus removing these tickets from the queue and having one single ticket with all context to work on.
This works for scenarios where users fire identical requests – even those phrased differently – across different channels, or for new tickets that are responses to or continuations of existing tickets. E.g. a customer emailing a picture of the problem in a separate email.
The upside is that the filtering is better than just looking at recent tickets and the system surfaces relevant tickets automatically, removing these additional steps from your agents' workflow. But as with everything in Zendesk Advanced AI, your agents still stay in control. It's the agent that merges tickets, preventing accidental wrong merges by simply automating the matter fully.

# Approach 3: An automated, but unfiltered, approach
Internal Note wouldn't be in Internal Note if an article didn't include some over the top hack of existing Zendesk features 😅. One of the scenarios we discussed at the Partner Days was a way to automatically merge all active tickets of the same requester, regardless of their content.
So, let's do exactly that.
First we want to know if a user has an active ticket. We could do a lookup via external workers and the `/api/v2/users/{user_id}/tickets/requested` endpoint, but there's a way we can do this in-product.
In our approach we will store the *ticket id* of a requesters' latest ticket in the user profile. We can then check this value to see if a user has an active ticket, and if so merge an existing ticket into our new ticket, clearing up the queue.
💡
I purposefully use the latest ticket as the remaining ticket so that if a customer manages to resolve their inquiry themselves, that's the first message an agent will see.
## Storing the latest ticket
In order to store the latest ticket, we need to create a new user field first called *Latest Ticket* with field key `latest_ticket`.

Once setup we can use a trigger to update this field whenever a ticket is created. For this we need a webhook that updates user profiles. I wrote a full tutorial on the topic in this article:
[Update a requester name via webhooks and custom fieldsUpdate a requesters’ profile based on form field input.Internal NoteThomas Verschoren](https://internalnote.com/update-a-requester-name-via-webhooks-and-custom-fields/)
But in essence you need to create a webhook that calls `api/v2/users/{{ticket.requester.id}}.json`.
🔒
Do make sure to use `admin@domain.com/token:API_TOKEN` as the authentication method, leveraging a Zendesk API token. You no longer can use passwords for API authentication as of this summer!
Once you've configured the webhook, create a trigger with the following conditions:

And the following action:

```json
{
"user":{
"user_fields": {
"latest_ticket": {{ticket.id}}
}
}
}
```
Once setup this trigger will look at each created ticket and check if the value of *Latest Ticket* is blank. If blank, it'll update the user field with the ID of our current ticket.
## Merging new Tickets
If you're wondering why we check for the presence of the *Latest Ticket* in the previous ticket instead of just updating it every time a new ticket is created – nice catch!
The reason we need to check and can't just update the value anytime a ticket is created is simple: if we always update the ID with the latest value upon creation, we always overwrite previous values and loose the chance to merge tickets.
In this final step we'll wrap up our workflows and merge new tickets into existing tickets if they're available. First we need to create a webhook we can use to merge tickets. Similarly to the previous step, this is based on an earlier article on this blog:
[Escalating a customer request to a Zendesk Help Center form for more information.This article shows you how to escalate an existing ticket to a new ticket form submission and merge the result.Internal NoteThomas Verschoren](https://internalnote.com/asking/)
Here to, we need a webhook that calls `api/v2/tickets/{{ticket.id}}/merge` with a configuration like the screenshot below:

We then create a new trigger with the following conditions:

In this scenario we run the trigger when we **do** detect a Latest Ticket value. Our trigger will then do two things:
1. Merge the older ticket into this the newer ticket
2. Update the *Latest Ticket* field with the newer Ticket ID.
💡
We can update the **Latest Ticket* field ince we already fired our merge webhook first. Even though it might not have finished, we passed the **Latest Ticket* value so we can safely update our user field now.
### Merging Tickets

```json
{
"ids":[{{ticket.requester.custom_fields.latest_ticket}}],
"source_comment": "Closing in favor of #{{ticket.id}}",
"target_comment": "Combining with #{{ticket.requester.custom_fields.latest_ticket}}"
}
```
### Update User
And identical to the first trigger:

```json
{
"user":{
"user_fields": {
"latest_ticket": {{ticket.id}}
}
}
}
```
## The Result
Once enabled, whenever a user creates a ticket, we'll check if they have a previous ticket. If they do, we will merge that ticket into their most recent active ticket each time they create a new ticket.
Since closed tickets can't be merged, we can be sure we'll only merge active tickets



Naturally, the approach above is **crude**. If a customer emails about different topics we still merge tickets. You can prevent this by leveraging more conditions in your triggers. For example, if you have Advanced AI you could only merge tickets with similar intents. Or you could set an automation that, if a ticket is older than a week, you set the *Latest Ticket* value to *blank* so that our trigger doesn't run,...
Regardless, during my conversation at the Partner Days we were explicitly talking about this broad approach, and promises be promises, here's the article for those present on is how I would tackle it in more detail.
# Approach 4: Leveraging the Zendesk Marketplace
When it comes to Zendesk you can be sure that if there is a process that can be done via triggers, API and webhooks, there's bound to be a Partner on the Marketplace that used those elements to create an app.
[Merge Tickets](https://www.zendesk.com/marketplace/apps/support/1052353/merge-tickets/?ref=internalnote.com) by Knots (disclaimer, they [sponsored](https://internalnote.com/sponsor-knots/) this blog a few months ago) is such an app. It offers a nice UI to setup different conditions and it will then will automatically merge tickets that match those rules.
You can merge tickets with the same requester, category, subject or other custom field, add an internal note with information about the different merged tickets and even choose to turn comments from other tickets into internal comments.
The latter is useful if you combine information from different users. For example: a ticket from a customer complaining about a delayed delivery gets merged with the feedback from the delivery partner. You don't want either part to see each others' comments.
The app from Knots is only one of [many](https://www.zendesk.com/marketplace/apps/?query=merge&ref=internalnote.com) on the Marketplace that offer similar capabilities, all in different forms and functions. I kinda like how this one integrates with the rest of their suite of ticket automation apps though.


# Conclusion
The problem of duplicate tickets in support is an annoying issue. It inflates ticket numbers, duplicates agents work and might make appear certain topics bigger than they are in reporting if multiple copies of a ticket are raised by the same customer.
Self Service, good documentation and documented processes are a way to prevent duplicate tickets. Similarly, enabling an [internal SLA on first reply time](https://internalnote.com/sla-policies/) will motivate faster reply times, hopefully preventing customers' from duplicating requests due to lack or slowness of feedback.
But if those all fail, the native features in Zendesk – being it Customer Context for agents or AI suggestions – can downside this issue, and API integrations can assist with cleaning up tickets in bulk.
### Automating article attachments with the Guide Media API and Zapier
URL: https://internalnote.com/automating-article-attachments-with-the-guide-media-api-and-zapier/
Last updated: 2024-11-03T10:48:20.000Z
Over the last year Zendesk has been upgrading their attachments experience for Help Center articles in a major way.
When adding attachments, files or images, to articles it used to be that each attachment was linked to a single article. You could only see attachments when looking at an article, and if you wanted to add the same image to multiple articles you had them upload them again and again for each article.
Last year saw the release of the Media Gallery for the article editor. This central repository of files makes it possible to upload an image once, and reuse it other articles by selecting it from the gallery. Similarly you can replace an image, and every article where that specific image lives, will now show the newer version of that screenshot or photo.

## Media Library API
This new Media library is great, but there are scenarios where going into Zendesk and uploading your attachments is not very handy. In bigger companies it's often the marketing team that creates the *perfect* screenshots that can be used by the writers team in their articles.
You could give your marketing team access to the your Help Center, but thanks to the new [Media Library API](https://developer.zendesk.com/api-reference/help%5Fcenter/help-center-api/guide%5Fmedias/?ref=internalnote.com), we can allow uploads from external tools.
## Leveraging external sources.
Let's say your Marketing team creates your assets in a tool like Figma, and then uploads them all to a central Google Drive folder everyone can reference. You could go into the drive each time you need an image and upload it into the Media Gallery. But by combining the new API and a tool like Zapier or Make, we can automate this and automatically upload any new image on Google Drive right into Zendesk.
# How does the API work?
The Media API has a few endpoints that need to be called in the right order to upload attachments into Zendesk.
1. We first create an **Upload URL** that allows us to upload an image or file to Zendesk's storage.
2. We then upload the actual **file** to that endpoint
3. We then create a Guide media object which adds the upload file to the media gallery.
## Upload URL
To create an **Upload URL** we need to let Zendesk know what `file type` and `file size` we want to upload.
We do this by doing a `POST` to `https://{{domain}}.zendesk.com/api/v2/guide/medias/upload_url` with the following payload
```json
{
"content_type": "image/png",
"file_size": 12345
}
```
This returns the following data
```json
{
"upload_url": {
"asset_upload_id": "01J73HEF2PYN50PB9ZXYA1EBPF",
"url": "https://uploaded-assets-pod17.s3.eu-west-1.amazonaws.com/17/12154371/01J73HEF2PYN50PB9ZXYA1EBPF?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIARVNLH63KCBTH4T3L%2F20240906%2Feu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20240906T112754Z&X-Amz-Expires=3600&X-Amz-Signature=8b4a372bf96148be65e8a27f9574f130c72ab2b14759eab828731cfc6c113355&X-Amz-SignedHeaders=content-disposition%3Bhost%3Bx-amz-server-side-encryption&x-id=PutObject",
"headers": "{"Content-Disposition":"attachment; filename=\"01J73HEF2PYN50PB9ZXYA1EBPF.png\"","Content-Type":"image/png","X-Amz-Server-Side-Encryption":"AES256"}"
}
}
```
We'll need these 3 elements in our next steps.
## Uploading our file
The previous step gave us a `url` to upload our file too. Since Zendesk uses AWS for its hosting and data storage we need to upload our file directly into one of their S3 buckets.
We do this by doing a `PUT` to the `https://uploaded-assets-pod17.s3.eu-west-1.amazonaws.com/17/12154371/01J73HEF2PYN50PB9ZXYA1EBPF?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIARVNLH63...` URL we retrieved in the previous step while adding our file as a `--data` element in our request.
Do note that we should include the `headers` that were provided in that first step too. Done correctly we get a status 200 back.
```
Content-Disposition:attachment; filename="01J73HEF2PYN50PB9ZXYA1EBPF.png"
Content-Type:image/png
X-Amz-Server-Side-Encryption:AES256
```
## Creating the Media Object
And finally we need to add the Media Object to our Media Library.
This is done by a third and final `POST` API call to `https://{{domain}}.zendesk.com/api/v2/guide/media` with the following payload:
```json
{
"asset_upload_id": "01J73HEF2PYN50PB9ZXYA1EBPF",
"filename": "screeenshot2.png"
}
```
Note that the `asset_upload_id` is again taken from the first step. The `filename` can be the same as our file we uploaded, or we can give a custom name here. This name will appear in the media gallery.
# Let's use Zapier
By using a tool like Zapier we can leverage this new API to automate the flow I talked about earlier in this article.
Here's the Upload folder our Marketing team uses to add assets for our Help Center.

Now let's take this folder into Zapier and automate uploading these images into the Zendesk Media Gallery.

## Step 1: Getting new images

The first step we need in our flow is the *New File in Folder* action. Select the folder you want to monitor and make sure to exclude the deleted files.
## Step 2: Request Upload URL

In the second step we use a *Webhooks by Zapier* step as a `POST` type to get an *Upload URL*.
For the URL, use `https://{{domain}}.zendesk.com/api/v2/guide/medias/upload_url`
We can use the variables from the first step to populate the data flow:
- `content_type`: *1\. Mime Type* (e.g. image/png)
- `file_size`: *1\. File Size* (e.g.123456)
For the authentication part we can use `admin@domain.com/token` then a `|` and then a `zendesk_api_token`. E.g. `admin@domain.com/token|abc123def456`
## Step 3: Uploading the file

Here things become a bit tricky since there's a lot of variables to set. We once again use a *Webhooks by Zapier* steps but choose `PUT` as the type.
- For the URL we choose the *2\. Upload Url Url.*
- For the File, select *1\. File (exist but not shown)*
For the headers:
- `Content-Disposition`: attachment; filename="*2\. Upload Url As set Upload Id*.png"
- `Content-Type`: image/png
- `X-Amz-Server-Side-Encryption`: AES256
## Step 4: Add to the Media Library

And at last, the final step.
We can use a final *Webhooks by Zapier* step to `POST` to the Add to Media Library endpoint.
For the URL use `https://{{domain}}.zendesk.com/api/v2/guide/medias`
For the data part:
- `asset_upload_id` use *2.Upload Url Asset Upload Id.*
- `filename` use either a custom name or *1\. Original Filename*
For the authentication part we can use `admin@domain.com/token` then a `|` and then a `zendesk_api_token`. E.g. `admin@domain.com/token|abc123def456`
# Putting it all together
Our marketing team just added a new movie poster to the Google Drive folder.

The Zapier flow picks up the newly added file and starts its run:
1. It detects the file
2. It creates an upload url for the file by using its file type and size
3. It uploads the actual file
4. And adds it to the media library

# Conclusion
It's nice to see how Zendesk is expanding on their Knowledge Base Content Management. They made changes to the editor allowing for more types of text, they restructured the way we add articles to sections and manage permissions and added a few powerful API tools to rewrite, simplify or tone shift your articles.
This Media Library is another example on how the Help Center is moving more towards the likes of Wordpress or other strong CRM systems.
Are there things missing? Sure! I'd love a way to get access to the Media Library from within the main Admin Panel, maybe as a new button in the left navbar.
Tagging images, seeing in what articles an asset is used, or uploading multiple locales of the same images in an asset bundle are just a few of the things I'd love to see.
But aside from those, this new API allows for some cool workflows as the one I showed above.
### Zendesk Roundup for September 2024
URL: https://internalnote.com/roundup-2024-09/
Last updated: 2024-11-08T07:37:08.000Z
A friend at an Australian Zendesk Partner reminded me this week that not everyone is having a summer holiday right now, and that for them it's actually middle of winter as we speak.
So in an effort following [trends](https://internalnote.com/zendesk-cxtrends-2024/) and personalizing the content of this blog to the reader:
🔘 I hope you're having a wonderful winter
🔘 I hope you're having an amazing summer
(check whatever applies).
And now, this months' updates!
# 🏢 Company
## AI Summit
As you'll note further down this overview, August has been a quiet month when it comes to updates to AI Agents and Zendesk Advanced AI. Many people being on holiday might be one reason, but the upcoming AI Summit is possible a bigger indicator.
Last years' AI Keynote [gave us](https://internalnote.com/zendesk-ai-drop-keynote/) tons of amazing releases for Zendesk with generative replies in bots, bot persona, similar tickets, AI for voice being just a few of last years' headlines.
For this years' keynote I've got a few items on my wishlist.
First off I really hope we will see a **general release of** [**Copilot**](https://internalnote.com/preview-copilot/) for Advanced AI users. The feature has been in beta for over a year now, and it feels the right time to release it for customers. Chances are big most other EAPs will see a general release too: merge suggestions, suggested tickets and [quick replies](https://internalnote.com/preview-of-the-new/).
Secondly I hope we'll see **improvements on Zendesk AI** **models**. Specifically I hope to see the option to train or add custom intents to your instance without needing to wait for Zendesk to update their entire model. [Ultimate](https://internalnote.com/zendesk-acquires-ultimate/), Zendesk's newest acquisition has this capability out of the box, so bringing this capability to (Suite Enterprise) customers someday is a given.
Thirdly I'd love Zendesk to **clean up their product naming**. AI Agents, Advanced AI, AI Agent Copilot, they're not memorable or clear names and don't feel part of one suite of products.
AI Agent encompassing both Ultimate and the Zendesk Bot is just plain confusing, and I hate – hate – the fact that by calling your bot an AI Agent, we're forced to call people handling tickets *human* agents. Anything that requires you to add human in front of a word either means you want to make it more friendly than it is or hide something bad.
If it were me I'd call it Zendesk AI Bot and Zendesk AI Workspace. The former being all the end-user deflection and automation, the latter anything that assist agents. Or Zendesk AI Agent and Zendesk AI Copilot, where the former is there to take over humans and deflect tickets, and the later works together with people to make their job easier.
The keynote is live in New York on October 8th, with a digital version available one week later, you can join via the link below!
[AI Summitvirtualevents.zendeskai-summit.com](https://virtualevents.zendeskai-summit.com/series/ai-summit/landing%5Fpage?lang=en&ref=internalnote.com)
## Outcome based pricing
Zendesk has always been a seat based product where you buy a certain amount of licenses to give a specific set of agents full access to the product. With each license you get a certain amount of [storage](https://internalnote.com/storage-limits/) and a shared pool of light agents and API calls.
Outbound WhatsApp messages over Sunshine Conversations and your Zendesk Talk usage were traditionally the only usage based elements on your Zendesk bill.
In a classic scenario this model works well. If you get 10.000 tickets a week you might need 5 agents to handle that workload. If your company grows and you get 50.000 tickets a week you might need 25 agents to handle that workload since without automation, deflection and self service, that rise is linear. More tickets means more work means more agents and thus more agent seats bought.
However once ticket deflection comes into play, and especially a modern AI powered strategy, the above scenario isn't applicable anymore. Those 10.000 tickets might be 5000 complex tickets and 5000 questions that can be fully handled by the bot with Help Center articles, automations or other strategies.
[A hybrid approach to AI Agents powered by Zendesk and UltimateIn a previous article I explained the Road to Automation and how it can help with automating more your support interactions. This article takes a real scenario and keeps improving the customer experience by leveraging a hybrid approach combining flows, generative replies and API integrations.Internal NoteThomas Verschoren](https://internalnote.com/hybrid-approach/)
I wrote a full article on a good AI powered strategy.
When your ticket load rises from 10k to 50k tickets, that might mean your complex agent tickets go up a bit, but chances are bigger that the majority of that increase in tickets are coming from those automateble, frequently repeated questions. Instead of increasing your team from 5 to 25 agents, you might only need to add a few more people to handle that new workload, while your bots take the brunt of the work.
### Automated resolutions
[Zendesk on LinkedIn: 💸 Zendesk is introducing Outcome-Based Pricing for AI agents:…💸 Zendesk is introducing Outcome-Based Pricing for AI agents: https://zdsk.co/4e08QXP 🤝 Our customers will only incur costs for successful resolutions…LinkedInZendesk](https://www.linkedin.com/posts/zendesk%5Fzendesk-is-introducing-outcome-based-pricing-activity-7234968093863636993--NyO?utm%5Fsource=share&utm%5Fmedium=member%5Fios)
This is where automated resolution come in. Instead of increasing the license cost of your agents to account for the new bot capabilities and AI calculations and work Zendesk does, they decided to implement an outcome-based pricing strategy.
In its most simple form it means that any customer's issue that's resolved by AI Agents without help from human agents is counted and will be billed in top of your Zendesk license costs.
This encompasses:
- A conversation bot
- An autoreply for intelligent triage
- An article recommendation on email, web form, or Web Widget (Classic)
You can look at this change in two ways. In a negative, critical way this can be seen as a surcharge on top of an already big software expense. On the other hand, since a good self service strategy lowers your ticket load and makes Agents' lives easier, leveraging bots and automatic resolutions will prevent a linear increase of agents and tickets, and thus Zendesk licenses as your company grows.
[Learn about automated resolutions](https://support.zendesk.com/hc/en-us/articles/6931689272090?ref=internalnote.com)
## Sign up for Internal Note
A blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🎉 New Releases
## 🤖 AI Agents
### Messaging tag triggers

It's now possible to use Messaging triggers to add tags to conversations based on conditions. These tags can then be used for triggers, automations or adding conversations to [queues](https://internalnote.com/beyond-triggers-moving-to-queue-based-assignment-in-zendesk/).
## 👨🏻💻 Agent Workspace
### Rich messages in the Agent Workspace
> The Agent Workspace now supports the display of [form messages](https://support.zendesk.com/hc/en-us/articles/4408836323738-Understanding-answer-step-types?ref=internalnote.com#topic%5Fil3%5Fpmj%5Ftvb) and [compound messages](https://support.zendesk.com/hc/en-us/articles/4408836323738-Understanding-answer-step-types?ref=internalnote.com#topic%5Fmnf%5Fgwc%5Fk4b) options in the ticket interface. These are elements that customers interact with during their support journey, giving agents a more complete understanding of the customer experience.

Last month [saw](https://internalnote.com/roundup-2024-08/) the introduction of a new conversation view for Agent Workspace with rich rendering of Bot elements like buttons and carousels. This month we get another nice addition to the conversation view with a new way that forms are shown in the conversation.
### New supported channels for intelligent triage

Intelligent Triage, the engine that powers intent, language and sentiment tagging in Zendesk, now supports a myriad of new channels ranging from classic Facebook and Twitter posts to Sunshine Conversation channels like Apple Business chat and Messagebird. You can enable those new channels within the Admin Center, and newly added tickets should be triaged moving forward.
### Enhancements to skills in omnichannel routing

> Until now, omnichannel routing has treated all skills equally. Any skill on a ticket was treated as required until a [skills timeout](https://support.zendesk.com/hc/en-us/articles/4828787357210?ref=internalnote.com#topic%5Fag5%5Ftlr%5Fwbc) occurred. After that point, none of the skills remained in consideration when routing a ticket to an agent.
>
> Now, skills added by ticket triggers can be configured as either **required** or **optional**. Required skills are skills an agent absolutely must have, while optional skills are nice-to-have and subject to the skills timeout in your omnichannel routing configuration. When a skills timeout occurs and a ticket has both required and optional skills, only the optional skills are dropped from consideration. The required skills are preserved as routing criteria for the ticket, so omnichannel routing will continue to wait for an agent with all of the required skills to become available.
This is a welcome change to [Omnichannel routing](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/) in Zendesk. While we still want tickets to go to the best available agent, often when an agent that doesn't know everything about a product isn't available, it would be nice to be able to route – as a fallback – to another available agent in the system. By updating your existing skills as optional or required, you can now choose which one should be used upon initial routing, and which ones can be dropped if no matching agent is found.
## 🔎 Help Center
### Localized inline attachments


Inline article attachments on the Help Center [are now localized](https://support.zendesk.com/hc/en-us/articles/7761141483546-Help-Center-API-Localized-inline-attachments?ref=internalnote.com), linking them to a specific translation of an article rather than the original article itself.
The same image embedded in translations of an article will now create unique `article_attachment` records, each with its own unique ID and link.
```json
{
"article_attachments": [
{
"id": 21059268278418,
"article_id": 21059201642898,
"locale": "en-us",
"relative_path": "/hc/article_attachments/21059268278418",
},
{
"id": 21059234861202,
"article_id": 21059201642898,
"locale": "nl",
"relative_path": "/hc/article_attachments/21059234861202",
}
]
}
```
This makes it easier to update one image via API in a specific translation, without affecting the same images in other places.
### Media API
In extension to the above attachment changes, Zendesk has also been hard at work updating the overall experience managing media in Zendesk Guide. The new Media Library offers a central place to manage attachments for a while now, and this month saw the release of the new [Media API](https://support.zendesk.com/hc/en-us/articles/7821491779354-Announcing-Public-API-for-Media?ref=internalnote.com) allowing you to upload attachments from external resources directly into Zendesk.
This way your marketing team can create assets for your documentation and upload them, and your content managers can view these attachments in the Media Gallery and insert them into articles easily.
## 🧱 Open and Flexible Platform
### Sandbox replication
Users of Premier Sandboxes can now replicate support email addresses from their production environment to the sandbox when they create a new one.
- Internal support addresses (for example, [*help@yourbusiness.zendesk.com*](mailto:help@yourbusiness.zendesk.com)) are automatically replicated with the sandbox domain as the domain part.
- External support addresses (for example, [*help@yourbusiness.com*](mailto:help@yourbusiness.com)) are replicated but converted as internal addresses of the following format: [*help-at-yourbusiness-com@sandboxsubdomain.zendesk.com*](mailto:help-at-yourbusiness-com@sandboxsubdomain.zendesk.com).
### Solved ticket reassignment options

> Previously, when an agent was deleted, downgraded, or removed from a group, their solved tickets were automatically reassigned to the admin removing them or the longest active team member in the group.
>
> Now, admins have [the option to turn on solved ticket reassignment](https://support.zendesk.com/hc/en-us/articles/7807544385306-Announcing-solved-ticket-reassignment-options?ref=internalnote.com) in Admin Center. Solved ticket reassignment allows you to configure different behavior for how a departing agent’s solved tickets are reassigned.
Just one of those little tweaks that will make reporting correctly on data in a way that fits your company a lot easier.
### Additional condition for deletion schedules

Deletion schedules now allow for additional conditions on top of the *last updated* condition: Brand, Form, Group, Organization, Requester, Tags or Custom Fields.
This allows for a more granular approach allowing you to, for example, delete all finance tickets after 7 years, but delete support tickets after 4 years, and remove the ones categorized as *other* after a year. Perfect to keep your instance within its [allotted storage limits](https://internalnote.com/storage-limits/).
# ⚠ Major Changes.
A few important API and authentication deprecations coming up the next few months:
### Deprecation of the Zopim Chat REST API domain
> Zendesk is updating the domain for its Zopim Chat REST API. Beginning October 29, 2024, the current Zopim Chat REST API endpoint at [www.zopim.com/api/v2](http://www.zopim.com/api/v2?ref=internalnote.com) will be replaced with {subdomain}.[zendesk.com/api/v2/chat](http://zendesk.com/api/v2/chat?ref=internalnote.com).
[View the article](https://support.zendesk.com/hc/en-us/articles/7827476398362-Deprecating-the-Zopim-Chat-REST-API-domain?ref=internalnote.com)
### Deprecation of the Events Connector for Amazon EventBridge
> Beginning August 12, 2024, you won't be able to set up a new Zendesk events connection to Amazon EventBridge. Furthermore, on the deprecation and removal date, all Zendesk event connections will stop sending events to your Amazon EventBridge instance.
[View the article](https://support.zendesk.com/hc/en-us/articles/7755441158426-Announcing-the-deprecation-of-the-Events-Connector-for-Amazon-EventBridge?ref=internalnote.com)
### **End-of-life of legacy OAuth 2.0 grant type**
> In alignment with OAuth 2.0 best practices, Zendesk will stop accepting Implicit and Password grants for access tokens starting February 17, 2025\. Customers are advised to switch to Authorization Code Flow or API tokens as soon as possible due to the insecurity of the older grant types.
[View the article](https://support.zendesk.com/hc/en-us/articles/7868169712794-Announcing-the-end-of-life-of-legacy-OAuth-2-0-grant-types?ref=internalnote.com)
# 💡Insights
## Interview with Matthias Goehler
[Zendesk: How AI Chatbots can Transform Customer ServiceWe speak with Matthias Goehler, Zendesk’s EMEA CTO, about how AI-powered virtual assistants are providing fast, personalised service at scaleBizclik Media LtdMarcus Law](https://aimagazine.com/articles/zendesk-how-ai-chatbots-can-transform-customer-service?ref=internalnote.com)
Interesting interview on AI Agents with Matthias Koehler, Zendesk's European CTO.
> We should always start by thinking about the customer we’re serving, their requirements and demands,” he says. “When we reach out to a customer service team, we probably have a question, problem, or complaint – and we want an answer or help. Fundamentally, we want it fast, and that has never changed. We want the answer on the first call; we hate repeating ourselves or going through endless processes with handovers.
## Deflecting Zendesk Spam
Dominic does with video what I try to do with text: explaining Zendesk concept in a simple way without shying away from complex topics.
I really like his recent video on Zendesk spam, and really appreciate the shoutout to my [original article](https://internalnote.com/automatically-deflect-zendesk-spam-tickets-via-triggers-and-web-hooks/) showing the concept. Go watch his videos and subscribe to his channel!
# 📝 Articles this month
[Sending out automated pending reminders via Zendesk MessagingThis article will show you how you can send out automated reminders over Messaging to your customers when your agents are awaiting a response.Internal NoteThomas Verschoren](https://internalnote.com/bump-bump-solve-for-messaging/)
[No more no-replyHave the guts to remove your no-reply. It blocks your customers and creates a terrible experience. Replace it with self service, automations and routing.Internal NoteThomas Verschoren](https://internalnote.com/no-noreply/)
[Expanded multi-select field support for users, organizations and Custom objects in ZendeskMulti-select fields are now available for users, organizations and custom objects in Zendesk. This makes setting up user profiles and triggers way easier, while giving also a better overview of data when looking at those objects in the Agent WorkspaceInternal NoteThomas Verschoren](https://internalnote.com/multi-select-support-for-users-organizations-and-custom-objects-in-zendesk-2/)
[Zendesk Roundup for August 2024Subscribe to a hand-picked round-up of the best Zendesk links every month. Curated by Thomas Verschoren and published every month. Free.Internal NoteThomas Verschoren](https://internalnote.com/roundup-2024-08/)
# And Finally...
Good to know:
[Can I map the sender email domain of the automated notifications from Guide?](https://support.zendesk.com/hc/en-us/articles/7581210819226-Can-I-map-the-sender-email-domain-of-the-automated-notifications-from-Guide?ref=internalnote.com)
> The emails that notify customers of Guide or Gather updates aren't customizable. They use a standard format and are always sent using the address noreply@{subdomain}.zendesk.com.
## Sign up for Internal Note
A blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Sending out automated pending reminders via Zendesk Messaging
URL: https://internalnote.com/bump-bump-solve-for-messaging/
Last updated: 2025-09-08T06:41:02.000Z
Last year I wrote an article about sending messages to customers over Messaging (WhatsApp, Web Widget,...) via the Sunshine Conversations API. This flow not only allows you to [bypass the 24 hour rule for WhatsApp](https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk/) but also makes it possible to send messages to customers via triggers and automations.
[➕ Sending Automated Messages via WhatsApp with Sunshine Conversations and ZendeskLearn how to leverage the Sunshine Conversations API included in Zendesk Suite to automatically send out messages to your customers.Internal NoteThomas Verschoren](https://internalnote.com/sunshine-conversation-automations/#messages-via-webhooks)
A while back I had a reader reach out who wanted to convert my *Pending* automations for custom statuses ([link](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/)) into a flow compatible for messaging.
So, this is exactly what this article will be about. But first, some context.
# What are *Pending* automations
When an agent replies to a customer ticket, they can use the *Pending* status when submitting the ticket when they need a response from the customer before they can move forward.
This could be a confirmation that the issue is resolved, a request for more information, or just a reply for some clarification on the issue.
Putting the ticket on *Pending* has a few benefits:
- It's removed from the [Open Tickets](https://internalnote.com/my-approach-to-zendesk-views/) view.
- Your [SLAs](https://internalnote.com/sla-policies/) are put on pause.
- You can [automate](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/) these tickets and send out an email reminder to the customer that you're still waiting for their response.
Those reminders make sure your agents get the responses they need, and if no response is given, we can either *reopen* the ticket so the agent can do one final attempt to reach the customer, or an automation or the agent can manually or silently *solve* the ticket to remove it from our active tickets altogether.

This works great for email based tickets like those submitted via email, web forms or API. But when it comes to Messaging tickets via the Web Widget or WhatsApp we run into a few issues.
For most customers we do not have an email address on file, so our automation, which can fire on a messaging ticket, will not work and will not send out an email.
Messaging also has different rules. A Web Widget conversation times out after [72 hours](https://support.zendesk.com/hc/en-us/articles/7463958274586-Why-do-messaging-conversations-contain-old-and-previous-messages?ref=internalnote.com) and WhatsApp is even stricter with a 24 hour limit.
So to resolve this we can build our automations a bit different, and leverage the Sunshine Conversations API and a Cloudflare Worker to set this up.
# Setup
## Worker
As explained in the [original article](https://internalnote.com/sunshine-conversation-automations/#messages-via-webhooks), the Sunshine Conversations API requires some identifiers that are not natively accessible in Zendesk triggers and automations. We need a `conversation id` and a `user identity` . We can derive both from the `requester_id` of our ticket requester, but even so, we can't connect to the Sunshine Conversations API directly from our triggers.
For this reason we need to deploy a Cloudflare Worker (or similar cloud script on make.com, zapier, Google Cloud or similar). You can find the worker in the GitHub repository below, or you can deploy it to Cloudflare **for free** via the Deploy button below.
[GitHub - verschoren/outbound\_messagingContribute to verschoren/outbound\_messaging development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/outbound%5Fmessaging?ref=internalnote.com)
[](https://deploy.workers.cloudflare.com/?url=https://github.com/verschoren/outbound%5Fmessaging&ref=internalnote.com)
## Webhook
Secondly we need a webhook that calls our worker (or other cloud function). Assuming you deployed the Cloudflare Worker, your webhook will be hosted on `https://outbound-messages.yourdomain.workers.dev`

Example of a configured webhook
## Automation
Assuming we want to send out a reminder to our customer after eight hours, we can setup an automation with the following conditions:

💡
Note: I made use of a custom ticket status in this automation. **Pending - Awaiting Reply*. Once the automation runs it will change the custom status to another status so the automation runs only once!
Once the conditions are setup, we can configure our actions:

The payload.
```json
{
"requester":"{{ticket.requester.id}}",
"message":"We marked this conversation as pending and are awaiting your answer"
}
```
# The Result


A customer contacts our customer care team and the agent needs more information

The customer does not respond timely, so our automation fires, and the customer replies

Our agent gets a reply from the customer
Or via WhatsApp:

# Conclusion
I really hope that someday the Zendesk triggers and automations can access the Sunshine Conversations API directly without resorting to an external script to grab the right variables.
Or, since we're hoping, a way have a *Send message* action in our triggers that can directly send a message to Messaging channels would be even nicer.
Either way, for now the above flow will allow you to send out automated reminders over Messaging to your customers!
### No more no-reply
URL: https://internalnote.com/no-noreply/
Last updated: 2024-11-03T10:49:05.000Z
A few weeks ago I went to an event from Cloudflare in Amsterdam where they showcased their newest product features combined with a few presentations from their team and customers. After the event I got an email from them asking me to fill in a questionnaire about the event. That questionnaire contained an error which prevented me from completing it.
So I went back to the email, clicked the reply button to let them know something was wrong. Only to be stopped midway my first sentence since the sender of the feedback email was ``.
> When I phone you night and day
> I get no reply, no reply
> I keep writing those letters and send them away
> To get no reply, no reply
Similarly a few years ago I had a customer whose head of CX showed us a 99% first time resolution (FTR) metric for their team. Which is an astounding number (the industry average lies [around 70%](https://www.google.com/url?sa=t&source=web&rct=j&opi=89978449&url=https://www.zendesk.com/blog/first-contact-resolution-friend-foe-frenemy/%23:~:text%3DA%2520first%2520contact%2520resolution%2520rate,strive%2520to%2520hit%2520that%2520number.&ved=2ahUKEwiMo5jKkNGGAxVJR6QEHRqiD6YQFnoECBMQAw&usg=AOvVaw0ms335XulmW1DMdEXXz75u)). When we dove into the numbers and reporting we discovered two things: they replied to customers from a noreply@company.com email, and that inbox was not forwarded or read by anyone in the company. When we reached out to the IT team to check the logs for that mailbox we quickly discovered the inbox contained thousands of unread emails and the average FTR was around 45%.
A quick search through my own inbox for the last month gave me \~200 noreply emails ranging from marketing emails, order confirmations, invoices and a range of other business and online sales related emails from a myriad of companies.
[](https://www.threads.net/@tomcashman1/post/C8ZE%5Fg6SQ7c/?ref=internalnote.com)
Source: Threads
And this makes me wonder..
> Why would you send email to a customer from a noreply email address?
## Assumption: we don't expect customers to reply to this
One motivation I often hear is: "this is a transactional email, we don't expect customers to reply to this".
In the case of an order confirmation, payment receipt, renewal alert or other transactions you often see the email coming from a noreply address. But what happens if there is a mistake in the email? Imagine the customer booked for the wrong date. Or the customer doesn't want to renew their service. Or they get an order receipt and see it has the wrong ship-to address.

A noreply email smells like arrogance to me. It separates the company from a customer and makes the customer think the company isn't interested in your feedback or comments.
Why would you want to prevent the customer from replying to the email to fix the issue? By using a noreply email you force the customer to go search for your support page, contact email or other channel and create a brand new ticket, thereby preventing your agents from having all the context they need to solve the issue.

The original email contains all the information and context required to solve the ticket. So instead of sending out these emails from noreply@, send it from an email address managed by the team that can resolve complains and questions about the email. If customers have questions they'll reach out to you anyhow.
💡
Sending out transaction email from a noreply means that agents will lose context when a customer reaches out about that transaction.
## Assumption: We only sent out the email. It's not our job to handle the replies.
*Or on other words: the other department send out these emails, why should be get the replies and customer feedback for those emails?*
For me, any company who emails with a noreply email is a company whose departments are silo'd.
If marketing sends out a "Summer Promotion" email from their noreply@company.com email, instead of emailing with a normal reply-to address, that means that any feedback from customers – I just bought X, can I use the promo, can I apply the promo to Y,...– will not have a team to handle those questions.

In parallel, if you allow replies to those emails, you get measurable feedback. You can collect customer replies to these emails, you can see what went wrong, or even amend your FAQ to make things clear for the next customer.

The irony of asking for feedback while not allowing customers to reply to that email
💡
Sending out email without reflecting where replies to the email should go to means there is no owner of this process or project.
## Assumption: if we put up a barrier the problem will go away.
Customers who have an issue with their order will reach out to support to get it fixed. Sending out the confirmation email from noreply will not make that problem go away. It will just put up a barrier between the customer who has an issue, and the team (your team) that can resolve that issue.
> There's a variation of this noreply flow: the dreadful "this mailbox is not monitored email".

The above is even worse. Sometimes you get an email from `` but when you reply you get an automated response to let you know this email address is not used. You know someone took the time to setup that deflection on purpose. The same effort could be done to forward the email to the team that handles my inquiry, but someone in the company decided that no, deflection is the best approach here.
💡
Customers will always have questions. Instead of putting up barriers you should offer clear self service options to handle inquiries without channel switching.
# A better way
I think the best approach is the one where every email you send to your customers allows your customers to reply to.
This does not mean every email should land in the inbox of your team. We can leverage features like auto reply, intelligent triage or even links to related articles right in the original email to make sure customers can try to resolve their issue themselves first. Any reply that can't get resolved should land in the inbox of the *right* team.
Take a look at this example from, coincidentally, my favorite Belgian beer.
- The reply-to is an email that goes to customer care
- The email has all the references like order number and shipping number right in the email body
- There's a link to my account to get status update or make changes.

Also, Duvel, if you're reading this: I'd love to setup Zendesk for your team! 😇
So what happens if I have an issue? I'd go to my account first and try to modify the order. If that doesn't work I can just *reply* to the email and get support from an agent. You can't get it easier than that!
> As a company, you should have the guts to disable your noreply emails and make sure every email arrives somewhere. Self Service and ticket deflection are the best way to handle customer feedback. But trying to prevent it by using a noreply address is just bad practice.
## Sign up for Internal Note
The blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Expanded multi-select field support for users, organizations and Custom objects in Zendesk
URL: https://internalnote.com/multi-select-support-for-users-organizations-and-custom-objects-in-zendesk-2/
Last updated: 2024-11-03T10:49:26.000Z
Zendesk tickets have always been able to store additional data in ticket fields. You've got drop-down, text fields, checkboxes and myriad of other options to store order numbers, preferences, or other related information.
Similarly, you can expand user profiles and organizations in Zendesk with similar user and organization fields to store things like user types, account numbers, membership types or other relevant data to enrich your profiles.
And Custom objects allow you to create completely custom things in Zendesk to store data specific to your organization like products, contracts or orders. These records too can be enriched with custom fields to store data like colors, types or IDs.
Even though all these fields allow you to enrich Zendesk objects, not all objects are equal. Up till now for example you could only use Multi-select fields on ticket fields for example.
# Multi-select fields
There's a few big types of custom fields:
- **Input fields** that allow for *free* text input.
Text, integer, decimal, regex or textfield, date
- **Checkboxes** that are a binary on/off
- **List of options** that allow you to select from a preset list of options.
Drop-down, Multi-select or Lookup fields

Multi-select has now been made available across all object types in Zendesk. So let's dive into some use cases that are now possible.
## For Users
User fields are often used to categorize end-users.
This can be used:
- to set SLAs (e.g. VIP users get higher priority)
- in triggers (e.g. partners who often email you don't get a confirmation email upon ticket creation)
- to filter Lookup fields (e.g. the Lookup field "Supplier" only shows users with the option "supplier" selected)
Since users often can have multiple roles, adding user roles to a dropdown wasn't ideal. The only possible solution was to create a checkbox per user type to user profiles.

With the availability of the new Multi-select field for end-users, these checkbox can now be combined in one Multi-select dropdown. This has a few benefits: of you previously had checkboxes to note down user types, but also had checkboxes for other use cases like "don't send CSAT email" or "VIP" or "Membership type", it's now a lot cleared which options pertain to your user type since they're all combined in one dropdown.

💡
If your checkboxes contain a tag, an easy way to migrate to Multi-select fields can be handled by noting down the checkbox tags. You then delete the checkboxes, and create a Multi-select dropdown with those same tags for your options. The new Multi-select dropdown will automatically select the right options based on the tags on your user profiles.
Additionally, since we now use a Multi-select option, our [Essential Card](https://internalnote.com/essentials-card/) is now a lot nicer to look at too:


## For organizations
A similar scenario is now also possible for Organizations. Where we previously would have used drop-down or checkboxes to note down the type of organization we're working with, we can now use a single Multi-select dropdown to note down its type or types.


And similarly, if we want to create a trigger that acts upon the organization type, we can now find all possible types in one dropdown action in the trigger conditions. This makes it a lot easier to select one or more options via the **ALL** or **ANY** conditions and removes the need of looking through a long list of organization fields in order to select some or all available options.
## For Custom objects
In a previous article I build a `Movie` object to store information about sold movies to later use in Placeholders.
One *issue* I had when creating the movie object is that each movie could only have a single genre associated to the movie. But sometimes movies (or other objects) can have multiple options associated with it.
Superman can be both a bird and a plane. A dress can both be black and blue, and Bulbasaur is both Grass and Poison type.
With the expansion of Multi-select compatibility across all objects in Zendesk, we can now add those fields to Custom objects too.

When we create our multi-select field and update our records, we can now create Movie records that contain multiple genres, and use these options in placeholders, object triggers or just as additional context for our agents.

Dropdown on the left, Multi-select on the right.
# What's still missing
Although these new capabilities are pretty awesome, there's still a few things missing in Zendesk when it comes to multi-select fields.
## Support in the Messaging widget
When creating [custom answers](https://internalnote.com/flow-builder-ask-for-details/) for the Zendesk Bot, the *Ask for Details* step only supports regular dropdown fields, but there's no support for multi-select fields like we have in regular Zendesk forms.
Speaking of feature parity, only text fields and drop-downs are currently supported for Messaging, with not only multi-select but also checkboxes, numeric fields, regex fields and all other types being incompatible with your bot flows.
## Support for importing multi-selects
When I migrated my movies from single genres to multiple genres I tried being smart about it.
I still had my import file with my movies, so I updated that file to allow for multiple genres by comma separating the tags for those genres. Sadly, when I imported (and updated) the movies via the Data Imported I got errors for all of them. It seems importing multi-select fields is not yet possible.

## Multi-select Lookup fields
The [announcement](https://support.zendesk.com/hc/en-us/articles/7537006572058-Announcing-support-for-multi-select-custom-fields-for-users-organizations-and-custom-objects?ref=internalnote.com) of the expanded Multi-select support contained the following paragraph:
> *This enhancement provides greater flexibility and the opportunity to collect more detailed data categorization, making it easier to map your customer-relationship management data in Zendesk. (...)*
> *For example, you can now use multi-select custom fields to track information such as:*
> *\- Products a customer has purchased*
This, briefly, got my hopes up, cause I thought it meant we could link multiple custom objects to tickets, users or each other. But sadly, Lookup Fields are still a 1:1 relationship. So if you want to link multiple products to a single user, it's currently only possible if you have a dropdown with products. But you can't have a Lookup field and select multiple linked Custom Objects.
## Sign up for Internal Note
The blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
##
### Zendesk Roundup for August 2024
URL: https://internalnote.com/roundup-2024-08/
Last updated: 2024-11-03T10:49:38.000Z
> Just when I thought I was out, they pull me back in.
Summers are supposed to be quiet months. Time for travel, family, relaxing. But not so if you write about Zendesk it seems. The amount of new releases this month was staggering, with major changes in bot translations, custom object placeholders and conversation views in Agent Workspace.
This month I also had the chance to play around with Zendesk's new [AI Co-pilot for Agents](https://internalnote.com/preview-copilot/). You can read my full review in the linked article but if you want a concise conclusion this one will do:
> The efficiency gains enabled by Co-pilot are immediately visible. For every procedure defined for Co-pilot, our agent only needs to verify the proposed actions are correct, and they can submit or approve the next steps for the customer.
Next week I'll be on holiday in Italy, but no worries, I've got a few fun articles all done and scheduled to be send out to you!
Let's dive into this month's releases.
# 🏢 Company
### Quantifiable impact of Zendesk AI
Zendesk's been quite active on their own blogs this month prompting Zendesk AI.
They published [an independent review](https://www.zendesk.co.uk/blog/the-quantifiable-impact-of-zendesk-ai/?ref=internalnote.com) of Zendesk AI and how it impacts organizations. It's a short 4 page read, so worth your time, but the key takeaways of the research are nothing new but it's nice to see them summed up in one document:
- **Efficiency Gains**: Zendesk AI significantly improves efficiency by automating routine tasks and streamlining customer service operations. This leads to faster resolution times and reduced workload for support agents.
- **Customer Satisfaction**: higher CSAT by providing quicker and more accurate responses. AI-driven support ensures that customers receive timely assistance, which improves overall customer experience.
- **Cost Savings**: Zendesk AI creates a substantial cost savings for companies. Automation reduces the need for a large support staff, cutting down on labor costs while maintaining high service quality.
### How AI redefines the role of customer service agents
In this [newsroom article](https://www.zendesk.com/newsroom/articles/zendesk-head-of-ai-and-customers-weigh-in-on-how-ai-redefines-the-role-of-customer-service-agents/?ref=internalnote.com) Cristina Fonseca, Head of AI at Zendesk, explains how AI will impact Zendesk AI and evolve in the future. The article also contains some insights and quotes from other pundits of the Zendesk ecosystem and contains some nice nuggets I'll certainly use as the basis for future articles.
> “As AI continues to evolve, we anticipate a significant shift towards fully automated resolutions within the customer experience sphere. It’s a future where AI doesn’t just assist, but leads the charge in providing exceptional experiences. The latest breakthroughs in AI and large language models (LLMs) are paving the way for a fluid integration of bots and human agents. AI will influence at least ten times more interactions than in 2023, propelling the industry towards a future dominated by fully digital agents.”
# 🎉 New Releases
## 🤖 AI Agents
### Updates to the Zendesk AI Models
Zendesk works with a pre-trained AI Model per industry for all of its customers. This means that, out of the box, you get a working classifier model that assigns intents to tickets without the neat of training on your tickets. This gives you the benefit of immediate results when you enable the feature.
The downside of this approach is that if an intent is missing, you're stuck. You can't teach the system that they should categorize tickets related to a specific topic.
To solve this issue, Zendesk allows customers to request new intents. Customers can fill in a request form with an intent description and sample tickets. Once approved (or if approved..) the intent gets added **to all Zendesk customers**' setups.


This month saw the first release of about a dozen new intents across the retail, software, insurance, financial, employee experience, travel, and entertainment and gaming industries.
Additionally, next to the industry specific models available, Zendesk is also adding a general Zendesk Intent Model available. This model contains *all* industry-specific intents and customers who get this model enabled can pick and choose from the list of intents and enable the once they need.
I still hope for the availability of fully custom models for Zendesk Intelligent triage, that doesn't require Zendesk to manually accept and approve intents for all of their customers. Ultimate, Zendesk's newest AI Agent, has this feature for their Chatbot and Ticketing automation, so migrating this capability to Zendesk's intelligent triage is something I can't wait to happen.
### Custom translated messages in the Zendesk Bot
The Zendesk Bot used to have only automatically translated messages for when you enabled multiple languages in your bot. This gave the convenience of enabling a new language with just a checkbox, with the downside of not being able to control the translation. If the translation went bad and nuance or meaning went lost in translation, you couldn't really fix it.
This has now been fixed with the ability to add custom translations to your Zendesk Bot's reactions and answers. You can read all about it in last weeks' article:
[Managing custom translations in the Zendesk BotThe new custom translations for the Zendesk Bot make it possible to combine automatic translations for all your flows and answers, while making sure that specific replies or words do not lose their context in a bad translations.Internal NoteThomas Verschoren](https://internalnote.com/managing-custom-translations-in-the-zendesk-bot/)
Speaking of translations, the automatic translations have been [expanded](https://support.zendesk.com/hc/en-us/articles/7728852470170-Announcing-additional-languages-supported-with-Zendesk-AI-agents?ref=internalnote.com) with eight new languages: Chinese (Traditional), Czech, Danish, Indonesian, Norwegian, Romanian, Swedish.
### Better handling of handover to email
Continuous conversations is one of those awesome hidden features that make Zendesk Messaging a lot more efficient. Since Messaging is asynchronous by design, and it's not a live chat in the classic sense, it allows customers to interact with your AI Agent or leave a message even when agents aren't available yet. Or customers might leave mid conversation, and close their browser (or lock their phone).
With Continuous conversations Zendesk will send out your agents' last messages over email to the customer, allowing customers to continue the conversation via email, or switch back to the widget at their convenience. This feature used to auto-trigger after 10 minutes of inactivity, but will now fire once a conversations becomes inactive, which could be less than that time. It's a small change, but seems more logical than a set timeframe?

## 👨🏻💻 Agent Workspace
### Zendesk AI new uses ChatGPT-4o
Zendesk [upgraded](https://support.zendesk.com/hc/en-us/articles/7711631447450-Announcing-enhanced-generative-AI-features-in-Agent-Workspace-with-ChatGPT-4o?ref=internalnote.com) the generate AI features in Agent Workspace from ChatGPT-3.5 Turbo to the newly released ChatGPT-4o.
> This update will offer the following benefits:
> \- improved response accuracy.
> \- Reduction of language errors in expansions and tone changes, as well as accuracy issues with ticket summarization.
> \- Mitigation of errors related to max ticket length when summary is used, due to ChatGPT-4o's larger context window.
> \- Enhanced feature performance, ensuring efficient agent operations.
### Enhancements to the omnichannel routing skills timeout
If you've got Omnichannel Routing enabled in Zendesk and choose to route tickets based on skills, tickets will be assigned to available agents if their skills match.
If no available agents have that skill, the ticket is added to a queue waiting for someone to become available. Since this waiting can be indefinitely, you've got the option to enable a timeout which drops the skills requirement and assigns tickets to any available agent that matches the group, queue or other secondary requirements.

Until now, agents would only be eligible for assignment after timeout if they did something in Zendesk, like changing their status or updating a ticket. This has now been changed and agents are added to the list of potential assignees all the time if their availability and capacity allows for it. This means more agents will be available faster, leading in, hopefully, faster assignment and a faster FTR.
[An introduction to Omnichannel Routing in ZendeskThis article will give you an overview of Zendesk’s Omnichannel Routing, Agent Availability and the brand new Queues features.Internal NoteThomas Verschoren](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/)
### New dashboard for Queues
For customers using [queues](https://internalnote.com/beyond-triggers-moving-to-queue-based-assignment-in-zendesk/) in Zendesk, there's now a new Dashboard in Explore that gives live insights in the amount of tickets and average time in queue for tickets. It's a basic dashboard that only shows a few datapoints, not a full dashboard that allows you to dive into the queues themselves and inspect tickets or act upon them.
[Announcing new prebuilt live Explore dashboard for omnichannel routing queuesAnnounced on Rollout on July 8, 2023 July 8, 2023 The Explore product team is excited to announce a new addition to our collection of prebuilt dashboards: Omnichannel routing queues - live mon…Zendesk help](https://support.zendesk.com/hc/en-us/articles/7569028703258-Announcing-new-prebuilt-live-Explore-dashboard-for-omnichannel-routing-queues?ref=internalnote.com)
### Generative AI for Voice available
I [wrote about this feature](https://internalnote.com/preview-of-the-new-generative-ai-for-voice/) a while back, but Zendesk made their Generative AI for Voice available to all Advanced AI customers this month. The feature enables three new features:
- **Call transcription**: Automatically convert call recordings into text and save it to the ticket conversation log for added context after a call ends.
- **Call summarization**: A concise, AI-generated summary of the call transcript can be automatically added to the ticket conversation log after the call has ended.
- **Voice QA:** For customers that have Zendesk QA (Klaus) this release enables the tool to generate reports based on phone conversations similar to how it already works for email or messaging.

### Custom layouts and Essentials cards in Professional plans
Custom Layouts and Essentials cards used to be available for Enterprise users only, but these features are now also available to Suite Professional users.
[Preview of the new Essentials Card in ZendeskA quick overview of the new Essentials Card for Zendesk user profiles.Internal NoteThomas Verschoren](https://internalnote.com/essentials-card/)
### New conversation view
This month saw the rollout of the new conversation view for all customers. This new layout shows a more chat-inspired layout to customer conversations collapsing multiple short replies into a single bubble, and having an overall rounded softer look.
Additionally, this new layout also supports [carousel](https://support.zendesk.com/hc/en-us/articles/4408836323738-Understanding-answer-step-types?ref=internalnote.com#topic%5Fil3%5Fpmj%5Ftvb) and [quick reply](https://support.zendesk.com/hc/en-us/articles/4408836323738-Understanding-answer-step-types?ref=internalnote.com#topic%5Fmnf%5Fgwc%5Fk4b) messaging options, rendering those flow builder elements in a similar fashion as they would appear in the web widget. This feature is enabled by default, and requires no admin actions.

## **🔎 Help Center**
### Help Center Themes version 4
Every Zendesk customer gets the Copenhagen help center theme as part of their Guide setup. Most customers quickly move towards a [custom theme](https://www.zendesk.com/marketplace/themes/?ref=internalnote.com) from the Zendesk Marketplace, or even forgo these options all together and build their own with a [fully custom template](https://developer.zendesk.com/documentation/marketplace/building-a-marketplace-theme/build-and-test-your-theme/?ref=internalnote.com).
💡
I'm working on an article on this topic.
Whichever option you choose, Zendesk now [made a version 4](https://support.zendesk.com/hc/en-us/articles/7538459259162-Announcing-Help-Center-accessibility-update-and-templating-API-v4?ref=internalnote.com) available with some major changes:
- **Accessibility:** more components of the themes are now powered by the same components as Zendesk Agent Workspace and are build in their Garden design system, based on react. This gives better accessibility support (think voice over, alt text, navigation, labels, colors) in this themes that support it.
- **Redesigned forms:** The request forms are now styled in the Zendesk Garden style and are client side rendered, making a lot more customization options than before available.
- **JSON serialization helper** that makes it easier to use server-side rendered data from the templating api in the frontend with JavaScript.
- **Security**: by default the credit card field in the request form will only accept the last four digits of the credit card to ensure PCI compliance of the request form when using the credit card field.


Before (left) and after (right)
### New article settings layout
Continuing the work on the Guide editor these last few months, July saw a consolidation of all article settings in a new sidebar with two sections. One contains all edit permissions, the other contains placement and visibly of the articles.

I do like this renewed focus on the article editor. These new changes allow you to collapse all settings into the sidebar and leaving only the article editor available. this makes for a cleaner and more focused writing experience.
It's still not as easy as e.g. Ghost, which I use for my blog, with its `/actions` but compared to the editor of old, this new Guide experience is nice!
## 🧱 Open and Flexible Platform
### Multi-select custom fields for users, organizations, and custom objects
Previously, the multi-select custom field type was only supported for tickets. With this new update the multi-select field can be used for custom fields on users, organizations, and custom objects.
### Placeholders for custom objects
Speaking of custom objects, placeholder support has been expanded to support Custom Objects and fields stored in custom objects.
You can read all about it here:
[Custom Object Placeholders and Object Triggers in ZendeskThis article explores the new capabilities for Custom Objects with the new support for object triggers and dynamic placeholders.Internal NoteThomas Verschoren](https://internalnote.com/custom-object-placeholders/)
### Filtered Search for Custom Objects
In my [Custom Objects](https://internalnote.com/custom-objects-part-1-introduction/) series I *complained* about the lack of full search capabilities for Custom Objects. The standard search returns any object that contains your search query in any of its objects. So searching for `Scott` in a movie data base would not only result in *Scott Pilgrim vs. The World*, but would also return *Gladiator* and *Top Gun*, since these are directed by Ridley *Scott* and Tony *Scott* respectively, and search also parses the text of any custom field.
The new [filtered search endpoint](https://developer.zendesk.com/api-reference/custom-data/custom-objects/custom%5Fobject%5Frecords/?ref=internalnote.com#filtered-search-of-custom-object-records) allows for custom queries that narrow the search to a specific field and object.
For example:
```JSON
//POST https://{{domain}}.zendesk.com/api/v2/custom_objects/pokemon/records/search
{
"filter": {
"custom_object_fields.type": { "$eq": "fire" }
}
}
```
returns an array of Pokémon whose type is fire:
```JSON
{
"custom_object_records": [
{
"id": "01HD3EAPK9FDA3RM3RPCEXF8B8",
"name": "Quilava",
"external_id": "156"
},
{
"id": "01HD0W1D6RJCQPSKGSXJ4HRME7",
"name": "Vulpix",
"external_id": "37"
},
// .... //
],
"meta": {
"has_more": false,
"after_cursor": null,
"before_cursor": null
},
"links": {
"prev": null,
"next": null
},
"count": 20
}
```
### New agent permissions to manage other team members
A new option [has been added](https://support.zendesk.com/hc/en-us/articles/7536595614746-Announcing-new-agent-permissions-to-manage-other-team-members?ref=internalnote.com) to the custom roles options:
> On Enterprise and Enterprise Plus plans, agents in custom roles can now be granted permission to view and manage other team members with the following options: *Not Allowed*, *View only*, and *Create, assign roles, edit, and delete*.
>
> These new options enable agents to assign roles to other agents but not themselves. Agents with these permissions also can't manage assignment to admin roles. These permissions are separate from permissions for creating and managing custom roles.
>
> Additionally, agents can also be granted permission to search and view lists of end users, separately from their permission to access individual end user profiles. With this new permission, agents will be able to search for agents by name, email address, phone number, or organization.
### Enablement of all Sunshine Conversations channels in the channel name trigger
> We are enabling all channel types in the Channel Name trigger. Previously, only messaging channels were enabled, but now, we are expanding this functionality to include all Sunco channels. This means that any channel type managed through the Sunco dashboard or API, such as Twilio, will be available in the Channel Name trigger dimension.
### New authentication configuration options
You've always been able to choose between Zendesk authentication, and External authentication when setting up agent or end-user authentication. Weirdly, if you wanted to only offer social logins but didn't want end-users to login with a Zendesk username/password you couldn't do that.
This has now been updated: you can setup Zendesk authentication, social logins (X, Google, Microsoft, and Facebook) and external SSO (SAML, JWT, ..) as independent options now.
### Announcing the ability to merge organizations
This used to be available as an EAP, was then pulled due to security risks, and is now available for everyone: you can now merge one organization into another.
When organizations are merged, all users, tickets and domains are merged into one organization.

There's also a [public API](https://developer.zendesk.com/api-reference/ticketing/organizations/organizations/?ref=internalnote.com#merge-organization-with-another-organization) available for merging organizations. After a successful merge you can check the action via a new getOrganizationMerge API:
```
// GET /api/v2/organization_merges/{organization_merge_id}
{
"organization_merges": [
{
"id": "THX1138QWERTYUIOP",
"loser_id": 123,
"status": "complete",
"winner_id": 456
}
]
}
```
## 📊 Reporting and Insights
### Advanced SLA configuration settings
This is a totally unexpected but awesome upgrade to SLAs!
Previously a first reply time would only exist if there wasn't a first public comment to a customer. Now, with the new advance options we can start or ignore the first reply time SLA even when tickets are created with internal notes, or created by light agents.
Similarly, we can resolve our first time reply SLA whenever an agent replies, public or internal, or any combination thereof.
These changes are optional, and the defaults you get are the behavior [we're used to](https://internalnote.com/sla-policies/), but you can dive into the settings of any SLA and make changes we're needed:

## Sign up for Internal Note
A blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 💡Insights
### What exactly is an AI Agent
[What exactly is an AI agent? | TechCrunchRegardless of how they’re defined, the agents are for helping complete tasks in an automated way with as little human interaction as possible.TechCrunchRon Miller](https://techcrunch.com/2024/07/13/what-exactly-is-an-ai-agent/?utm%5Fsource=dlvr.it&utm%5Fmedium=threads&guccounter=1&guce%5Freferrer=aHR0cHM6Ly93d3cudGhyZWFkcy5uZXQv&guce%5Freferrer%5Fsig=AQAAAMuGAJMmWRuV5Bs171DEmvQaQGk%5F%5Fs2PBJsn4F63h3Cr5oA0NUHENrWE63GbbZ8jNyHs1jARd0kVgefC8t2%5F1dhLFuv6H87Sn32en3Cz391hi7z9ZNcyMy-thaZbSon6e3Wi8-MXoHfOdppIAqha3yuqWdks2ZEuiowvAP0Dw5og)
> At its simplest, an AI agent is best described as AI-fueled software that does a series of jobs for you that a human customer service agent, HR person or IT help desk employee might have done in the past, although it could ultimately involve any task. You ask it to do things, and it does them for you, sometimes crossing multiple systems and going well beyond simply answering questions.
>
> Seems simple enough, right? Yet it is complicated by a lack of clarity.
Thoughtful article by TechCrunch.
### Mapping the landscape of gen-AI product user experience
[Mapping the landscape of gen-AI product user experiencePosted on Friday 19 Jul 2024\. 1,601 words, 29 links. By Matt Webb.Interconnected, a blog by Matt Webb](https://interconnected.org/home/2024/07/19/ai-landscape?ref=internalnote.com)
This article has quite the deep dive on the different ways we can leverages Generative AI in products. They end-up with a grid of experiences ranging from realtime to structured or contextual, and categories the experiences in 4 types:
> Users relate to the AI in different ways:
> \- Tools. Users control AI to generate something.
> \- Copilots. The AI works alongside the user in an app in multiple ways.
> \- Agents. The AI has some autonomy over how it approaches a task.
> \- Chat. The user talks to the AI as a peer in real-time.
Comparing this to Zendesk:
- Tools: Tone Shift, Expand and Summary seem to be three features in Zendesk we can categorize as tools.
- Copilots: Yep, [they're actively working on it](https://internalnote.com/preview-copilot/) even though the scope of Zendesk's Co-pilot is bigger than how the article defines it.
- Agents: Seems to be the future of the Agent Co-pilot. Soon. But not yet.
- Chat: Hello Zendesk Bot 👋
# 📝 Articles this month
[A hybrid approach to AI Agents powered by Zendesk and UltimateIn a previous article I explained the Road to Automation and how it can help with automating more your support interactions. This article takes a real scenario and keeps improving the customer experience by leveraging a hybrid approach combining flows, generative replies and API integrations.Internal NoteThomas Verschoren](https://internalnote.com/hybrid-approach/)
[Preview of the new Agent Co-pilot for ZendeskA few months after its announcement at Relate, I finally had to chance to explore the new AI Co-pilot for agents in Zendesk. This article will explore what the Co-pilot can do, how it works and some initial impressions.Internal NoteThomas Verschoren](https://internalnote.com/preview-copilot/)
[Managing custom translations in the Zendesk BotThe new custom translations for the Zendesk Bot make it possible to combine automatic translations for all your flows and answers, while making sure that specific replies or words do not lose their context in a bad translations.Internal NoteThomas Verschoren](https://internalnote.com/managing-custom-translations-in-the-zendesk-bot/)
[Custom Object Placeholders and Object Triggers in ZendeskThis article explores the new capabilities for Custom Objects with the new support for object triggers and dynamic placeholders.Internal NoteThomas Verschoren](https://internalnote.com/custom-object-placeholders/)
# And Finally...
I found [this](https://support.zendesk.com/hc/en-us/articles/7463958274586-Why-do-messaging-conversations-contain-old-and-previous-messages?ref=internalnote.com) interesting edge case in the Zendesk documentation:
> **How come my customer messaging conversation includes ten old messages?**|
> Bots consider a conversation expired after 72 hours of inactivity and deletes metadata for the message in the back-end, but not the message itself.
>
> If there isn't a point of pass-off to an agent after 72 hours, since there are still messages within the messaging infrastructure, when the customer reaches back out, Zendesk will look for essential, missing metadata in the back-end, such as `first_message_id`. Since there is no `first_message_id`, the system grabs the last ten messages from the previous interactions of the user and appends them into the ticket to attempt to provide some context.
### Custom Object Placeholders and Object Triggers in Zendesk
URL: https://internalnote.com/custom-object-placeholders/
Last updated: 2025-09-08T06:41:28.000Z
When I wrote my [Custom Objects](https://internalnote.com/tag/custom-objects/) series earlier this year, one of the main items I missed in building out flows was the ability to use the values of custom object fields when using macros or triggers.
For example, while you could use a macro that said "Thanks for contacting us about `{{product.name}}`", we couldn't use the same to e.g. reference the purchase date or product type of the selected record.
Similarly, if we have a user contacting us, and we need to contact that users' company main contact person, we couldn't create a side conversation for `{{ticket.organization.main_contact.email}}`.
Luckily, this has now changed with the release of placeholders for Custom Objects
[Announcing placeholders for lookup relationship fieldsAnnounced on Rollout starts Rollout ends July 9, 2024 July 9, 2024 July 10, 2024 Zendesk is pleased to announce powerful new placeholders on lookup relationship fields for tickets, ticket requ…Zendesk help](https://support.zendesk.com/hc/en-us/articles/7576570617882-Announcing-placeholders-for-lookup-relationship-fields?ref=internalnote.com)
Let's put this into practice.
# Overview
Imagine we're the support department for a small movie theater. We've got a series of movies playing and store those movies in Custom Objects so we can easily provide information to our customers.
Similarly, we also leverage custom objects to store mobile ticket purchases in Custom Objects so we can quickly reference a customers' bookings.
In our demo scenario we've got a customer contacting us requesting information about a movie playing in the theater. They decide they like the movie, and purchase tickets.
We'll use a combination of macros and [custom object triggers](https://support.zendesk.com/hc/en-us/articles/6294230624410?ref=internalnote.com) to handle this scenario.
## Using placeholders in Macros
### Custom Object
As mentioned above, we've got a list of movies stored in Custom Objects. Each movie has a title (name), director, summary, genre and a list of actors.
To make the demo easy to setup, I used the new [Data Importer](https://support.zendesk.com/hc/en-us/articles/6705584080794?ref=internalnote.com) in the Admin Center to import a set of movies.
This new importer allows you to import CSV files and create and/or update organizations and custom objects in bulk in your instance. For example, the csv table below can be imported into our custom object and it would create all movies.
| name | director | genre | external\_id |
| --------------- | ----------------- | ---------------- | ------------ |
| Inception | Christopher Nolan | science\_fiction | 1 |
| The Dark Knight | Christopher Nolan | action | 2 |
| Forrest Gump | Robert Zemeckis | drama | 3 |
| Titanic | James Cameron | romance | 4 |
If I'd later import a similar file, but this time add columns for `summary` and `actors` then the importer would update the existing movies, as long as the `external_ids` match.
[moviesmovies.csv5 KBdownload-circle](https://internalnote.com/content/files/2024/07/movies.csv "Download")




### Ticket Fields
Our ticket form for this scenario has a custom field to log the Movie the customer is interested in. Since our movies live in custom objects we're using a **lookup field**, linked to the Custom Object, instead of a text field to store this value. This way we can reference the chosen movie in our flows and macros.

### The Macro
Macros in Zendesk are an easy way for agents to reply with a predefined text. They've always supported placeholders to reference a requesters' name, custom field values or an assignee's name in the macro text, making the replies more personal and contextual.
If for example you want to use a requesters' name in a macro, you can use `{{ticket.requester.first_name}}`. Or if you want to print the Order Number stored in field 123456789 you can use `{{ticket.custom_fields.custom_fields_123456789}}`.
With the new placeholders for custom objects we can do a couple of fun things in our macros. Let's assume we have the following movie stored in our objects, and we have a lookup field on our ticket form with ID 123456789:
```
name,director,genre,external_id
"Inception","Christopher Nolan","science_fiction","1"
```
- `{{ticket.ticket_fields_123456789.name}}` will return *Inception*,
which is the **name** of the custom object.
- `{{ticket.ticket_fields_123456789.external_id}}` will return *1*,
which is the **external id** of the custom object.
- `{{ticket.ticket_fields_20080718149010.custom_fields.director}}` will return *Christopher Nolan* **,**
which is the value of the custom field **director** on the custom object.
- `{{ticket.ticket_fields_20080718149010.custom_fields.genre.title}}` will return *Science Fiction*,
which is the value (not the tag) of the dropdown field **genre** on the custom object.
You can find a full overview of all placeholders in this support article:
[Zendesk Support placeholders referenceWhat’s my plan? Zendesk Support placeholders are containers for dynamically generated ticket, user, and custom data. The format is a data reference contained within double curly brackets. Since yo…Zendesk help](https://support.zendesk.com/hc/en-us/articles/4408886858138-Zendesk-Support-placeholders-reference?ref=internalnote.com)
Our macro will have the following content*:*
> Hey *{{ticket.requester.first\_name}}*,
> It seems you're interested in knowing more about **{{ticket.ticket\_fields\_20080718149010.name}}**
>
> Here's some info:
> Director: {{ticket.ticket\_fields\_20080718149010.custom\_fields.director}}
> Genre: {{ticket.ticket\_fields\_20080718149010.custom\_fields.genre.title}}
>
> **Summary**
> {{ticket.ticket\_fields\_20080718149010.custom\_fields.summary}}
>
> **Some actors you might know**
> {{ticket.ticket\_fields\_20080718149010.custom\_fields.actors}}


## Putting it all together
With the setup complete, we can test out our flow.
1. We get an email from a customer interested in the Gladiator movie.
2. The agent goes to the ticket fields and selects Gladiator in the Movie lookup field.
3. They then select the macro that returns movie information.
4. The comment field gets filled with our macro text, with all the placeholders replaced with the information stored in our custom object.



## Conclusion
As you see above, we can leverage all the available fields in our custom object in our trigger and create rich replies with a lot of contextual data.
There's however still a few scenarios that aren't possible yet. Currently our placeholders all make a single *hop*. We can return a movies' `title` or `director` as shown in the macro above.
But imagine the director field is a lookup field itself that references a user in Zendesk. That user has an email, age, Oscars won and other custom fields.
What we currently can't do **yet** is returning a director's age or Oscars won in a macro. Something like `{{movie.custom_fields.director.custom_fields.oscars}}` is not possible for now.
We **can** return these so called *second hops* for ticket requesters and organizations though. So something like `{{ticket.requester.custom_fields.manager.email}}` would return the email of a customers' manager, stored in a lookup user field on that user.
# Object Triggers
Macros are one of the scenarios where we can leverage placeholders. A second feature in Zendesk that supports them is Object Triggers.
Object triggers are a new feature in Zendesk that allows you to automate processes based on changes in custom objects.
Similar to how a Ticket trigger gets fired when a ticket gets updated or created, object triggers run when the same action happens on a custom object.
## What's possible
Why would you use this? Well, custom objects are mainly used to store associated data on top of tickets, users or organizations. If you use Zendesk to handle support tickets, and you sell Service Contracts to customers, you can leverage custom objects to store the contract data (types like gold or silver, renewal date, associated services,..) and link it via a lookup field to an organization.
Similarly, in an asset management scenario you might link newly purchased assets to users or locations.
Object triggers can be used in these scenarios to automate processes on top of your records. When a service contract is renewed, or is about to expire, you can use an object trigger to send out a notification to the customer.
Or when you've received the new laptop or license for an employee, you can send out the serial code or confirmation to the employee when you log the asset in your custom object records.
### Conditions
Object triggers can fire when certain conditions are met:
- A custom object of a specific type is created or updated
- A custom object field has (or hasn't) got a certain value
(e.g. order status is updated to shipped)
- A lookup field attached to the object is linked to a certain other record
(e.g. manager is John)
[Understanding object triggersWhat’s my plan? In addition to using custom objects related to tickets in ticket triggers, you can also define triggers that run any time an object’s record is created or updated. These are called…Zendesk help](https://support.zendesk.com/hc/en-us/articles/6294230624410-Understanding-object-triggers?ref=internalnote.com)
### Actions
Once the conditions are met we can:
- Update a value of the custom object
(e.g. set notified to true)
- Notify someone via email, webhook, or text
(e.g. ticket requester, the assignee, or a linked user via lookup fields)
## Example flow
To show how object triggers work in practice, we'll continue our previous demo scenario. This time the customer is interested in buying tickets for their movie of choice, Gladiator.
### Custom Object
Just like with the movies earlier, we first create a Custom Object to store movie tickets sold. Each ticket has a name, date, time, number of tickets and other related data associated with it.
One of the fields to note is the *Buyer* field. This is a lookup field that links to users in our Zendesk instance and is used to link ticket to their respective buyers.



### Custom Object trigger
Now that we have our object, we can leverage the new custom object triggers. These live in a separate tab under Objects and Rules > Triggers in your Admin Center.
Our goal with our trigger is to send an email to the customer when new tickets are purchased by them.
To start, we setup a condition that looks at our *Movie Ticket* object, and used the *is created* condition.
Next, we'll add an action to notify via email. Since each record has an associated buyer, we can select them as a recipient. The system will automatically use their primary email address to send out the email.
💡
Emails send out via this way are send via **noreply@subdomain.zendesk.com* and not your regular support addresses!


My email body will contain the following payload:
> Hey,
>
> Thanks for buying tickets for {{custom\_objects.movie\_ticket.custom\_fields.movie}}.
>
> The show starts at {{custom\_objects.movie\_ticket.custom\_fields.time}} on {{custom\_objects.movie\_ticket.custom\_fields.date | date: '%Y-%m-%d'}}
>
> You bought {{custom\_objects.movie\_ticket.custom\_fields.number\_of\_seats}} seats for a total of {{custom\_objects.movie\_ticket.custom\_fields.total}}$
You'll notice the format of the placeholders here are a bit different than those used for macros. Since they run on objects rather than tickets, we need to use a `custom_objects.object_type` syntax. Since our movie ticket object has an identifier of `movie_ticket` (as set when we created the type), we can call all custom fields in the object via `{{custom_objects.movie_ticket.custom_fields.field_key}}` .
- `{{custom_objects.movie_ticket.custom_fields.movie}}` returns the associated movie stored in a lookup field.
- `{{custom_objects.movie_ticket.custom_fields.total}}` returns the value of the a custom field called total.
- `{{custom_objects.movie_ticket.name}}` returns the name of the record.
⏰
Since we're using a date field, we can use some formatting syntax to turn the date returned into a nice 2024-07-04 instead of an ugly long date via `{{custom_objects.movie_ticket.custom_fields.date | date: '%Y-%m-%d'}}`
### Putting it all together
So, back to the demo.
Our customer has read the summary and information about *Gladiator* and now decides he wants tickets for the movie.
The agent goes into custom objects and registers a new set of tickets by logging the user, movie (both lookup fields) and all associated data.


They let the customer know they'll book the tickets, and once they add the record our object trigger will fire and send out a, separate, email to the customer with the contents of our object trigger email configured earlier.


## Conclusion
The object trigger example used in this article might not be *that* realistic since most purchases will be handled by a proper sales platform. But for the sake of demonstration it serves its purpose on explaining how we can leverage object triggers to react to changes to the custom object records.
Since we can use the custom objects API to add records, you might imagine scenarios were we import or update records (like service contracts) based on external platforms, and Zendesk will then take care of the rest.
💡
One nice option that this also enables is the concept of a proactive ticket. By combining an internal webhook in Zendesk and the `{{custom_object.movie_ticket.buyer.email}}` placeholder, we can create a new ticket via API in the Zendesk instance. Useful for scenarios where we want to reach out for a contract renewal or other automated alert.
# Wrap up
Custom Objects launched last year and opened up a world of new possibilities in Zendesk. Over the last year updates like these placeholders, but also better API search, bulk import and update of elements and better permission levels made the platform that more powerful.
If you want to get insights in what's possible with Custom Objects on top of the examples in this article, take a look at my original series via the link below:
[Announcing the Custom Objects series for ZendeskIntroducing is a four-part series on Zendesk’s new Custom Objects feature. These articles cover setup, data import, using Custom Objects in forms and with agents, expanding user profiles, and displaying Custom Objects in Help Center forms.Internal NoteThomas Verschoren](https://internalnote.com/announcing-the-custom-objects-series/)
The only big missing piece for me is any end-user access to Custom Objects. You can make objects available [in the bot via API calls](https://internalnote.com/hybrid-approach/) but making them available in forms on the Help Center still requires [custom code](https://internalnote.com/custom-objects-part-4-end-user-and-forms/) for now. Although from what's been announced and shown at Zendesk Relate in April, end-user available lookup fields are coming this year.
## Sign up for Internal Note
A blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Managing custom translations in the Zendesk Bot
URL: https://internalnote.com/managing-custom-translations-in-the-zendesk-bot/
Last updated: 2024-11-03T10:51:14.000Z
Zendesk always has had a deep support for languages in its platform. The Help Center supports translated variants of articles, the Agent Workspace can be translated to fit the language of the Agent, and macros, intents and triggers can be customized to detect and use to reply with the right language to end-users.
Traditionally most of the translations in Zendesk were either done manually (in the case of Help Center articles) or via Dynamic Content placeholders for forms, triggers and macros. Both these options offer you the ability to translate the content yourself with tight control over tone of voice and words used, with the downside that everything needs to be translated manually before it can be used as a translated variant.
One outlier of this has been the Zendesk Bot. Instead of offering the ability of adding your own translations, the bot launched with the convenience of automatic translations. This meant you could write your flow and articles in one language, and the bot takes care of offering that content in other, enabled, languages.
The upside of this approach is easy to measure. Built once, and make other locales available with the click of a button. The downside however is that you lose control over your translations.
Some system translations might lose context and tone of voice, and your brand or product names might get lost in translation. I've heard stories of *Windows* (the brand) get translated into literal translations of *windows* (as in doors and windows) when used in a bot. Similar, a famous retailer in Europe saw its French name being translated to *crossroads*. Not ideal.
# Custom Translations
New in Zendesk Messaging is the ability to add manual translations to your bot flows. This allows you to overwrite the machine translation for any step or response of your bot with a fixed manual translation.
[Managing languages in a conversation botWhat’s my plan? This functionality is part of AI agents. Conversation bots include language settings that allow you to specify a default language and let you configure them t…Zendesk help](https://support.zendesk.com/hc/en-us/articles/4408842754202-Managing-languages-in-a-conversation-bot?ref=internalnote.com#topic%5Fhxt%5Fhzq%5Fbpb)
Take a look at the flow below. It contains an English welcome message, and it's automated translation in Dutch and French

However, when reading those messages they don't feel right for me. With the new manual translations feature we can however add a specific reply for some languages, while keeping the rest of the bot and locales auto-translated:

When we have our French and Dutch customers talk to our bot now, we get custom translations for our welcome message, while the rest of the buttons and actions are still machine translated.

This becomes even more powerful when we dive into custom answers. These flows often contain very specific steps, and interface buttons or product names might be different in specific countries or languages. For example, in the flow below the second screenshot shows an automatically translated response of our reset password flow. The reply contains a rather clumsy *inlog-ID*translation for the English *login ID*.

This *login ID* would be better translated with the same term as the English version as we did in the last screenshot. We can dive into the flow builder and add a manual translation to our flow for the response as such:

# Impact
This new option fixes a lot of issues customers' were seeing with the Zendesk Bot, and removes the need for workarounds around the lack of manual controls for translations.
I've seen customers add a brand per language with a unique bot per brand in order to add specific translations per country. Similarly I've seen customers that add a "What language do you speak" at the start of every flow, and then create a branch per locale.
All of these hacks can now be removed and replaced with the manual translations option for those languages.
One thing I really like about this flow that it's an option and you're not required to translate the entire bot, like you have to do in Ultimate's bot. Being able to trust the machine translations, and only dive into the settings for the few options where you want to add nuance or fix a translation is way less work and easily manageable.

There's one feature you currently loose though, and that's the Generate variants option for the basic bot behavior steps like the greeting and clarification steps. When you enable manual translations, the system will no longer generate a unique variant of your welcome message. This is understandable since the entire point of the manual translation is giving you control over what's send to the customer. But in the scenarios where you want to use the translations to fix a single word (brand name, button, product), it's a shame Zendesk AI can't just take the translated text as input to create variants in that locale.
# Dynamic Content
One question this new feature prompted for me was: will this replace Dynamic Content? Dynamic Content is one of the oldest pieces of Zendesk still in use and its UI harkens back to the old Zendesk UI from \~10 years ago when Buddha's were still a thing.
Dynamic Content was never added to Messaging, doesn't show up in the Zendesk Bot, is not available to use in newer features like Content Blocks in Guide and honestly, feels like an old feature now.
Seeing this new manage translation feature makes me wonder: why don't we have this for fields and macros? Manual translations and placeholders were nice in a time when AI and LLMs weren't a thing yet, but not that Zendesk showed us what's possible for the bot, I want this everywhere!
Take a look at the layout below: we've got the ticket field editor in Admin Center, but added the translation features from the Zendesk Bot. You'd be able to auto-translate dropdown options and labels, or overwrite a specific labels' value with a custom translation. Would be nice to have no?

That being said, I understand that Zendesk Bot and Messaging are a clean slate for Zendesk to start building on. They don't need to worry about compatibility with active installations, there's no migration paths or a dozen years' of existing setups to handle. Messaging and the Zendesk Bot started three years ago as very basic solutions and gradually worked towards feature parity with the existing Chat features Zendesk already had, while taking the time to reinvent and reimagine how things like escalation, translation or "being online" work.
Similar to how Apple used iPadOS to reinvent file handling, multitasking and other productivity features, Zendesk seems to use Messaging to rebuild their feature stack on modern technology. With the big difference that where Apple still needs to proof iPadOS is a real platform to do work on, Zendesk already did that with Zendesk Bot. 🤖
### Preview of the new Agent Copilot for Zendesk
URL: https://internalnote.com/preview-copilot/
Last updated: 2024-11-05T09:50:16.000Z
🕹️
****Update 2024-09-23** \- Zendesk has expanded access to their EAP and made it available for “everyone”. More info [here](https://support.zendesk.com/hc/en-us/articles/8000884897050-Announcing-wider-availability-of-the-early-access-program-for-agent-copilot?ref=internalnote.com).
At Relate 2024 Zendesk presented their latest Zendesk AI features, turning Zendesk into a *Complete Solution for the AI era.*
They focused on the customer, the agent, and the company as a whole within their releases.

*Customers* now interact with an AI Agent first. This bot offers self service with generated responses pulled from a help center, offers flows to route the customer to a solution, or used hybrid flows powered by integrations to automate processes for the Agent.
Human *agents* are still part of the flow. Even though AI can handle a lot of inquiries, agents are still there to help customer with the complex, the personal and the, by lack of a better name, human touch when handling tickets. Zendesk’s intelligent triage with its summary and intent features, and the contextual features like the knowledge panel, macro and suggestions or similar tickets all assist in finding the information quickly to solve a ticket.
And thirdly a *company* can get insights in their efforts and team with Zendesk’s new WEM solution combining both Quality assessment, workforce management and the traditional Explore reporting.
# Omnichannel Automation
Most, if not all, of the features announced at Relate are now available within Zendesk as released products or as early access programs to subscribe too.
One announcement of the event however still remains partially under wraps, and that is their new **Copilot** feature.
💡
**Spoiler: I got the chance to test it out. Scroll down if you want to read about it now, or read on for some context first.*
When Zendesk AI launched in 2023 it came with some additions to the comment field in Agent Workspace. Agents could **expand** an existing comment and turn a short reply into a longer, more nuanced and personal reply with context like the customers’ name added to the comment.
And **Tone-shift** takes an existing comment and turns it into a more friendly and casual, or professional reply.

Earlier this year Zendesk added two new features to assist agents with replying. **Suggested Replies** offer a prewritten reply which can be accepted by agents by pressing the *tab* key. It pulls data from the knowledge base, previous tickets and macros and learns over time.
The new **Quick answer** for the Knowledge base offers prewritten replies in the context panel pulled from your Help Center articles, which can be added to the ticket with the click of a button

The new Zendesk **Copilot** takes the existing reply features in Zendesk and turns them to 11.
## Sign up for Internal Note
The blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# Ticket automation
Traditionally there's two types of tickets we see in a ticketing tool.
One kind are those tickets that can be solved by a help center article. The article nicely explains the steps to take to resolve the tickets and the actionability lies on the side of the end-user requesting the ticket. The agents' role lies in making sure the customers sees the right Help Center article and guide them through the steps.
The other kind of tickets are those where the actions lie on the side of the agent or company. Executing a refund, updating an order, looking up a status or handling exceptions are all tickets that an agent needs to handle, and the customers is just awaiting a resolution or update.
Where the first kind of tickets was originally handled by the agent dutifully replying with content pulled from your Help Center, macros or internal knowledge base. But, the more powerful AI Agents became, the more of these kind of questions are resolved by chatbots and auto-replies via email (the old Answer Bot).
What’s left for agents are those tickets that are actionable and often require a process or a lot more information.
## An Example
Let’s take a refund flow for a product for example. Even though the chatbot can explain the customer when they’re eligible for a refund, or ask for information like order numbers or return reasons, it’s the agent that needs to approve and execute the actual refund in your webshop.
While AI Agents over chat can collect all the required information, the conversation still ends up with an agent who needs to act upon it.
Similarly, when a customers emails your team with “I want a refund now!”, your agents are required to reply to the email and ask for all that information. And we can only hope the customer replies with all the data in one reply. Which always happens. Right?
When we finally have that information, our agent takes that order number, product and reason and goes to the CRM executes that refund, updates the ticket, lets the customer know all is well, and finally solves the ticket.
## We can do better
Assuming we already leverage a good AI Agent, big parts of the above flow can be optimized already. But repeat the above scenario across dozens of tickets and we can quickly discover were agents loose time, or get numbed by the same actions all the time.
1. They need to **learn** all processes in your company
2. They need **identify** the **intent** and **process** (refund)
3. They need to **read** the conversation and ticket fields to see if we have all the required information (order number, product, reason,...)
4. They need to **validate** that everything is correct
5. They need to **execute** a refund
6. They need to **inform** the customer.
This is where the Zendesk AI Copilot comes in.
# Copilot
Copilot takes the above steps and automates them for the Agent. It is there to assist the agent throughout the entire process.
1. It is **based on** your processes
2. It can **identify** the intent and link it to the right procedure
3. It can **ask for the right information** to complete the task
4. It can **validate** that everything is correct
5. It can **execute** actions to be taken
6. It can propose a reply to the agent to **inform** the customer.
Opposite to for example the GitHub Copilot we see in Visual Studio Code, or [Intercom's Copilot](https://www.intercom.com/support-for-agents/ai-copilot?ref=internalnote.com) we don't need to ask the Copilot how to do something, but Zendesk's Copilot will actually take over from the Agent and just do the right thing. The agent, similar to a real pilot is there to make sure the Copilot does the right thing, and take over if things escalate or if a more personal touch is needed.
💡
Copilot is currently in EAP. The version available for testing only speaks English, has knowledge of **retail* intents and can only integrate with Shopify. Future updates should expand languages, intents and will offer ways to integrate with **any* API platform.
## How does it work.
Setting up Copilot starts with writing down a procedure to be followed for a certain Intent. Setting it up does to require any code or flow-building. If you can explain your process in logical steps, you can set up Copilot.
If Copilot detect an intent for a ticket, it will then follow the linked procedure. It will offer the agent replies they should send to the customer in order to resolve the ticket or if actions should be taken, it'll show buttons to the agent to do so.
🤫
I got approval from Zendesk to write and share about my experiences of the Copilot EAP. Since some pieces of the interface aren't "final" yet, I can't share screenshots of the entire setup process, but the steps described are copied from my testing environment as-is.
We can define our procedure as follows:
> **Exchange a product**
> To exchange a product we need to know:
> \- the order number
> \- the product name
> \- the return reason
>
> Once we know this, we need to check in Shopify if this is a valid combination. If so we can refund the product to the customer.
> We need to let the customer know this can take 2-3 days to be processed.
You’ll immediately notice that this is just regular text. I’ve written down the process in plain English without any fancy code or markup.
And this is one of the most awesome parts of Copilot from an admin perspective. You can define a process as a company, write it in a Google Doc and give that to your Zendesk Admin or CX Team Lead. They can copy the process, paste it Copilot as a procedure and that's it. The AI model underlying Copilot reads those procedures, and trains itself to take care of this process.
In this EAP I could only test retail flows but even there, the easy of use and wins in efficiency already showed. For example, when a customer mentioned an order number, not only does Copilot pickup that number, it also verified in Shopify if the user and the order number match:

## An email flow with Copilot
Let's make this real and go through an actual flow.
Let's say a customer emails customer care because they want to exchange or refund product.

When our agent opens the ticket in the Agent Workspace they’ll notice that the comment fields has been replaced with a new Copilot mode.
The Copilot read our customers' email, and offers a reply to collect the missing information. The Agent can either accept and submit the reply
If our customer then replies with a product and a reason, the Copilot once again offers a reply. This time confirming information, and politely asking the customer for the order number.

When we’ve finally collected all required metadata, we see a new button appear in Copilot. This time the system offers to cancel the items and the agent can execute the refund with the click of a button, and reply to the customer with some additional information on what happens now.

Copilot then offers to solve the ticket.

## A chatbot flow with Agent Copilot
Let’s take this same flow, but now our customer contacts us over Messaging and an AI Agent intercepts the conversation.
💡
The AI Agent in this flow was built on [Ultimate](https://internalnote.com/hybrid-approach/) for its easy of integrating with Shopify. You can however accomplish the same with the regular Zendesk Bot.
The first steps of the flow are handled by our bot. It shows a list of available orders, and then shows the items within an order to our customer.

At the end of the flow we pass the conversation to our agents. When the ticket arrives in Agent Workspace we already get a lot of context. The bot collected the order number and product already, so this time Copilot offers a reply asking for the return reason only.

And similarly to the example earlier, Copilot wraps up by offering a refund button, and we can close our ticket.
For the customer, this interaction feels like a regular interaction with a real agent:

## Efficiency Gains
The efficiency gains enabled by Copilot are immediately visible. For every procedure defined for Copilot, our agent only needs to verify the proposed actions are correct, and they can submit or approve the next steps for the customer.
Only in scenarios where the solution is wrong, or where Copilot doesn’t know how to handle the ticket, will agents actually need to jump in and use the existing AI tools and their own skills to resolve the ticket.

Copilot doesn’t require **every** procedure to be written down for it to work. Similar to [generative replies](https://internalnote.com/quick-look-at-the-new-generative-ai-bot-for-zendesk/) for the Zendesk Bot and its custom answers, if no procedure is defined, Copilot will fall back to replies generated from macros and your knowledge base, similar to the suggested reply feature available today.
I was also surprised by how nicely it could context switch. In one of my tests I asked the Copilot for washing instructions for a jersey and I had imported Help Center articles for denim, cotton, polyester. The Copilot asked me which fabric I had and I replied with “denim”.
While I saw the reply being generated as an agent (which takes less than a second), I quickly had my demo user reply again with “cotton”.
Copilot immediately started generating a new response and gave instructions for both fabrics, prefaced with a short “in case you need both..”.
# Conclusion
For now, Copilot is in private beta and isn’t available yet for everyone to try. It only works in English, and its intents are limited to retail environments. And actions can only be executed in Shopify for now.
But ignoring these limitations for now, if we look at the feature for what it can be it’s clear that this will be a game changer for both agents and Zendesk admins.
Once this becomes broadly available agents this will unlock some great benefits from the get go. The obvious one is the fact that agent will need to write less and that team leads can be sure processes are followed.
This means agent can focus even more on the exceptions and really dive deep into the complex tickets that require their real attention.
Similar, when onboarding new people to the team it’ll become way easier to get them up to speed. Now it requires learning complex processes and taking in all the data needed and steps taken to resolve a ticket. With Copilot the system will guide the new agent through their first *refund ticket* and while reading along with the responses the new agent can learn those processes on the go.
There’s a few things I wonder about though. If you need to take care of hundreds of Refund ticket a day, accepting those replies will become a shore after a while. Luckily Zendesk already announced at Relate that the end goal of Copilot will be a way for Admins to set a threshold. And for all replies where that threshold is met, Copilot will autonomously reply, leaving only the edge cases for Agents to approve.
The relationship between Copilot and AI Agents is also tricky. Where AI Agents stop, Copilots begin. If your process requires human approval for refunds, the AI Agent can only do as much and identify the user, tag the intent and collect metadata. It’s the Copilot that then takes over, with final approval by the Agent.
I kinda hope we can someday define our procedure in Copilot and have an AI Agent feed from that as well. If our process requires an Order number and reason for a refund, there should be no reason we need to manually built that Answer flow in the bot, when Copilot can generate that process automatically.
Putting aside future wishes, I was really surprised by how solid the Copilot worked. The example flows I showed you above were built in a matter of minutes without resorting to documentation and worked immediately.
Really curious how this will evolve in the next few months and years!
## Like this kind of content?
I write about Zendesk every week. Subscribe today and get new Zendesk updates in your inbox. For free.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### A hybrid approach to AI Agents powered by Zendesk and Ultimate
URL: https://internalnote.com/hybrid-approach/
Last updated: 2024-11-05T10:02:13.000Z
In a previous article I explained the [Road to Automation](https://internalnote.com/road-to-automation/) and how it can help with automating more and more of your support interactions.
In this article I’m going to take a real scenario you might want to support, and keep improving the customer experience by leveraging a hybrid approach where I combine traditional flows, generative replies and API integrations.
Let’s imagine the following scenario: we’re a webshop selling beers to customers. We offer a wide range of beers but we notice our customers reach out for the same problem each and every day: how I pour the perfect pint?
# Using the Zendesk Bot
## The basic: showing a Help Center article
This is where most companies who want to use a chatbot start. They have an existing set of Help Center articles, and when we move to a chatbot, we can have the bot show those articles to the customer.
In our scenario, when a customers asks *How to pour a beer?*, we respond in Zendesk with a list of articles explaining the steps for a variety of beers.

It works, but has the downside that it requires some additional work from the customer. They need to look through articles to find the right beer, read the entire thing, and shift from the web widget (or social channel) to a website.
## Improvement #1: Generative Replies
Let’s do the same thing, but this time we enable generative responses in Zendesk.
The customer ones again asks: *How to pour a beer?*
Since we’ve enabled Zendesk’s generative replies, our bot now reads the article and responds with a reply for the customer.


However, we run into an issue here. Unless the customer specifies their exact beer, our bot will take a random article to reply, and possible gives instructions on how to pour a Guinness for the person who wants to enjoy their Duvel. (And trust me, the steps here are widely different!)
Within Zendesk, we can’t solve this issue elegantly within the generative reply options. We can only offer a potentially wrong answer, and then have the customer ask the same question again, this time specifying their beer.
## Improvement #2: Use a custom answer
One way we can solve this in Zendesk is by leveraging answer flows. We can create an answer that responds to phrases like “how to pour a beer”.
This answer can then show a list of available beers, and when the user selects their beer, we show the right help center article for the selected drink.


The only downside here is that we loose the nice generative replies, and have to fall back to a list of articles.
# Using Ultimate
This is where Ultimate comes in. Ultimate’s generative bot capabilities not only work to reply to direct questions, but can also be used within flows to dynamically create responses.
## The basis: using a generative reply
uGPT, as their technology is called, can be used across the entire bot to generative custom replies to your customers just like Zendesk's Bot. Similar to Zendesk Ultimate indexes your Help Center (or other sources) and generates a reply for questions asked by the customer.

So all things equal, we also have the same issue as we had in Zendesk. Unless the customer specifies their preferred beer, chances are they get the wrong instructions.
## Improvement #3: Use generative replies in bot flows
In Ultimate we can fix this issue again by creating a custom answer, or reply as it's called in Ultimate, to ask the customer first to specify their choice.
Here you see a a similar flow as we’ve build in Zendesk. We once again ask the customer to select their beer choice and then go to the next step.

The main difference between Ultimate and Zendesk is that instead of showing a list of articles, we ask uGPT to search for pouring instructions for the specific beer.
The bot will search for an article that matches their choice, and generate a custom reply with content from the matching article.
And while where pointing out differences and benefits between the two platforms, you’ll notice that after we offer the customer the available beers, we can link all those choices back to one flow to generate the response. There’s no need to duplicate the next steps as we have to do in Zendesk. This makes the flows cleaner and less complicated.


As you can see in the images above, our bot nicely responds with custom instructions for each beer.
However, once the customer confirms everything is well, our bot always uses the same predefined response to wrap up the conversation. Which, if our customer repeatedly needs help, will quickly feel repetitive for them.
## Improvement #4: Even more personal
So, even though our bot already handles the "How do I pour a beer" question completely, we can make the entire flow a bit nicer by also closing the conversation with a uGPT generated response:

Now, let’s talk to the bot a few times.
You’ll notice that the responses take the context of the conversation into account, and that our bot replies with very personal and unique confirmation messages.


## Improvement #5: Leveraging APIs
There’s one final optimization I’d like to make to our bot. Currently our flow only accounts for two beers: Guinness and Duvel. But our webshop has dozens of beers available, and we’d like to offer the customer a list of all the available beers to choose from in our flow.
We could manually add them all, but not only is this a lot of work, it’s also not ideal since new beers are added to the webshop every day.
A better way to solve this issue is by adding an API integration to our chatbot. This will pull in all beers via API, and render them as a nice carousel.
I’ve written about this in the past on how to do this in Zendesk, but since we’re using Ultimate this time, let's see how we can build a similar flow in this new Zendesk tool!
[Expanded support for variables in the Zendesk BotZendesk recently added variables, dynamic options and carousels to their Bot Builder. No better way to showcase these new capabilities than building a bot powered by the Avengers!Internal NoteThomas Verschoren](https://internalnote.com/expanded-bot-variables/)
For easy of use I’ve added all the available beers to [custom objects](https://internalnote.com/tag/custom-objects/) in Zendesk. Each beer has a name, a percentage, brewery and image we’re going to use in our bot flow.

First step is adding an API integration to Ultimate. The nice thing here is that all integrations live outside of bot flows, which means we only need to setup an integration once and we re-use it across multiple flows.


Next, we’re adding the API to our existing flow and turn our manually created carousel of available beers into a dynamic carousel to show the options to the end-user as made available via the API.

And now, when a customers asks *how to pour a beer*, they get the follow flow:

# **Wrap Up**
So, hopefully this article gave you some inspiration on how to improve your flows and experience in your own Zendesk bot across both Zendesk and Ultimate.
One key take away from this article is that by levering hybrid flows you get much more powerful and effective flows which will result in a higher ticket automation rate, by combining help center content, APIs, custom flows and generative responses.
The article above also demonstrates a few ways in with Ultimate is more powerful and efficient than Zendesk’s own bot in handling such flows. So if your AI Agent reaches the limits of Zendesk’s build in features, it might be worthwhile exploring their newest acquisition!
### Zendesk Roundup for July 2024
URL: https://internalnote.com/roundup-2024-07/
Last updated: 2024-11-03T10:54:11.000Z
The past month was a month full of Zendesk Showcases around the world. Showcases are mini-Relate events where Zendesk presents their newest updates to customers in key cities across the globe.
I had the chance to visit the [Paris Showcase](https://youtu.be/3AhezmN2njo?si=kv-PmYDTgm-k-FuW&ref=internalnote.com) as part of [Premium Plus](https://premiumplus.io/?utm%5Fsource=internalnote) meeting up with customers and Zendesk friends for a day of product updates, demos and conversations.




# 🎉 New Releases
## 🤖AI Agents
### Expanded conditional operators
Zendesk's bot builder has a conditional step where you can create branches in your flows based on users input. You can for example show a different flow if a user picks the blue or the red pill.
It used to be a fairly limited set of conditions where we could only filter based on *is* or *contains* operators, but now the options are expanded with a lot more variables.

## 👨🏻💻 Agent Workspace
### Agent Home
Almost a year after the initial release of [Agent Home](https://internalnote.com/agent-home-beta/), Zendesk has now [announced](https://support.zendesk.com/hc/en-us/articles/7436748335642-Announcing-rollout-of-Agent-Home-for-Agent-Workspace-customers-default-experience?ref=internalnote.com) that this new dashboard will become the default experience for all Zendesk customers. This means that starting this summer Agents who launch Zendesk will be greeted with the new overview and get a direct view on active tickets assigned to them, the tickets they follow or are cc'd on.
Parallel to this roll-out the new Agent Home also got a bunch of new features, giving your agents even more context.

- Ticket statistics are now clickable, and route you to a predefined search page where you can analyze your customer feedback
- New Satisfaction Statistics are now visible
- Tickets Assigned to My Groups are counted on Agent Home as they were on the legacy Dashboard, and are hyperlinked to search results that will let you see the tickets relevant to that count (up to 1,000 tickets)
- And to wrap it all up, Agent Home now also supports Talk tickets in its views.
Personally, ever since Agent Home arrived, I've rarely used any of my Views anymore. Looking at new tickets for me happens right from the Dashboard, and I only look at Views if I want to check my backlog or reference an older ticket.
Can't wait to get a similar dashboard in the mobile app.
[How to get the most out of Agent Home for ZendeskThis article shows you ten practical tips on how to gain the most out of Zendesk’s new Agent Home.Internal NoteThomas Verschoren](https://internalnote.com/agent-home-tips/)
### Retain original groups and assignees on Follow-up tickets
You can now choose wither reopened (follow-up) tickets get assigned back to their original assignee, or if they are created without assignee and are reassigned by [queues](https://internalnote.com/beyond-triggers-moving-to-queue-based-assignment-in-zendesk/) or triggers.

### Consolidated Macro Management
After Relate, I wrote that this years' Zendesk felt more like AI integrated into the Suite, whereas last years' release felt like Zendesk with some AI sprinkled on top.

It's nice to see that this integration is now also visible in the Admin Panel. Instead of treating AI features as separate elements in the UI, they're now moving into their logical sections. Looking to do something with Macros? Easy. All macro features, both editing and suggestions, are now in one dashboard.
*Can't wait to see more of these integrations. Messaging authentication settings being outside of the rest of authentication being one of them.*
### Group level access for Agent Status
As part of Omnichannel Routing you can leverage (custom) Agent Statuses to make agents available for all or only a select set of channels. By default you've got online, offline, transfer only and away statuses, but you can add custom statuses to, for example, only allow email or messaging for that user.
In bigger organizations that list grows quickly, and not every team might need a "Talk Only" status. With this months' update you can now assign a Custom Status to only be available to specific groups, similar to how we can assign macros and views.
💡
Note: Custom statuses created prior to June 10, 2024 are available to all groups unless an admin [edits the status](https://support.zendesk.com/hc/en-us/articles/5133588225690?ref=internalnote.com) to restrict access by group. After this date, admins must specify group accessibility for each status they create.
## 🔎Help Center
### Multiple user segments in view permissions
One of the main limitations in [segmented articles](https://internalnote.com/zendesk-guide-membersonly/) for the Help Center was that you could only assign one segment per article. This lead to scenarios where if you want to make some articles available to Organization A and Organization B, and others to only A or B, you'd end up with three segments:
1. Users belonging to organization A
2. Users belonging to organization B
3. Users belonging to organizations A or B
Doing the same for three organizations required up to six segments and keeping things organized and scalable is often impossible for bigger setups.

Starting this month this issue is resolved with the ability to add up to ten segments per article. Instead of creating a segment for users in organization A or B, we can [now add the segment](https://support.zendesk.com/hc/en-us/articles/4408824005914?ref=internalnote.com) for organization A and the one for organization B to the article. Perfect 🤩.
## 🧱 Open and Flexible Platform
### Sandbox replication
Premium Sandboxes are limited to [a subset](https://support.zendesk.com/hc/en-us/articles/4408822049818-Creating-a-premium-sandbox-with-data-replication?ref=internalnote.com#topic%5Fnxm%5Frkf%5F5yb) of Zendesk users, but for those who have access, the replication of your instance from production to sandbox can now also copy over your Marketplace apps, as long as they are free, without logins and don't require configuration during setup.
As a side-note, it's nice to see the sandbox in Zendesk slowly getting more and more capable. A full mirror of your instance with all settings (Bot Answers come to mind) is still not possible, but piece by piece we're moving towards that future.
### Data Importer enhancements
Zendesk's new Data importer can [now](https://support.zendesk.com/hc/en-us/articles/7471865612826-Announcing-enhancements-to-the-data-importer?ref=internalnote.com) do a *create and/or update* when importing new organizations or custom objects. This used to be limited to either only creating new objects, or updating existing ones, but with this new feature we can ingest an export and the system will take care of adding what's missing, and updating the existing objects.

This feature used to be available in the old organization importer, and is also available over API, so it's nice to see this being available in the new importer too.
*Up next, importing users? 🙏*
# ⚠ Major Changes
### Removing support for password API authentication
Zendesk is *finally* removing access to APIs over passwords. I say finally cause it's one of the less safe methods to authenticate. Passwords can be reused by users, and if another tool or platform where a user uses the same password is breached, anyone testing that email and password combination against your Zendesk has access to its API.
Ironically, this also means Zendesk is removing a feature that made password authentication **safer** than token authentication. With password API access the access limits are set by the user that's logged in, combined with their password. If a user logs in, they can access what they can for their role.But if you give that same user an API token, and they swap out their email with that of an admin, all of the sudden they get admin access. So here's to me hoping this is the first step towards making API tokens with granular access rules.
> From **31 July 2024**, we’ll no longer provide the option to use email and password for API call authentication for accounts that didn’t use this feature. Our focus will switch entirely to API token and OAuth as the supported authentication methods.
>
> **Next Steps:**
> If you’re not actually using this feature, you don’t need to do anything. We’ll deactivate this feature and after 30 July, the feature will be permanently removed from your account.
>
> However, if you’re still using this feature, please reactivate it before 30 July to maintain access until 31 December 2025\. You can find this under Admin Centre: Apps and Integrations > APIs > Zendesk APIs > Settings > Password Access.
### EOL of the legacy Social Messaging app
On July 31st Zendesk will kill the Social Messaging integration. This app was a precursor to Messaging and allowed you to link WhatsApp, Facebook Messenger and other social apps before they became available as part of the Messaging features.
Both are based on Sunshine Conversations, but where Messaging is deeply integrated with bots, reporting and agent status, Social Messaging was always a bit of a quick hack to get Sunshine Conversations enabled in Zendesk and was always a temporary features awaiting the, back then, future release of Messaging proper.

This summer Social Messaging will finally be removed, so if you Zendesk still shows the icon above, [you'd better migrate quick](https://support.zendesk.com/hc/en-us/articles/7413502356506-Announcing-the-in-ticket-notification-for-the-EOL-of-the-legacy-Social-Messaging-app?ref=internalnote.com).
To make it even more clear you're part of the affected environments, Zendesk will show an in-app alert for these customers on every ticket.
# 💡Insights
### Escalation criteria
Nice article on how you can define a process for escalating tickets and customer requests by the team from Birdie.
[Building an Effective Escalation Criteria Table \[+ template\]Maxime Manseau](https://www.birdie.so/toolbox/escalation-criteria-table?ref=internalnote.com)
### Deep-dive into Custom Objects
Nice overview of [custom objects](https://internalnote.com/tag/custom-objects/) with a preview of the new end-user editable lookup fields in forms.
### Recommending articles to users who are authenticated with JWT
Zendesk's Messaging [authentication](https://support.zendesk.com/hc/en-us/articles/7431328780314-My-bot-is-not-recommending-articles-to-users-who-are-authenticated-with-JWT?ref=internalnote.com) sure is the gift that keeps on giving. It surely has to be one of the more complex setups in the entire suite when it comes to grasping all the edge cases and exceptions.
Take [this article](https://support.zendesk.com/hc/en-us/articles/7431328780314?ref=internalnote.com) for example:
> End user who are authenticated with JWT can only access articles when their user profile in Zendesk is created before their conversation starts with the bot.
> For this to happen, ensure the end user exists in your Zendesk database before the user interacts with the Web Widget. This creates the external ID used to check the user profile and their access permissions. Users profiles without an external ID cannot see article recommendations, even if they are authenticated with JWT.
So if I understand this correctly:
- Unauthenticated users get recommendations by default
- Authentication users only get recommendations **if** they exist in Zendesk and have an `external_id` associated with them.
Which basically means that if you ad-hoc provision users the first time they login to your widget, those users will probably get no articles recommended. Importing your users in advance into Zendesk seems to be the best way forward here.
# 📝 Articles this month
[Quick Look at the Zendesk Relay App for outbound WhatsApp messagesThe new Relay app from Zendesk makes sending outbound messages over WhatsApp via Sunshine Conversation available to all Zendesk users without custom coding or development.Internal NoteThomas Verschoren](https://internalnote.com/relay-app/)
[Showing device Information in the customer panel in Zendesk Agent WorkspaceThe new Device information section in Agent Workspace gives you information about your customers’ context right next to a Messaging ticket.Internal NoteThomas Verschoren](https://internalnote.com/device-information/)
[Handling multiple support addresses in a support emailThis article offers a solution for scenarios where customers email multiple support addresses in your Zendesk instance and you only see a single ticket being created.Internal NoteThomas Verschoren](https://internalnote.com/multiple-recipients/)
[Zendesk Roundup for June 2024Subscribe to a hand-picked round-up of the best Zendesk links every month. Curated by Thomas Verschoren and published every month. Free.Internal NoteThomas Verschoren](https://internalnote.com/roundup-2024-06/)
# And Finally...
I came across a list of Chrome extensions compatible with Zendesk
[Quicktab for Zendesk by TymeshiftWell behaved browser tabs for Zendesk agents](https://chromewebstore.google.com/detail/quicktab-for-zendesk-by-t/hhbimbckgheipimadcknkfogegmpoibj?ref=internalnote.com)
When you click on a ticket link, it opens the ticket in an existing Zendesk tab without opening a new one.
[ZendeskTicketCopyCreates a simple button in Zendesk to copy the current ticket number.](https://chromewebstore.google.com/detail/zendeskticketcopy/ngkngoghlonilnnejjcecljbbaekapim?ref=internalnote.com)
Adds a 1-click copy button next to the ticket number.
[Zendesk Dark Mode ThemeTake care of your eyes day and night using dark theme for Zendesk tools and services.](https://chromewebstore.google.com/detail/zendesk-dark-mode-theme/ndneacmpkcghablknbeiiopilgeomhon?ref=internalnote.com)
Zendesk. But after hours.
## Sign up for Internal Note
The blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Quick Look at the Zendesk Relay App for outbound WhatsApp messages
URL: https://internalnote.com/relay-app/
Last updated: 2024-11-03T10:54:20.000Z
At [Relate](https://internalnote.com/zendesk-relate-event-recap/) this year Zendesk has a Zendesk Labs booth with previews of new ideas they were working on. The Zendesk Labs initiative builds and tests out concepts before they're ready to go into the main Zendesk Suite.
Examples are the [Conversational Commerce](https://www.zendesk.com/newsroom/press-releases/zendesk-conversational-commerce/?ref=internalnote.com) concept, or now the new [**Relay App**](https://www.zendesk.com/marketplace/apps/support/1040322/relay/?ref=internalnote.com)for Zendesk.
This new Marketplace app from Zendesk allows you to send out messages over WhatsApp and SMS to customers making use of templates and the Sunshine Conversations API.
It's a free app that takes care of both creating templates and sending those messages in bulk to your customers.
[](https://www.zendesk.com/marketplace/apps/support/1040322/relay/?ref=internalnote.com)
## What's possible
Similar as to how you can leverage the Sunshine Conversations API to [by-pass the 24 hour limitation](https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk/) for customer communication, you can also use this API to send outbound messages to your customers.
You can use this to send out marketing messages, order confirmations, delivery updates or any other type of outbound message to WhatsApp (or SMS) users.
I explained a similar flow in an earlier article, but now the same is possible with a native and much more powerful app by Zendesk itself.
[➕ Sending Automated Messages via WhatsApp with Sunshine Conversations and ZendeskLearn how to leverage the Sunshine Conversations API included in Zendesk Suite to automatically send out messages to your customers.Internal NoteThomas Verschoren](https://internalnote.com/sunshine-conversation-automations/)
# Installation
The process for installing the app is fairly well documented in the support article linked below. It does require admin access to your Zendesk instance and a working WhatsApp for Business account linked to both Zendesk and your Meta Business Manager.
[Installing and using the Relay messaging appThis article includes instructions on setting up and using the Relay messaging app. Important: You are responsible for using the WhatsApp and text features in Relay in compliance with all applicab…Zendesk help](https://support.zendesk.com/hc/en-us/articles/7051551958426-Installing-and-using-the-Relay-messaging-app?ref=internalnote.com)
## Enable custom objects
This app stores a lot of its configuration data in Custom Objects. So if you haven't yet, go to the Admin Center and enable Custom Objects first!
And if you're interested in Custom Objects, take a look at my Custom Objects introductions series!
[Zendesk Custom Objects - Part 1: IntroductionThis is a four-part series on Zendesk’s new Custom Objects feature. The articles cover setup, data import, using Custom Objects in forms and with agents, expanding user profiles, and displaying Custom Objects in Help Center forms.Internal NoteThomas Verschoren](https://internalnote.com/custom-objects-part-1-introduction/)
## Creating an Authorization Token
First step is creating the authorization key by adding a new Conversations API token.
Since the apps' installation settings require a base64 encoded combination of the Key ID and Secret key it's easiest to go to this [Sunshine Conversation token generator](https://zendesklabs.zendesk.com/hc/en-us/p/sunco-token-generator?ref=internalnote.com) to create the encoded key/secret token.


## WhatsApp Namespace ID
The documentation mentions that the WhatsApp Namespace ID is optional, but I noticed it doesn't seem to work as reliable without it, so best to go to the [Meta Business Messenger](https://business.facebook.com/settings/?ref=internalnote.com) and grab the ID from *WhatsApp Manager | Account Tools | Message Templates*. Once on that page, you can click the ⚙ Namespace button to copy the ID.

## Adding the app
Once you've collected the required tokens and IDs you're all good to setup the app.
There's a few caveats I noticed:
- The Zendesk subdomain should be your main domain, and not a subdomain of one of your brands. The API calls failed for me when I used a different domain, even though the WhatsApp channel I used was linked to another brand.
- While testing, best to set the Blackout value, which defines how often you can send the same message to a customer, to zero. This way you can test with the same customer until you're happy with the result!

Once you've setup the app you can jump to your Agent Workspace and open the Relay app. It's located in the navbar on the left.
At first launch the app will take a few moments to load your Meta/WhatsApp data and configure itself. This process took \~two minutes for me, so don't worry if it takes a while.
After wrapping up the initial configuration, you'll be greeted with a list of your existing templates (if any) and the option to create new ones or send a message.


# Creating templates
WhatsApp has strict rules on who can send messages to customers, and what those messages can contain. Before we can send out a proactive messages we first need to create a template which has to be approved by Meta.
This approval process takes only a few minutes so it's not that big of a hassle.
So, to create a new Template, click the *Create button* on the apps main screen. Give your new template a name, and select the channel it should apply to.
Next you'll be asked to select a category. Make sure to select the right one, since this will impact your template approval!
- Marketing: used to promote your product or service to customers. Useful for sending out promotions, discount codes e.a.
- Utility: used for transactional emails like order confirmations, shipment updates e.a
- Authentication: used for sending out password reset codes, 2FA codes, e.a
- Service: used in customer care scenario's to send out CSAT, [bypass the 24 hour window](https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk/), e.a
💡
Note that sending outbound messages over WhatsApp is ****not** free. Depending on the category you select, prices will vary. See [this article](https://business.whatsapp.com/products/platform-pricing?ref=internalnote.com) for more info.


When filling in your message template you can make use of *dynamic values*. E.g. if you want to send the customer the following:
> Your order #1138 has been shipped. Track its status via the link below
We can add `{{order_number}}` as a placeholders in the text.
```
Your order #{{order_number}} has been shipped. Track its status via the link below.
```
When we submit our message the app will offer text fields where we can add *1138* and as a value and dynamically insert it into our message.
Similarly we can add a Call to Action button that adds a tracking link, or we can add Quick Replies for the customer to easily confirm or escalate a message. Since messages are send out over the same WhatsApp channel we use to receive requests in Zendesk, any response from the customer will be picked up by the Zendesk Bot or an Agent.
Note that your URLs can also contain those placeholders, so `https://track.me/{{order_number}}` is a valid URL to enter in this field.


After filling in the template we can submit it for review with Meta. As mentioned above this approval flow often takes minutes and you can clearly follow along with its status from within the Relay app.


# Sending messages
## Selecting a template
Once you've got your templates configured you're ready to send out your messages. The first step is selecting a template and choosing a channel from the list.
If your template contains placeholders, Relay will present you with a form to input your order number, delivery date or other elements. The preview on the right nicely previews the result.



💡
One immediate limitation I noticed is the fact that even though we can select multiple users, the placeholders are the same for every message we're sending. So while placeholders are ideal for bulk updates with the same content to all customers, sending unique and personal messages per customer is not possible.
## Selecting users
After configuring the contents of our message, it's time to select the recipients. Weirdly, instead of offering a list of users or an option to import users, we're shown a text field that accepts a search query.
If you've entered a valid entry – no error messages or useful information here – the *Next* button will become active, and the *Audience* title will show the amount of recipients between (brackets).
Clicking the *Manage audience* link will show a modal view that lists all recipients, and allow you to exclude specific users from the list.


## Useful search entries
If you've never used the Zendesk search syntax, well, it's not that difficult to grasp. The article below gives a full overview of all the options, but I've listed the most relevant for Relay below.
A useful query is the syntax to list a whole list of phone numbers in one search query. It's similar to importing a list of users, with the only caveat that these users have to exist in Zendesk as end-users already.
[Searching users, groups, and organizationsWhat’s my plan? Data in the end users, team members, group, and organization objects can be searched on their respective pages. This article covers the following topics: About searching The us…Zendesk help](https://support.zendesk.com/hc/en-us/articles/4408883318554-Searching-users-groups-and-organizations?ref=internalnote.com)
- `name:"John McClane"` to send a message to a user with that name
- `tags:vip` or `tags:"vip jedi"` to select users with a specific tag
- `email:james@universalexports.co.uk` to select a user with that email. To select multiple repeat the query. `email:mr.blue@reservoir.dogs email:mr.green@reservoir.dogs email:mr.black@reservoir.dogs` . The same trick works for selecting multiple phone numbers by using `phone:+1234567890` and repeating that query.
- `created:2024-05-21` if you want to send all new users
- `plan_type:platinum` for all users where the custom field *Plan Type* is platinum
And finally, after selecting the template and our audience, we're ready to send our message to all users:

# Limitations
The Relay app is developed via Zendesk Labs, and you notice this when using the app. It does what it promised to do, but it feels like a proof of concept and not as a fully developed and robust solution.
For some reason I can't send a message to my own personal WhatsApp number. But with only this helpful error message and no logs or console errors, it's just impossible to troubleshoot why.

Similarly, the process of manually encoding and adding the tokens, instead of leveraging a nice oAuth flow also feels a bit clumsy.
But, since this is a Labs app on the Marketplace and not a core part of Zendesk Suite like [Proactive Messages](https://internalnote.com/proactive-ticketing-for-messaging/) is, it's understandable. Although I do hope some of the setup and error experience gets some attention in future updates.
Speaking of future updates, there's a few features I'd love to see:
- Add scheduling. It would be nice to be able to schedule messages in advance.
- Add the ability to importing users in the audience step, and add these as end-users in Zendesk.
- Make these messages available as an action in native automations or triggers.
- Allow for setting placeholders in templates based on user fields, organization fields or linked custom objects.
# Conclusion
So yeah, that's Relay. A nice and **free** app on the Marketplace that allows for some simple outbound reach over WhatsApp (or SMS). It makes using the included Sunshine Conversation abilities available to all Zendesk admins, even those who can't or don't want to build their own integrations to handle this.
### Showing device Information in the customer panel in Zendesk Agent Workspace
URL: https://internalnote.com/device-information/
Last updated: 2025-09-08T06:41:12.000Z
In [May's Roundup](roundup-2024-05) I wrote about Zendesk's new Device Information section for the Customer Context panel. This new sidebar section, displayed next to Messaging tickets, shows information related to the customers' device to agents.
This information, like operation system, browser type and version is useful information when troubleshooting technical issues.
For example, if you know a certain feature of your app doesn't work on older Android phones, or that your web app requires the use of Chrome instead of Safari, these pieces of information are crucial to detect problems and alert the customer.

# How does it work
The device information section is enabled by default for all instances. By default is will show operating system and browser information, and hides IP address and location info from agents.
By toggling the options in *Admin Center > Workspaces > Context Panel* you can display either or both the IP Address and location to agent if that information is relevant for your agents.

Since you're actively collecting and displaying PII to agents, don't forget to update your privacy policy accordingly! If you want to handle cookies correctly, take a look [here](https://developer.zendesk.com/api-reference/widget-messaging/web/core/?ref=internalnote.com#set-cookies).
[babelforce - The #1 Most Flexible Call Center Softwarebabelforce is the #1 most flexible call center software for customer experience teams. Make customer service easy. Make growth easy.babelforce – The No-Code Contact Center Platform](https://babelforce.com/?utm%5Fsource=internalnote)
My thanks for babelforce for sponsoring this month's Internal Note newsletter.
## Relevance
The device information context is linked to the **end-user** and not to the actual ticket. This means that this data will update regularly at each moment the user interacts with your Zendesk instance.
The benefit of having a single datapoint that updates for the user is that you always have the latest information available. If a user has updated their system and replies to the conversation, you can see that new data right next to the ticket.
However be mindful that the data shown can be more recent than the question the customer has asked. If you're handling an older ticket it might be that the customer has already updated their system or moved locations before you reply.
Secondly, since the information shown is linked to the user, you can leverage Messaging Authentication to make sure all tickets a user starts over Messaging are mapped to the same profile.
[Messaging Authentication: Verified email and merging existing users based on emailZendesk introduced a new email verification flow to handle the mapping of authenticated Messaging users and exiting end-user profiles. It’s a lot so let’s dive in!Internal NoteThomas Verschoren](https://internalnote.com/messaging-authentication-identify-and-merge-existing-users/)
# Exporting the data
Having this data available in the Agent Workspace is useful to resolve tickets easily. But sometimes you also want to access that data outside of Zendesk for reporting purposes.
One way to capture the data is by leveraging Zendesk's' (new) GraphQL API located at `https://subdomain.zendesk.com/api/lotus/graphql`
By executing a `POST` to this endpoint with the payload and variables below, you can get a nice JSON object that contains all the user information shown next to a ticket.
Authentication is done via Basic Authentication: admin@domain.com/token and a Zendesk API token.
### GraphQL Body
```graphql
query UserDeviceMetadata($id: ID!) {
user(id: $id) {
id
... on Customer {
deviceMetadata {
devicePlatform
id
ipAddress
lastSeen
location {
city
country
countryCode
stateCode
__typename
}
os
osVersion
userAgent
__typename
}
__typename
}
__typename
}
}
```
### Variables
```JSON
{"id":"24820449367569"} //user id
```
### Returned Data
The returned data contains all the items shown next to tickets, so you can export City, Country, State, IP, OS and much more.
```JSON
{
"data": {
"user": {
"id": "24820449367569",
"deviceMetadata": {
"devicePlatform": "Macintosh",
"id": "66388e17dde783733a88950c",
"ipAddress": "42.42.42.42",
"lastSeen": "2024-05-06T08:00:44.350Z",
"location": {
"city": "Antwerp",
"country": "Belgium",
"countryCode": "BE",
"stateCode": "VLG",
"__typename": "DeviceMetadataLocation"
},
"os": "macOS",
"osVersion": "14.4.1",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"__typename": "DeviceMetadata"
},
"__typename": "Customer"
}
},
"extensions": {
"depth": 4,
"potentialNodeCount": 3
}
}
```
## How would you use this?
One way to use this is by leveraging an external tool like Zapier or Made, or your own scripts and setup a webhook listener. Each time a messaging ticket created, use a Zendesk trigger to send the `{{ticket.requester.id}}` to your webhook listener.
Once triggers, your external tool can call this API and pull in the users' metadata and store it in a log, BigQuery, Google Sheet or whatever suits your needs to log data.
By sending both the `{{ticket.id}}` and `{{ticket.requester.id}}` in your webhook trigger, you can even map both those elements in your log for more data.
# Conclusion
It's nice to see that Zendesk makes these kinds of information available as both a native feature in the Agent Workspace, as well as available over API for developers and data managers. This way you can leverage these new features immediately, while also integrating them deeper in your flows.
From a feature set I'd love to see these values being made available in triggers and bot flows though. "A customer that complains about your app not working running a version of the operating system that's too old" might be handled via a custom bot answer by setting up a condition "if OS Version < 16", show bot message "This version if your system is not supported, please update!"
### Handling multiple support addresses in a support email
URL: https://internalnote.com/multiple-recipients/
Last updated: 2025-09-08T06:41:17.000Z
You might recognize this scenario: a customer contacts your support team and adds support@company.com, sales@company.com and finance@company.com all in cc on the same email.

This email arrives in Zendesk and only one tickets gets created, and the fact that two other support addresses were part of the same email is invisible for your agents.

Only the first support email address shows up
# How to fix this
One easy way to find out if an email has been send to multiple support addresses, is by opening a ticket and going to the *View Original Email* option. This however is not the most discoverable way, and you need to be actively looking for such emails.

## A better solution
A better method would be to somehow detect multiple support addresses in cc, and then clone the ticket for each of these addresses. That would create duplicate emails, but each email would be routed and handled as it if were emailed solely to that specific support address and assigned to the correct group.
The confusion that may come from those duplicated tickets is solved by those tickets showing up in the customers' *Interaction history* in the context panel, or would be picked up by the *Merge suggestions* of Zendesk Advanced AI.

# Flow
To build this flow we're going to need a Cloudflare Worker, or a platform like [Make.com](https://make.com/?ref=internalnote.com), Zapier or similar.
😫
I tried to make this flow with [make.com](https://make.com/?ref=internalnote.com) to do it as low code. Failed miserably because I'm just not familiar with those abstractions and faster in plain javascript code. If anyone knows how to loop through an array, let me know!
To make this flow work we need a few elements which we can all grab via the Zendesk API.
- If you want to detect all the support addresses in cc on an email ticket we can use the Audit Log (Events) of a ticket.
- To know if an address is a support address registered in Zendesk or a regular end-user, we need a list of all support addresses in the instance
- And we need a copy of the original Zendesk ticket in order to clone it.
Once we have these elements, we can use them in a flow like the one in the diagram below:

# Setup
## Webhook
Once you've created your Worker (see below) or other webhook endpoint we need to add a Webhook to Zendesk. Note that we need to pass the `ticket.id` to the worker, so make sure the request method is a POST.

## Trigger
Next, create a trigger that fires when a ticket is created, and only for the Email channel. This prevents unnecessary calls to our worker since only email tickets can contain those multiple support addresses.
In the actions, select the *Notify by | Active Webhook | Multiple recipients* web hook we just created and pass the following payload
```json
{"ticket": "{{ticket.id}}"}
```



💡
I opted to pass only the ticket id in this step, and retrieve all ticket info via API in the worker. You could pass the subject, description e.a. in this step too, but by retrieving it over API in the worker itself our trigger is easier to set up.
## Worker
All code for this flow is available on GitHub. You can fork the repository, and use the *Deploy to Cloudflare* button to create your own version of this script **for free**.
[GitHub - verschoren/multiple\_recipientsContribute to verschoren/multiple\_recipients development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/multiple%5Frecipients?ref=internalnote.com)
One you've deployed the script successfully there's two things you need to change on the Cloudflare Worker variable page:

- Replace the **SUBDOMAIN** with your own Zendesk subdomain
- Add a **TOKEN**, make it a secret, and use a base64 encoded string of `admin@domain.com/token:zendesktoken` where `zendesktoken` is an actual token taken from the Zendesk admin center, and `admin@domain.com` is a real admin in your instance.
# Code deep dive
## Get Data
The first step in our code is grabbing the POST payload from our trigger:
```javascript
var payload = await request.json();
const ticket_id = payload.ticket ? payload.ticket : "";
```
Next we have three functions to grab the ticket info, ticket audit log and support email addresses.
### Get ticket info
```javascript
async function getTicket(ticket_id, subdomain, headers) {
const init = {
method: "GET",
headers
};
const result = await fetch("https://subdomain.zendesk.com/api/v2/tickets/42.json", init);
let json = await result.json();
return json.ticket;
}
```
This function calls the Zendesk API and returns a JSON element with all ticket information:
```json
{
"ticket": {
"id": "42",
"subject":"What happens at 88mph?",
"description":"We're going back in time"
"requester_id":"123456789",
"recipient":"support@domain.com",
//...
}
}
```
### Get audit log
```javascript
async function getAudit(ticket_id, subdomain, headers) {
const init = {
method: "GET",
headers
};
const result = await fetch("https://subdomain.zendesk.com/api/v2/tickets/42/audits", init);
let json = await result.json();
let audits = json.audits;
for (const audit of audits) {
if (audit.via.channel == 'email'){
var recipients = audit.via.source.from.original_recipients;
return recipients;
}
}
}
```
This API returns the audit log of our ticket, which conveniently contains a list of `original_recipients` under the via|email channel key:
```json
{
"audits": [
{
"ticket_id": 1841,
"via": {
"channel": "email",
"source": {
"from": {
"address": "m.mcfly@example.com",
"name": "Marty McFly",
"original_recipients": [
"note@internalnote.com",
"support@internalnote.com",
"support@verschoren.com",
]
},
}
}
//....
}
]
}
```
### Get support addresses
The final step in our preparation is getting all the support addresses via the API. We parse the returned JSON and create a list of all support addresses in the instance called `support_emails`
```javascript
async function getSupportAddress(subdomain, headers) {
const init = {
method: "GET",
headers
};
const result = await fetch("https://subdomain.zendesk.com/api/v2/recipient_addresses", init);
let json = await result.json();
var support_emails = [];
for (const element of json.recipient_addresses) {
support_emails.push(element.email);
}
return support_emails;
}
```
## Compare
Now that we have our required data, we can start processing the ticket to check if we need to create duplicates for additional support addresses in the original email.
```javascript
for (const recipient of recipients) {
//run check
}
```
### Filter out current recipient
First check we want to do is filter out the support address that was used for the ticket that **did** get created. Since this email address got accepted by Zendesk, it's no use making another copy!
```javascript
if (ticket.recipient == recipient) {
console.log(`Skipped. Existing ticket for ${recipient}`);
}
```
### Check if support email
Secondly we want to filter out any email that isn't a support address. The customers could've cc'd a friend, spouse or colleague and those should not trigger a duplicate ticket.
```javascript
else if (!support_emails.includes(recipient)) {
console.log(`Skipped. ${recipient} is not a support email.`);
}
```
And finally, if the ticket is a support email and isn't the original recipient, we want to create a ticket!
```javascript
else {
var new_ticket = await createTicket(ticket, recipient, ticket_id, subdomain, headers);
}
```
## Create ticket
Since this is an email ticket we only care about the subject, description and requester. Email cannot set ticket fields or other metadata, so we don't need to pass these along.
💡
I did not add attachments to these duplicate tickets. Since Zendesk charges for data these days I opted to just reference the original ticket so you can look at any attachments in that ticket.
First step is to define our ticket.
- Note we used a via.channel "mail" element to make sure the duplicate ticket is also processed as an email ticket!
- The recipient value is the support addresses that passed our filters in the previous steps.
```javascript
var payload = {
"ticket": {
"subject": ticket.subject,
"comment": {
"html_body": `Split from ticket #${ticket_id} ${ticket.description}`
},
"recipient": recipient,
"requester_id": ticket.requester_id,
"via": {
"channel": "mail"
}
}
};
```
Once we have our payload, we can POST it to Zendesk via the API as such:
```javascript
async function createTicket(ticket, recipient, ticket_id, subdomain, headers) {
const init = {
method: "POST",
headers,
body: JSON.stringify(payload)
};
const result = await fetch("https://" + subdomain + ".zendesk.com/api/v2/tickets.json", init);
var json = await result.json();
return json.audit.ticket_id;
}
```
# Conclusion
If all goes well, when we have an email that gets sent to multiple recipients, we'll see duplicates of the ticket show up after our trigger and worker runs successfully.

And each ticket contains the content of the original ticket but is created with another support address as the recipient. And each ticket has a reference to the original ticket as part of the description.

### Zendesk Roundup for June 2024
URL: https://internalnote.com/roundup-2024-06/
Last updated: 2024-11-03T10:54:45.000Z
Here comes the sun ☀️... we're wrapping up spring and preparing for summer.
This months' Zendesk releases were a bit scattered across the entire platform. On one end you've got major improvements on the bot builder with new capabilities that require developers and custom code to work. On the other side you've got a dozen small tweaks and improvements to the platform that make agents’ lifes easier without any effort. So lots of new stuff to discover and implement!
Zendesk itself is also ramping up their marketing and awareness efforts for their new AI announcements.
> Businesses have spent the last year and a half rushing to include AI in their products and their workflows. It seems like consumers are both tired of hearing about it yet hungry for more. That’s because despite indications of fatigue, people are seeing AI bring in real results. We know this to be true in the realm of customer service, but we’re also seeing these results in internal tools used by IT and HR teams.
This quote from a Zendesk-written [Forbes](https://www.forbes.com/sites/zendesk/2024/04/23/smart-ai-strategies-for-hr-and-it-service-teams/?sh=7b5a6f5c7ef0&es%5Fid=43d448bfa1&ref=internalnote.com) article sums it up nicely. We keep hearing and seeing new AI announcements on a daily basis, and some of them, like the announcements from OpenAI and [Microsoft](https://www.theverge.com/2024/5/20/24160711/microsoft-surface-event-ai-windows-biggest-announcements?ref=internalnote.com) this last month, are genuine useful things. (Would love to have something like their Recall feature on my Mac)
Let's dive in!
# 🏢 Company
## Zendesk EX Trends 2024
First off the bat is a new [Employee Experience trend report](https://www.zendesk.com/blog/employee-experience-trends-report/?ref=internalnote.com) by Zendesk. It highlights three trends that are, to be honest, kinda obvious. But it's always nice to see them summed up in one document, if only because they can serve as a nice framework for positioning Zendesk for your customers or within your own company.
**Trend 1: More teams are leveraging AI**
I think it's no secret that *everyone* uses AI in some way 😅. Main question should not be 'do you use it' but more 'how do you use it to improve quality'. I still think many companies see it as a shortcut to do more, instead of a tool to do better.
**Trend 2: Adaptability is top of mind**
The second trend focusses on handling a healthy work-life balance (where live should always be bigger than work imo), and how good employee tools can help with building a cohesive team, smooth escalation paths and a nice work environment, while also making sure work can be done anywhere or anytime without disrupting life.
**Trend 3: the greatest EX is built on data**
The third pillar is about data . Just as with customer experiences, the more you know and measure, the better you can detect pain points and improve things.
The EX trends report feels a lot shorter than the similar [CX report](https://internalnote.com/zendesk-cxtrends-2024/) they releases earlier this year. But I do think a lot of similarities apply. Regardless of being customer of employee: trust, transparency, efficiency and being where the customer/employee is are core to both experiences.
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🎉 New Releases
## 🤖 AI Agents
### New Generative AI model
> This month, in the wake of exciting developments announced at the recent OpenAI spring 2024 event, Zendesk is rolling out the new GPT-4o model to all of our [Zendesk AI](https://www.zendesk.com/service/ai/?ref=internalnote.com) customers. In fact, we were able to test and rollout GPT-4o for production Generative AI use cases within 24 hours due to our advanced Large Language Models (LLM) benchmarking and our flexible deployment model. This will improve performance and speed for bots, agents and admins at the same level of quality.
Earlier this month OpenAI held an event where they launched their new GPT-4o model, a quicker, more efficient version of their latest model. Zendesk was quick in [letting us know](https://www.zendesk.com/newsroom/articles/gpt-4o/?es%5Fid=ee718f4280&ref=internalnote.com) their generative features already run on the new 4o model for **all** of their customers.
Nothing earth shattering since the generate features in Zendesk aren't really customizable, but nice to know the bot (and advanced AI agent features) will now work faster than before.
### Variables in custom answers
> Present options: API support: API data can now be used to dynamically populate the present options step. Previously the step could only be configured manually with static data.
>
> Carousel step selection UI: The step selection UI has been improved to make the choice between dynamically and manually configured steps clearer and consistent with other UI.
When I wrote [my comparison](https://internalnote.com/zendesk-acquires-ultimate/#bot-builder) between Ultimate and Zendesk in March one of the things I noted as a difference between the two was the way *variables* in the bot were handled. It used to be that Zendesk could only set and get variables if based on custom fields, but now Zendesk's Bot too can set and get variables across flows.
This means you can ask the customer for an order number in one flow and get the current order status and tracking id in another flow, while only asking the customer for that order number once.
And if the customer later on needs info on tracking the order status, we can grab the tracking id and show them a tracking url button all without asking the customer for that same context ever again.
Similarly, when an API call now returns a list of elements (orders, products, locations..) we can now choose to generate a set of buttons or a carousel that gets dynamically populated with the data returned from that API.
Check out the article below to get the details!
[Expanded support for variables in the Zendesk BotZendesk recently added variables, dynamic options and carousels to their Bot Builder. No better way to showcase these new capabilities than building a bot powered by the Avengers!Internal NoteThomas Verschoren](https://internalnote.com/expanded-bot-variables/)
### Conversation Extensions in Messaging
Aside from handling variables and showing dynamic carousels and buttons, one other major feature got quietly enabled this month. The Zendesk Messaging widget now supports [conversation extensions](https://support.zendesk.com/hc/en-us/articles/7178267525658-Announcing-Conversation-Extensions-in-Messaging?ref=internalnote.com).
> Starting today, Conversation Extensions are available across Messaging channels on the web, iOS, and Android. These extensions enhance user interactions by enabling functionalities that go beyond basic Q&A exchanges.
What are they? They're a way to embed complex flows within a bot conversation as a separate UI, and handle the output of those flows within the conversation. This used to be a features exclusive for Sunshine Conversation flows, but has now been made available to Zendesk Messaging users too!

So, what can you do with this?
If you're a restaurant you might have a customer that wants to book a table (or change a booking). Instead of detecting the intent and pointing the customer to your website, you can now show your booking website right within the web widget.
The customer can find a location, choose a time and enter their contact information right from that flow. Once completed, the website can return specific information to the conversation, and the bot takes over again with a "thanks for booking, excited to see you tomorrow at 8PM!".
💡
Building out these flows requires some custom code and callbacks on your website. If you're interested in this, be sure to[ subscribe to the blog](https://internalnote.com/#/portal/signup), I've go an article planned on this topic!
### Relay App for bulk WhatsApp and SMS messaging
Relay, a new app from Zendesk available on the marketplace, was previewed at Relate as part of their Labs initiative. Labs is an internal test project to build and bootstrap technology before it becomes widely available within Zendesk. Examples are for example the [Conversational Commerce](https://internalnote.com/relate-2023/#sunshine-platform) announced at last year's Relate, and now Relay.
The app allows you to (bulk) send WhatsApp and SMS messages from within Zendesk to customers using message templates. It's fairly similar to existing marketplace apps from Partners while also being more limited at the same time. There's no API or upload capability, so you need to leverage end-user search via e.g. tags to select your recipients.
Underlying it uses the same Sunshine Conversations APIs that you can use to build your [own custom integration](https://internalnote.com/sunshine-conversation-automations/) to send out WhatsApp messages.

# 👨🏻💻 Agent Workspace
### Automatically release agent capacity for messaging conversations
> Admins can enhance agent productivity by automatically releasing their capacity when their messaging conversations become inactive, allowing them to accept more incoming customer support requests.
You can now [automatically update](https://support.zendesk.com/hc/en-us/articles/7043034053658-Automatically-releasing-agent-capacity-for-messaging-conversations?ref=internalnote.com) inactive messaging conversations to put them on pending and remove them from an agents' list, freeing them up to accept new conversations. There's settings to set the timeout (default is 10 minutes) and you can choose to set those conversations to pending or solved.

It's a nice feature addition, but similar to how [queues](https://internalnote.com/beyond-triggers-moving-to-queue-based-assignment-in-zendesk/) moved some functionality that's always been a part of triggers to a dedicated settings in the Admin Center, this also feels like something we all used to do with automations being moved towards a dedicated setting page.
I really wonder if this is a new approach: moving something that's possible to do with existing automations and triggers, and turning it into a custom UI with customizable options and checkboxes. It surely lowers the complexity for new Zendesk users and makes the platforms' capabilities a lot more discoverable. But I'm waiting for the other shoe to drop: will we see these capabilities be removed from triggers and automations?
### New Explore reporting for queues and AI
In my article on [queues](https://internalnote.com/beyond-triggers-moving-to-queue-based-assignment-in-zendesk/#conclusion) I wrote the following:
> There's a few things I would love to see though. A native way to view queued tickets **by queue** would be a nice starter for example.
It seems the product teams at Zendesk has the same idea, cause they added a new [dashboard](https://support.zendesk.com/hc/en-us/articles/7217364401306-Announcing-live-omnichannel-queues-reporting-in-Explore?ref=internalnote.com) to Explore that almost does that (but only for Suite Enterprise Users)

> This new table component allows you to create a dashboard that displays live data on how work is being routed through your custom queues. This gives you an instant overview of your queues, helping you understand the volume of work awaiting available agents and the average time work items spend in each queue.
And while we're talking about reporting, there's also a new [dashboard](https://support.zendesk.com/hc/en-us/articles/7231054373146-Announcing-the-Explore-dataset-and-prebuilt-dashboard-for-generative-AI-agent-tools?ref=internalnote.com) that gives insight in how agents are using the Advanced AI features in the Agent Workspace.

> The Generative AI agent tools dataset and its associated prebuilt dashboard let admins drill into agent utilization of these generative tools and correlate the impact of these tools on common metrics such as resolution time, CSAT, requester wait time, and more.
### Search Suggestions and filters
Last month we saw a first update to the search field in Agent Workspace with the addition of recent search elements. This month the field got another feature addition with the ability to filter content and suggested results.

> When agents open the search menu in Support, they'll now see content record type filters at the top of the menu. As agents begin entering a search term or applying any of the filters, suggested results appear. Agents can navigate directly to these results by clicking them within the search menu.
### Dark Mode for the Mobile Apps
The Zendesk mobile app now supports dark mode. You can choose to always set it to dark, or have it manually switch to dark mode when your device does so.

## 🧱 Open and Flexible Platform
### Conditional statements for deletion schedules
If you've bought the Advanced Data Privacy and Protection add-on for your instance, you're in luck. You can now add [multiple deletion schedules](https://support.zendesk.com/hc/en-us/articles/7269915365146-Announcing-new-conditional-statements-for-deletion-schedules-ADPP-add-on?ref=internalnote.com) to your Admin Center, each with custom conditions such as brand, organization, tags, and custom fields. This means you can delete your support tickets after two years, but retain those from VIP customers for three years. And Finance tickets are deleted after five years, but only those not tagged as "Legally required to keep!"
### Updated ticket Tags UI

Someone remembered that the Tags page on the Admin Center was a thing 😅
## ⏰ Major Changes
### Enablement of Custom Statuses
Zendesk will [auto-enable](https://support.zendesk.com/hc/en-us/articles/7193972071834-Announcing-automatic-activation-of-custom-ticket-statuses?ref=internalnote.com) custom ticket statuses for all instances. if you haven't used them before nothing will really change for your agents, but you'll be able to add them without enabling the feature first.
You can find out more on what's possible with those statuses [in these articles](https://support.zendesk.com/hc/en-us/articles/7193972071834-Announcing-automatic-activation-of-custom-ticket-statuses?ref=internalnote.com).
### Announcing ticket conversation improvements

> The [Zendesk Agent Workspace](https://support.zendesk.com/hc/en-us/articles/7006036974234-Announcing-ticket-conversation-improvements-default-experience-coming-soon?ref=internalnote.com) is modernizing the look and feel of the ticket conversation interface to help agents quickly absorb and parse information in a ticket. As part of this release, you’ll see a new and improved look and feel.
Starting this summer all Zendesk instances will get the above UI for conversations enabled. Instead of conversations being long blocks of text with repeated UI across replies, the new UI will compress replies into chat bubbles and will remove the customers' name above replies if they send multiple messages in a row. This will make conversations easier to read and aligns the interface more with messaging (chat) conversations.
It looks a bit weird when reading long emails though: I'd rather have a white background for those, especially since most marketing emails with graphics often have hardcoded background colors on images.

# 💡Insights
## Webinar on AI Agents
Earlier this month I was part of a webinar together with Zendesk, Premium Plus and Ultimate about AI Agents. If you're interesting in seeing a full demo of Ultimate, take a look at the recap below.
[Mastering AI for CX | Premium PlusHow to Power Your Support Teams with AI On Demand Webinar Register Now Join us for our webinar co-hosted along with Ultimate and Zendesk. This session will delve into how AI and automation are defining the next era of customer support. Discover how integrating these technologies can streamline your operations,…Premium Plus](https://premiumplus.io/mastering-ai-for-cx/?ref=internalnote.com)
## Queueing
This next one might seem a a bit out of left field, but this article gives some pretty nice visual insights on how multiple queue approaches work going from fifo (what we do in Zendesk if we don't tweak any settings), to priority queuing (omnichannel queues or SLAs) to active queue management (dropping inactive conversations, manual assignment, team leader assignment,..)
Interesting read for sure!
[Queueing – An interactive study of queueing strategies – Encore BlogIn this blog, we go on an interactive journey to understand common queueing strategies for handling HTTP requests.EncoreSam Rose](https://encore.dev/blog/queueing?ref=internalnote.com)
# 📝 Articles this month
[Automatically deflect Zendesk spam tickets via triggers and webhooksFrom time to time spammers use open API endpoint in Zendesk to flood your inbox with tickets. This article shows an efficient and automatic way to deflect these tickets.Internal NoteThomas Verschoren](https://internalnote.com/automatically-deflect-zendesk-spam-tickets-via-triggers-and-web-hooks/)
[Zendesk Roundup for May 2024Subscribe to a hand-picked round-up of the best Zendesk links every month. Curated by Thomas Verschoren and published every month. Free.Internal NoteThomas Verschoren](https://internalnote.com/roundup-2024-05/)
[My approach to Zendesk TriggersThis article offers a deep-dive on how to structure and sort your Zendesk triggers starting from the concept of “one trigger does one job”Internal NoteThomas Verschoren](https://internalnote.com/my-approach-to-zendesk-triggers/)
[Road to AutomationLast months’ Relate event was all about Zendesk AI and how it can help you improve your CX or EX experiences. One of the key points notes not only in the main keynote, but also in sessions during the event was the concept of automation and automation rates for your tickets.Internal NoteThomas Verschoren](https://internalnote.com/road-to-automation/)
[Expanded support for variables in the Zendesk BotZendesk recently added variables, dynamic options and carousels to their Bot Builder. No better way to showcase these new capabilities than building a bot powered by the Avengers!Internal NoteThomas Verschoren](https://internalnote.com/expanded-bot-variables/)
# And Finally...
> How can I identify the tickets from which my trigger ran?
To see the tickets on which a particular trigger has been executed, use this URL: `https://subdomain.zendesk.com/rules/trigger_id/tickets`. In the URL, replace `subdomain` with your Zendesk subdomain and `trigger_id` with the specific number ID that appears at the end of your actual trigger URL.
[How can I identify the tickets a trigger acted on?Question How do I list tickets where a trigger was used? Answer To see the tickets on which a particular trigger has been executed, use this URL: https://yoursubdomain.zendesk.com/rules/trigger\_id/…Zendesk help](https://support.zendesk.com/hc/en-us/articles/7052410824730-How-can-I-identify-the-tickets-from-which-my-trigger-ran?ref=internalnote.com)
### Expanded support for variables in the Zendesk Bot
URL: https://internalnote.com/expanded-bot-variables/
Last updated: 2024-11-03T10:54:56.000Z
These last few months we've seen the Zendesk Bot evolve from a basic flow builder towards a fully capable conversational bot that can integrate with external APIs, show complex flows and dynamically generate carousels and buttons for customers.
When I wrote my tutorial on a, then, [full-featured Zendesk Bot](https://internalnote.com/flow-builder-dinosaurs/), and consequently wrote about the new [Dynamic Conversation](https://internalnote.com/dynamic-conversation-experiences/) experiences and [Answers Linking](https://internalnote.com/answer-linking-for-the-zendesk-bot/) one of the things that popped up was a lack of variable support in the Zendesk Bot.
To give an example: image you're setting up a support bot for a company that has both laptops and mobile phones. When you have answer flows for reinstalling the device, warranty policy and feature tutorials, you need to start each flow with "What device are you using" to make sure you can give the right response.
In an ideal world when a customer talks to your AI Agent, if they tell them "I use a mobile phone" once, that information should be context for every subsequent interaction in that conversation.
Long story short: Zendesk *just* introduced that capability in Zendesk with their new *Set Variable* step, while also introducing session variables that live across answers for the duration of a conversation with your bot.
# What's New
These last few weeks Zendesk introduced three major capabilities to the Zendesk Bot:
## Set Variables
A new step type was introduced '*Set Variable*' which allows you to store a piece of data and reuse it across steps and answers.
Additionally, all variables in your answers flows, both those created in Set Variable as those gotten from API calls,Carousels or Option Lists are now accessible in all other subsequent answers used in the conversation.
[Announcing answer linking enhancements and passing variables to tagsAnnounced on Rollout starts Rollout ends April 24, 2024 April 22, 2024 May 3, 2024 In line with our ongoing investment in improving how variables can power automation for our customers, we’re…Zendesk help](https://support.zendesk.com/hc/en-us/articles/7144411709082-Announcing-answer-linking-enhancements-and-passing-variables-to-tags?ref=internalnote.com)
## Dynamic values in Present Options
When Zendesk introduced their Dynamic Conversation experience late last year, one of the nice additions was the ability to generate carousels based on API data. I used it to generate a carousel of movies in my [demo](https://internalnote.com/dynamic-conversation-experiences/) for example.
One weird omission, now fixed, was the ability to generate a list of options (buttons) based on API data. That is now possible with the addition of Dynamic values for both the carousel and now options too.

## Transfer values
And the values of variables can now be passed as *tags* or *custom field* values when a conversation is transferred to an agent.

# Let's make this real
So, how better to test out these new features then by creating a fun new Bot flow!
In this new Answer we'll do the following:
1. Get a list of Marvel superhero's from an API
2. Show a dynamic list of options based on the API data with super heroes.
3. If a customer picks a hero we'll store their `chosen_hero` and show more data about the character.

1. We'll then offer the option to show movies that feature that character, and if the answer is yes, we'll link to a new answer flow.
2. Leveraging the `chosen_hero` variable we can conditionally show only those movies featuring that character.
3. And finally we show an option to show all superhero movies. This will reset the variable and reuse the same movies answer to show all hero movies.

You can test the flow via the Messaging button bottom right!
# How did I build this?
## Characters
### Create a new bot answer
All new flows start with the creation of a new answer for your bot. I decided to call this one Marvel characters and started with a short intro via a *Bot Message.*


### Get all characters
In order to present options to the user we need to gather a list of Marvel characters from our API.
The API is hosted at `https://marvel.internalnote.com/characters` and returns an array of `characters` when a `GET` request is made.
```json
{
"characters": [
{
"name": "Spider-Man",
"realName": "Peter Parker",
"weapon": "Web-shooters",
"description": "Bitten by a radioactive spider, Peter Parker gained superhuman strength, agility, and the ability to cling to walls. As Spider-Man, he uses his powers to protect New York City and uphold his mantra: 'With great power comes great responsibility.'",
"image": "https://marvel.internalnote.com/avatar_spiderman.jpeg"
},
...
]
}
```
First thing to add to our flow is a *Make API call* step with the following configuration:

The API call configuration steps
- Name: Set Characters
- Request Method: GET
- Endpoint URL: [https://marvel.internalnote.com/characters](https://marvel.internalnote.com/characters?ref=internalnote.com)
Once added, you can do a test run and it will return an array of `characters`. Click save next to the object, and store the different values as variables.
When you have configured your flow, it will look like the screenshot below. Be sure to handle the API call failed scenario by adding some kind of error message.

Flow with our API call and error message added
### Show dynamic Options and store variable
Now that we have our array of `characters` from the *Make API Call* step, it's time to use the new dynamic *Present options* step to show a list of buttons to our users.

1. Add a *Present options* step and choose the Dynamic configuration
2. Select our `characters` array and add a Bot Message.
3. For the Option text choose the `characters.name` value. This is what will be shown in the button.
4. For the variable we will create a new variable `chosen_hero` and assign it the same `characters.name` value.
💡
If you set the variable name to an existing value used earlier this step will update that variables' value with the selected option. If the variable didn't exist yet, this will create a variable with that name, and set the value.
To wrap up this step, we should add a confirmation message via the S*end Message* step and let the user know they correctly selected our `chosen_hero`. You can do this via the {+} button in the text field.

### Get Character Details
So far we've gathered a list of super heroes from our API, shown them to the user as a list of options, and stored the chosen character in a `chosen_hero` variable.
In this step we're going to make a second API call to our API to gather more details about our hero and shown them to the user.
The API is hosted at `https://marvel.internalnote.com/characters` and returns character details when a `POST` request is made.
**The payload**
```json
{"name":"Thor"}
```
**The returned data**
```json
{
"name": "Thor",
"realName": "Thor Odinson",
"weapon": "Mjolnir (hammer)",
"description": "Thor, the Norse God of Thunder, wields the enchanted hammer Mjolnir, which grants him the power to control lightning and fly. As a founding member of the Avengers, he defends both Asgard and Earth from cosmic threats.",
"image": "https://marvel.internalnote.com/avatar_thor.png"
}
```
To set this up, add a *Make API call* step below our message step.
- Name: Get details
- Request Method: POST
- Endpoint URL: `https://marvel.internalnote.com/characters`
- Body: {"name":"`chosen_hero`"} (add the variable via the {+} button)

The steps to show character details
Next, enter a hero's name to run the test (e.g. Captain America) and save all the returned variables by clicking the Save button next to each.
### Show Details
To wrap up this step, we're adding another `Send Message` step that will use the variables we saved in the last step to show a nice overview of our hero
- Click on the image icon in the bot message, and select the `image` variable you just created
- Set the text field of the message to the `description` variable.

If all went well, when you test this flow it should show a list of heroes, allow you to select one, and show a detailed info card of your hero!

## Movies
In the first part of this tutorial we gathered a list of super heroes and allowed user to pick a hero and show details of that hero.
In this next step we're going to do the same, but instead of gathering hero information, we're going to show a list of super hero movies.
### Clone Characters Answer
We can reuse almost all of the steps of the previous API flow so it's easiest to clone our Character answer flow and rename it.
This feature was enabled a while back in the bot builder and makes building similar flows that much faster!



### Get all movies
To gather all movies we're modifying the *Make API call* step as follows:

- Update the API Endpoint URL to [https://marvel.internalnote.com/](https://marvel.internalnote.com/characters?ref=internalnote.com)`movies`
- Remove the variables at the bottom (we need to create new ones since the API changed)
- Run a new test and store the results in a `movies` variable, and make sure to save the `name` and `poster` values. (This is similar to the steps taken for the characters in part 1 of this tutorial.)
For reference, the API returns the following data
```json
{
"movies": [
{
"name": "Spider-Man: Homecoming",
"year": 2017,
"characters": ["Spider-Man"],
"summary": "Peter Parker balances high school life with his superhero alter-ego Spider-Man, facing the Vulture and trying to prove himself to Tony Stark. This coming-of-age story marks Spider-Man's integration into the Marvel Cinematic Universe.",
"poster": "https://marvel.internalnote.com/poster_spiderman.jpeg"
},
...
]
}
```
### Display all movies
To display all the movies we're going to use a *Carousel* instead of a list of *Options.*

1. Under the *API call successful* step, remove the existing *Present Options* step and all underlying steps.
2. Add a *Present Carousel* step, and choose the Dynamic type
3. Select our `movies` variable and fill in our carousel variables
1. Title: `movie.name` variable (use the {+} button)
2. Description: `movie.summary`
3. Image link: `movie.poster`
4. Add a final *Post Message* step to wrap up the conversation.

If done well, you'll end up with a flow similar to this:
## Make use of the variables
Almost there!
Our new Movies answer correctly shows all available movies in our API. But in our Characters flow we ended with our user choosing a single super hero. It would be nice if we could show only movies starring our hero without the need to create multiple answers. This way we can trigger a single *Movies* answer in our bot, but have it dynamically show either all movies, or only a filtered set of movies.
### Insert a conditional flow
To accomplish this we need to add a *Branch by Condition* step at the top of our Movies answer.
1. Hover just below the first step of our Answer and click the + button
2. Choose a *Branch by Condition* step
3. In the *If this* brand we're going to add two conditions separated by an **OR**
1. Variable `chosen_hero` is (leave blank)
2. Variable `chosen_hero` is *all*.
4. Give your brand a name 'No character chosen' and save this step.

You'll notice that all the steps we did in the previous step are now under the *No Character Picked* branch, and we have a blank *Else* branch on the right.
💡
We will use the **all* variable value from our conditions in a later step.
### Show a single movie
In the *Else* branch we want to create a similar flow as we did earlier, but instead of showing all movies in our API, we're going to call a different API endpoint that returns movies for a specific super hero.
The API is hosted at `https://marvel.internalnote.com/character-movies` and returns character details when a `POST` request is made with payload `{"name":"Thor"}`
The returned data is a similar array of movies as in the previous step, only filtered to only show these of our hero.
To set this up, add a *Make API call* step below our message step.
- Name: Get details
- Request Method: POST
- Endpoint URL: `https://marvel.internalnote.com/character-movies`
- Body: {"name":"`chosen_hero`"} (add the variable via the {+} button)
💡
You might wonder where the `chosen_hero` value comes from since we haven't used it in the Movies flow at all. However, if a customer first hits the Character flow, and we then connect them to our Movies flow, this value is set with the name of their favorite hero, thus making the conditional branch choose the **else* flow.
The steps here are almost identical to those of all previous API calls.

1. We store the returned array in a new variable `charactermovies`.
2. We give the values within that array logical names
3. We create a new *Carousel* with dynamic data, taken from the `charactermovies` step.
4. And we add a nice error *Message* in the *API Call Failed branch.*

## Return all movies
To wrap up our Movies flow we want to give users the opportunity to discover all movies once they've seen the movies of their hero.
To accomplish this we're going to use the new *Set Variable* step.
1. Add a *Show Options* step at the end of our Character Movie branch.
2. Ask the customer if they 'want to watch more movies', and give them a *Yes* and *No* option.
3. In the *Yes* branch, add a *Set Variable* step, and set the value of our `chosen_hero` to *`all.`*
4. Next, add a *Link Answer* step, and choose the same *Movies* answer as we're currently working on.

What happens now is that, when a customer says 'Yes I want to discover all movies', we set the variable `chosen_hero` to `all` and start our flow from the top via the linked answer. This time, instead of chasing the *else* branch, we've met the conditions for our primary branch due to the new value of `chosen_hero` .
❌
Using **all* is a bit of a hack. The **Set Variable* step doesn't accept blank fields, and there's no **delete variable value* step, so this is the best I could come up with.
## Link character to movie
And now, finally, we can link our two answer flows for characters and movies together.
Ad the end of our Characters answer, after the message with the characters' description, add a *Show Options* step that asks the user if they want to checkout movies starring this character.

In the *Yes* branch, add a *Link to another answer* step, and select the Movies Answer.

Et voila. You've got two interconnection flows with all the new Bot Builder goodies enabled!

# Conclusion
The above flow is build a bit tongue in cheek by referencing Marvel Movies and super heroes, but in all seriousness, the ability to share a variable across your flows will make a lot of complex answer flows now possible.
If only for the ability to ask list orders for a customer, have customer pick one and store that value inside a ticket field. That alone is a major change that makes ticket escalation so much more powerful.
When building the above flows I was surprised to how close the Zendesk Answer editor comes to the one that Ultimate.ai offers. Having variables live within a conversation and shareable across answer flows brings Zendesk this much closer to their recently purchased bot solution.
The only major difference, putting custom AI models aside, I see for now is Ultimate's ability to link answer steps within the same flow. So here's hoping this feature gets migrated soon!

Example how two options link to the same Finance escalation path
### Road to Automation
URL: https://internalnote.com/road-to-automation/
Last updated: 2024-11-03T10:55:05.000Z
Last months' Relate event was all about Zendesk AI and how it can help you improve your CX or EX experiences.
One of the key points notes not only in the main keynote, but also in sessions during the event was the concept of automation and automation rates for your tickets.
What are automation rates? And how does automation relate to tickets? Let's dive in.
# Ticket Automation
When we talk about ticket automation it basically means we take the human agent out of the equation, and let AI take over. The goal is to reduce as much manual labor from agents as possible so that the few actions that do require human attention are those that require expertise, emotion and those unique skills that make humans, by lack of a better word, *human*.
So, what does ticket automation entail? There's a few ways we can automate tickets and reduce an agents workload.
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
## Self Service
One key way to prevent tickets from reaching agents is by implementing some sort of self service solution. This could be a "read this first" shown before a customer can create a ticket. It can be an email send in reply to a customers inquiry that lists relevant tickets and a way to automatically resolve the issue if the articles apply.
Or you can have a bot that intercept customer conversations and replies with relevant articles or generated responses. However you decide to implement it, any tool that offers an automatic way to show relevant content to answer a customers' question will lower your agents' workload.
[Learn how to build a full-featured Flow Builder Bot for Zendesk.In this article we will build a full-featured Flow Builder Bot for Zendesk. We’ll use every step type, use API calls and variables and show you how to create a bot yourself in a full length video tutorial.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-dinosaurs/)
## Routing
With most the "easy" questions answered by a self-service solution, what's left for agents are questions that a Help Center can't intercept. This results in an inbox of tickets that warrant an agents' attention.
By leveraging intent detection (or categorization), by asking the customer "what is this ticket about" before submitting their question, or by triaging based on channel, category or *to:* email addresses, we can route tickets to the right team or agent.
Questions about refunds, invoices and payments should be routed to the finance team. Anything related to shipments, delivery and packages can go to the logistics or order management crew, and any technical or product question should go to product support.
By automating this assignment and adding tickets to the right queue, agents don't time reading and reassigning tickets that aren't meant for them.
[An introduction to Omnichannel Routing in ZendeskThis article will give you an overview of Zendesk’s Omnichannel Routing, Agent Availability and the brand new Queues features.Internal NoteThomas Verschoren](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/)
## Getting Context
Once the ticket arrives in your agents mailbox, it's key that the right context is available for agents to handle the inquiry. A question about a delayed shipment can only be answered when we know what order number the customer needs information for. A product with a defect can only be replaced or repaired when we know the serial number. And a rebooking of a flight required the original booking number.
It's imperative that the tickets have this information before it reaches the agent. Otherwise an agents' first action will be replying with a "can I get the order number" macro, and you'll loose the efficiency of replying to the customers with the actual answer from the get go.
Capturing this context can be done in a myriad of ways. You can create custom answer flows for your Bot that ask the customer for this information upon escalation. This way the information is already there when the conversation reaches the agent. The same can be done for traditional webforms by adding a custom field editable by end-users.
[Flow Builder - Ask for detailsThe new Ask For Details option in Flow Builder allows you to pull in contextual information via API into your Zendesk Chat Bot.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-ask-for-details/)
This works fine for webforms and bot conversations that , but doesn't work for email. Email lands in your inbox without any way to capture metadata. However you can use an escalation flow to redirect the customer to a webform and capture that data.
[Escalating a customer request to a Zendesk Help Center form for more information.This article shows you how to escalate an existing ticket to a new ticket form submission and merge the result.Internal NoteThomas Verschoren](https://internalnote.com/asking/)
Or you could leverage Ultimate's [Ticket automation](https://www.ultimate.ai/ticket-automation?utm%5Fsource=ppinternalnote), or Knots' [Ticket Parser](https://knots.io/zendesk-apps/ticket-parser?utm%5Fsource=internalnote) app to parse the email content and capture order numbers or booking confirmation codes and store them in custom fields. When you can't detect these elements in an email, you can use the same apps and flows to auto-reply to the customer and ask them for that information.
Looking into your ticket conversations and making a note of the metadata needed to resolve tickets is a useful exercise here. Each piece of data you notice agents asking for should ideally be moved to a point before the ticket is created
# Keep Improving
## Moving the frontline
The approaches shown above are your first line of defense and *easy pickings.*
But to keep improving your automation rates one approach is to keep moving your frontline.
Let's take the scenario of Delivery Status as an example.
### Basic Approach
A customer wonders where his package is. He contacts support and an agent replies with "*It's shipped and should reach you in two days once it clears customers. You can follow the status here \[link\]."* This is a manual process that takes time.
### Self Service Approach
A customer wonders where his package is. The bot replies with an article on "*where to see your order status*". The customer reads the article, goes to his order page and clicks the tracking link. They might inquire about login in to the order page, or not bother going to the page
### AI Agent Approach.
A customer wonders where his package is. The bot asks for an order number and uses an API call to get the order status. It responds with "Package is stuck in customers" And offers the option to contact an agent
### AI Agent Hybrid Approach.
A customer wonders where his package is. The bot asks for an order number and uses an API call to get the order status. It responds with *"Package is stuck in customers"* and we use generative AI and hybrid flows to have the bot add an *"this usually takes two days"* based on a support article containing that info.
You see how we went from a very human agent intensive flow to a flow that is fully automated. This kind of continuous improvements is a key element in the road to automation.
## Filling the gaps
The above approach of moving the frontline works great for known scenarios where you keep improving the process.
There's however a second approach to optimize your automation rate and that's by leveraging reporting and insights.
By looking into your reporting you can detect a few things:
### Knowledge gaps
Customers ask for things you didn't account for, and there's no self service, no context capture or way to deflect or route the questions. Detecting these gaps and implementing a way to offer answers to them will reduce agent workloads.
### Bad content
Bad help center content leads to bad tickets. Customers are already frustrated cause the solution offered didn't help due to poor content, wrong content or plain wrong article in the first place. Regularly looking into your knowledge base and improving the content there, or leveraging the flagging feature in the knowledge panel can improve your content.
### Improve intents
Your AI model and its intents will define how a question is handled. Conversations assigned to the wrong intent will end up with wrong answers and get routed to the wrong agent in the end. So looking at your intents and addressing confusion, duplicates or missing intents will improve these elements.
## Agent Automation
Similar, Agents should be empowered to also do more. Similar to how improving your self service flow for customers by using APIs to show e.g. an order status, you should do the same for agents.
Having an agent email finance to execute a refund could be more efficient by having an [Approval flow](https://sweethawk.com/zendesk-approve-workflow-app?utm%5Fsource=internalnote) in place that allows agents to execute the refund themselves by leveraging APIs and sidebar apps in the Agent Workspace.
Things like [Custom Objects](https://internalnote.com/tag/custom-objects/) or other tools that show context, or using [custom statuses](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/) to automatically remind customers of open tickets, are all small actions that can automate their processes.
[](https://hubs.li/Q02wlt%5FK0?ref=internalnote.com)
Learn more about the road to automation in this webinar on May 28th!
# Road to automation

Shown off at Relate and a big part of their new marketing and product story is this concept of *Road to Automation* or the *Road to 80%*.
The steps and elements described above are all part of this process of going from a classic CX environment towards one where almost all tickets are automated or touched by AI in the process.
> This focus on the human is all the more important as we advance toward a world where 100% of customer interactions involve AI in some form, and 80% of all inquiries will be resolved without the help of a human agent. It’s a massive amount of change in a very short period of time, but when done right, AI can help you create connections that feel more personal, more authentically *human* with your customers. - [Tom Eggemeier](https://www.forbes.com/sites/zendesk/2024/04/30/the-humanizing-power-of-ai-in-cx/?sh=577aafa973ac&es%5Fid=7a59bd9b89&ref=internalnote.com)
## Process
The image below shows you how you can take your Zendesk instance from 0 to 80% automation road in a few clearly defined steps.

Image provided by Ultimate
## 10% - Ai Agent with generative AI
Step one in moving from a static to an automated Zendesk is by leveraging your knowledge base and the new generative AI capabilities of the [Bot](https://internalnote.com/quick-look-at-the-new-generative-ai-bot-for-zendesk/) and [Help Center](https://internalnote.com/preview-of-the-new/). It will offer custom solutions to customers based on your existing knowledge base content and when enabled will often deflect as much of 10% of tickets without any other effort.
💡
This all builds on top of your existing knowledge base. If you don't have one, adding the top 10 topics a customer would ask for is a good start!
## 20% - Custom Answer Flows
Step two is turning some generated responses into custom answers. You might ask a customer for an order number. Or you guide them through the steps with a couple of questions to then offer them the right article or solution.
Or you might use the custom flows to ask for the info you need, offer self service options and, if all else fails, route to the right agent.
💡
Best practice here is to look at the flows that require an agent the most and start building flows to capture the right context. You don't need to build a flow for every scenario. Just handling your top 3 topics that need agents will already make a difference.
## 40% - Leverage APIs
Remember that order number example I mentioned earlier? By pulling in the order status from your systems and showing the actual status to a customer, or by allowing customers to (re)book from within your widget you can move even more work from human agents towards the customer and your systems.
💡
Here too, automation at all costs is not the right approach. Look at the flows that would benefit the most and start by adding an API call for those. Best scenarios are those where urgency is an element (I'll miss my appointment!) or where the question is easily answered by calling the data an agent or customer would otherwise be looking at in your customer portal or website.
## 60% - Insights and reporting
As mentioned in *Filling the gaps*, once you've got your self service and automation flows in place, the best way to improve your automation rate is to look into the data, detect gaps or potentials for improvement, and execute those.
It might seem boring, but sometimes *rinse and repeat* is the best approach.
Best places to get started are:
- The new [Bot Insights](https://support.zendesk.com/hc/en-us/articles/6847708774554-Monitoring-bot-performance-with-the-Insights-dashboard?ref=internalnote.com) dashboard to detect gaps in bot actions
- A [query](https://support.zendesk.com/hc/en-us/articles/4415799414938-Explore-recipe-Reporting-on-top-searched-questions-and-clicks-by-date?ref=internalnote.com) in Explore that reports on searches and clicks. This gives you both gaps in your knowledge base and articles that still require human action
- A [query](https://support.zendesk.com/hc/en-us/articles/4550629802650-Explore-recipe-Intelligent-triage-changes-to-intent?ref=internalnote.com) in Explore that measures Intent changes
💡
This article focus on existing ****Zendesk** features since this is what most people have access too. [Ultimate](https://ultimate.ai/?utm%5Fsource=ppinternalnote) has a lot more features to handle this which I hope will come to Zendesk soon.
## +80% - Keep on trucking
To get more than 60-80% you'll need to look further than just bots and agent flows. It's done by changing processes. Shifting customers from phone and email towards chat. Making your product better. Leveraging new technologies as they come available and staying up to date with the market.
For me, anything above 60% automation rate is a nice number. It takes the edge of agents' workload while still leaving a big chunk of work. Automation is nice, but by pushing towards a 100% automation we run the risk of pushing the human out of the equation.
If my calculations are correct, when this baby hits 88 automations per hour... you're gonna see some serious shit
### My approach to Zendesk Triggers
URL: https://internalnote.com/my-approach-to-zendesk-triggers/
Last updated: 2024-11-05T10:01:18.000Z
In a previous issue of Internal Note, I wrote about the way I structured [Views](https://internalnote.com/my-approach-to-zendesk-views/) in Zendesk. For me, Views should reflect the way the tickets flow through Zendesk and should focus on work to be done instead of being used to categorise and report on tickets.
My approach is often in stark contrast to how others use Zendesk. Most customers have dozens of views and use views as filters to look into the work, with multiple views that show a subset of tickets sorted by category, group, or assignee.
This not only makes it easy to see what's outstanding and what the next actionable item is, but it also allows for a too granular set of conditions that might hide or omit some tickets from views.
I use a similar approach to the way I build and organize triggers in Zendesk. Instead of building my triggers ad hoc for the use case I need at that moment, throughout my years of experience as a Zendesk consultant, I developed a way to organize triggers that makes it very clear what each trigger does, and allows you to follow a ticket throughout the triggers so you can know exactly where a ticket will end up once all triggers have passed.
# Triggers
Triggers in Zendesk are rule sets that are activated by an action on a ticket and can update the ticket or perform other actions as a result of this initial action.
They consist of a set of conditions (when they should run) and a set of actions (what should happen next). Since triggers update tickets, they can also activate other triggers through the actions they execute, making them ideal for chaining actions one after another.
> A ticket is created and its category is set to "Refunds." Based on the category, the ticket should be assigned to the "Finance Team." We should notify the requester about when they can expect a reply from this team via a notification email.
When considering the above scenario, there are two approaches we can take in Zendesk.
1. We create a *Refunds trigger* that sets the category based on the content in the ticket or intent, then assigns it to the Finance Team and notifies the requester. All nicely combined in one flow.
2. We create three triggers:
1. One that sets the "Refunds" category
2. Another trigger that looks at tickets with a category updated to "Refunds, Invoices, or Payments" and assigns them to the Finance Team
3. A trigger that sends out a notification to the requester for all assigned tickets
Most people will go for option one: a single trigger that bundles all Refund actions in one nice trigger. But personally, I prefer the latter of the two options and create three distinct triggers.
Why? Because if you need a trigger to handle "Refunds, Invoices, or Payments" and use the combined trigger option, you end up with three triggers that have very similar actions. If you ever want to update, for example, the assignment (e.g., start using queues) or the notification email (e.g., add auto-replies), you need to update three triggers with the same actions.
And since triggers perform a lot of actions, it becomes complex to update them, as they execute many actions at once, making it difficult to understand why they did or didn't run.

So, let me introduce you to my ideology when it comes to building triggers:
> One trigger does one job
This means you have **one** trigger with a few or a lot of conditions and a **single** outcome. That outcome can be "raise the priority," "escalate to a webhook," "assign," or "send an email."
Sounds confusing? Let's dive in!
# Order
Triggers in Zendesk run from top to bottom. So whenever a ticket is updated or created, it will pass all the triggers in order. Whenever a condition applies, the ticket is updated with the actions defined in the ticket.

When I define triggers, I order them in a specific way. I work my way from categorisation, towards assignment, and then notifications. Or to put it differently, if the end goal of a ticket is that it's being resolved by the right person, we need to make sure we first define what the ticket is about, then route the ticket to the right team or person, and then in the end make sure that any comments get sent to the requester or other interested parties or tools.

# Categorisation
The first categories of triggers are all about knowing what the ticket is about and setting all fields required to update and assign tickets later on. It's important to do this as soon as possible to prevent tickets from getting assigned to the wrong team and rerouted again. Or imagine sending out alerts to teams or customers, with later triggers adding a "do not notify" tag. Setting defaults and defining categories first is key.
💡
I prefer to make all my categorization tickets inclusive. This means they only apply in some scenarios "type ****is** x". I try to never use "****is not**" because this makes them difficult to parse, especially in an ANY condition.
## Set Defaults

Service Level Agreements in Zendesk only work when tickets have a priority. Similarly, tickets need a schedule if you want the SLAs to work. And you might want to differentiate between incidents and questions when it comes to routing or assignment.
So this first set of triggers basically fills in the blanks:
### Set Brand (in case of multibrand)
A ticket's brand gets set automatically based on the email address, social channel, or web form used to submit the request. There might, however, be cases where a brand is not set, so this trigger will set the default brand if no brand is available.
### Set default priority
A trigger that sets the priority to *normal* for all tickets without a priority.
### Set default type
A trigger that sets the type to *question* for all tickets without a type.
### Set default schedule (enterprise only)
A trigger that sets the schedule to *your default schedule* for all tickets without a schedule. If you have a multi-brand environment, you might want to create a trigger per brand for these schedules.
## Categorize

If we want to route tickets to the right person, or make sure the most urgent tickets are handled first, we need to update tickets and categorise them based on their content.
This is where this next set of triggers comes in.
### Set priority to urgent/high/low
I add three prioritisation triggers, one for each priority, which contain a (long) list of *any* conditions:
- If "subject contains Backup failed", if "Organisation is VIP", "If system impact is critical", ... then set priority to *Urgent*.
- If "category is spam", if "Sla Type is bronze", ... then set priority to *Low*
The goal is to have a single trigger per priority change. We can add as many conditions as we need, but the outcome is a change from the default *Normal* priority to a higher or lower condition.
These triggers will continuously evolve. Each time we discover a new type of ticket that needs a different priority, we can append or remove the conditions from the specific trigger. The outcome is that each ticket either remains on *normal*, or gets an update to a different priority.
### Set category to xx
When customers use the Zendesk Bot or Help Center forms to create tickets, you can capture the category (or intent) automatically. But for all tickets without a category, you can create a set of triggers that look at the subject, description, email address used, etc., to set the category of the ticket. Here too, we create a single trigger per action (Set category to refund), and have a (long) list of conditions (subject contains refund, description contains refund, recipient is refunds@company.com...)
### Update other fields
This categorisation category is the best place to update any ticket fields you need to automatically update. But always make sure to have a specific outcome for your action. It's better to have one trigger that sets the "country" field, and a separate one that updates the "eligible" field, than combining both in a trigger.
!! By leveraging the one trigger per action approach, you will end up with a **lot** of triggers. But each trigger will have a clear purpose and can be named as such, so the list is easily parseable and a trigger's name can reflect its goal in a short sentence.
### Set form to xx
Based on the category received at email or other fields, we can update a ticket's form to a specific form. I create a single trigger per form to, once again, keep things clear.
## Enrich

Before tickets reach agents, we want to make sure the tickets have all the context they need. Categorisation is one aspect, but we also need to clean up the data.
If a ticket needs a manager in cc, this is the moment to add them. If a customer profile [needs to be updated](https://internalnote.com/update-a-requester-name-via-webhooks-and-custom-fields/) with data from the form like name or phone, now is the time.
This set of triggers is all about updating users and tickets via webhooks, changing brands, updating subjects, or updating [lookup fields.](https://internalnote.com/lookup-fields-and-ticket-escalation/)
# Routing & Assignment
Now that we have given tickets the right priority and category, and made sure all fields and context have been set, we can route the tickets to agents to handle the ticket. This is what this next set of triggers will handle.
## Deflect

Not every ticket warrants an agent's attention. Some tickets are just notifications, others might be topics that need to be handled outside of Zendesk, and sometimes tickets are (re)opened when they should have stayed closed.
The triggers in this category are all about minimising the workload. Thanks to our categorisation, we can automatically solve/close all tickets categorised as spam, from automations,...
This is also a good spot to escalate your tickets to ticket automation tools like Ultimate. Tickets now have a full context, so if you want to automate responses to customers, this is the best time. Any ticket an automation tool like Ultimate can fully handle, will be resolved before it reaches your agents. And if it gets reopened, it will pass all triggers again, and might be routed to your agents.
The Spam deflection flow I described in a previous article also lives here.
[Automatically deflect Zendesk spam tickets via triggers and webhooks (Bonus article)From time to time spammers use open API endpoint in Zendesk to flood your inbox with tickets. This article shows an efficient and automatic way to deflect these tickets.Internal NoteThomas Verschoren](https://internalnote.com/automatically-deflect-zendesk-spam-tickets-via-triggers-and-web-hooks/)
## Update Status

This category is used for updating the ticket status based on ticket updates.
- Reopen tickets with an updated side conversation
- Reopen tickets with bad feedback
- Reopen tickets with comments from agents that are not the requester
- ...
## Routing

!! Depending on how you set up your [Omnichannel Routing](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/), this section might contain a lot, or a single trigger.
So far we've categorised tickets, enriched them with data, and deflected tickets where possible. So now is the best time to assign them to groups and agents.
Here too I follow the concept of "One trigger does one job". Each trigger assigns tickets to a single group based on conditions.
### Example: Assign to Group Finance
For each assignment to a group, I create a trigger with the same initial conditions: "group is not set". This makes sure we only assign tickets that are not assigned yet and don't accidentally overwrite groups.
I then set a unique set of conditions that apply to this group's work: category is refunds, received at is finance@company.com, form is Finance Form). And the trigger ends with an action of assigning it to the right group, e.g. \_Finance. \_
In case of Omnichannel Routing, this would also set the *auto\_routing* tag.
I repeat this trigger for each group.
### Fallback
Every ticket should get assigned. But even when we rigorously check all conditions, there are some tickets that fall through the gaps. This is where the final trigger in the Routing category is needed. This trigger checks for "group is not set" and then assigns to a default group, e.g. 'Support" and tags them with "Fallback".
This way no ticket gets left unassigned, but we can easily filter all tickets to see which tickets fell through and update our triggers accordingly.
# Notify
So far, we've not yet sent any outgoing communication to the customer. But now that we know what tickets are about, and know who will handle the ticket, we can start sending out notifications
\_Only then do we notify end users because this way we’re sure we send out the right alerts (if any) upon ticket creation. This is also the moment where you would automatically add followers, since you can exclude assignees from being followers of their own tickets. \_
## Collaboration

### Add followers
Aside from assigning tickets to groups and agents, we also might want to keep other people in the loop. For this reason, I create triggers that add people as followers. Here too I follow the rule of a single trigger for a specific purpose.
I try to be very selective when automatically adding people as ticket followers. It generates a lot of email noise, and it's often better to have the agent manually add a follower when necessary.
### Remove Assignee as Follower
One added benefit of doing this **after assignment** is that we can exclude ticket assignees from being followers on their own tickets. I use an [internal webhook](https://internalnote.com/your-new-zendesk-super-power/) to remove the `{{ticket.assignee}}` from the list of followers.
```JSON
{
"ticket": {
"followers": [
{ "user_id": "{{ticket.assignee}}", "action": "delete" }
]
}
}
```
## Notifications

### Auto Reply
Self-service is still the best way to initially handle tickets, so set up a trigger that sends out [Auto Replies](https://support.zendesk.com/hc/en-us/articles/4408825385242-Configuring-email-autoreplies-to-deflect-requests?ref=internalnote.com) (previously called Answer Bot) to your customers.
Not every type of ticket warrants an auto-reply. Some topics are not documented in your Help Center, some sensitive emails (HR, GDPR, etc.) might be handled directly by agents, and some tickets (e.g. automated alerts) don't need a response.
Since we know what tickets are about, and we also know who they're assigned to, we can set up the trigger to always be sent out, except for tickets "assigned to group Finance", "Category is GDPR" or "Organisation is GitHub".
Tag the tickets that got an auto-reply with `auto_reply`, so you know which ones got an alert.
### Ticket Created by End User
There's also a set of tickets you want to confirm to customers, but didn't need the auto-reply.
This trigger will send out a "Ticket created" notification, but excludes all tickets tagged with `auto_reply` so customers don't get notified twice.
You can also exclude any other ticket or user you don't want to notify. The important part is to make it exclusive, so the email gets sent by default.
Tickets sent as a reply to end-users often contain some text like "Thanks for contacting us, we try to reply within 24h"
!! I prefer to make all my notification triggers run by default **except in some cases.**
### Ticket Created by Agent
For tickets that are proactively created by agents, we do not need the "Thanks for contacting us" preamble and we can jump right into the conversation by just sending a `{{tickets.latest_comment}}` placeholder.
### Next Reply
The final trigger in this notification alert to end-users is one where we send updates to customers whenever an agent adds a public reply to an existing ticket.
# Integrations

There's one type of triggers that don't really belong in the flow of categorise > assign > notify, and that's all triggers that belong to integrations. You might have installed a Marketplace app that requires a trigger to function, like [Sweethawk's Tasks App](https://sweethawk.com/zendesk-tasks-app?utm%5Fsource=internalnote). Similarly, Zendesk's Slack integration, or [Ultimate.ai](https://ultimate.ai/?utm%5Fsource=internalnote) requires triggers to alert them of ticket changes.
You might want to [log an Event](https://internalnote.com/sunshine-events-via-webhooks/) in the customer timeline, or push the ticket's resolution to an external reporting tool.
All these triggers live in the final category *Integration.* That way they're nicely combined in one category for easy reference, and since they run at the end you can be sure that all other triggers have run first.
For some complex integrations, I often even create a dedicated category to collect all its triggers in one place.
# Moving your setup to this concept
When building a new setup in Zendesk from scratch, it's easiest to add the categories and then run through the triggers top to bottom to match your requirements.
However, if you're interested in implementing this approach in an existing Zendesk environment, restructuring your triggers to match the different categories while maintaining business continuity is like repairing a plane mid-flight. You can't just delete all your triggers and start over; that would break existing flows and disrupt your customer or employee support.
My recommendation here is to add all the new categories **above** the existing default trigger category. You can then take each trigger and validate it.
The first thing to check is to see if the trigger [has run in the last 30 days](https://support.zendesk.com/hc/en-us/articles/4408894209562-Reordering-and-sorting-triggers?ref=internalnote.com#topic%5Fcrg%5F5gb%5Fpmb). If it hasn't, you can safely deactivate or delete it. It's not in use, so no harm done!
Next, check if the contents match the "One trigger does one job" rule. If it doesn't, it's best to clone the trigger and remove conditions from each trigger so you end up with two triggers that do one job. For example, if you have a trigger that sets the category to "Refunds" and assigns to "Finance Team", you can clone the trigger and end up with one trigger that contains all the conditions for setting the Refunds category, and a second trigger that contains all the assignment conditions. Once split, you can [move](https://support.zendesk.com/hc/en-us/articles/4408894209562-Reordering-and-sorting-triggers?ref=internalnote.com) the triggers to the right categories.
The final step in this flow is looking into each category and optimising the triggers. By splitting triggers into single-use triggers, you'll probably end up with a lot of triggers with similar actions. A few triggers that all assign to the "Finance Team". Or multiple triggers that change priority. You can move over conditions from similar triggers to combine them into one trigger that executes that action.
Once you've done this process, you'll end up with a nicely structured set of triggers that are easy to maintain and scales as your usage of Zendesk grows.
# Conclusion
The approach of categorising triggers in a chronological order starting with setting defaults, moving towards categorisation, deflection assignment right up to notifications is an approach I've used for dozen (if not hundreds) of customers while setting up Zendesk instances.
As mentioned above, migrating to this setup is not a small job, but once completed, it's **the** way to work with Triggers in Zendesk if you ask me!
### Zendesk Roundup for May 2024
URL: https://internalnote.com/roundup-2024-05/
Last updated: 2024-11-05T10:02:04.000Z
Doing a Zendesk roundup in the same month as Relate is always a bit weird. You've got a big story and platform changing releases on one side, and then you've got all the "*little*" updates on the other.
Relate told the big story of Zendesk AI Agents, Copilot and WEM and positions Zendesk as.

However, although there were lots of releases at the event (see my articles earlier this month for an overview), most of the announcements are either things that will develop over the next 12 months, or a repositioning of existing features of the platform under a new name or format.
What's always nice to see is how parallel to Relate's big moves, Zendesk as a platform doesn't sit still and the platform also gets a lot of smaller updates that one the platform forward one feature at a time. And this month's wave of releases do that once again.
Let's dive in!
# 🎉 New Releases
## 🤖 AI Agents
The biggest release this month has to be the availability of AI Agents for all Zendesk Suite customers. Zendesk Bot, as it used to be called, now gets the ability to generate replies based on Help Center articles, with the option to customize these replies with persona in either a professional, casual or friendly tone of voice.
For customers that match one of the retrained industries this means they also get access to a pre-trained AI model with intents to map conversations to the right custom answer flow or generated response. (Reach out to your account manager to get it enabled)
This means that every Zendesk customer now gets the bot capabilities that used to be locked behind the Advanced AI add-on now gets these features as part of Suite.
### Automated Resolutions
The above does come with a giant caveat: as mentioned in my [Relate roundups](https://internalnote.com/zendesk-relate-day-1/#ai-agents), Zendesk will be moving its AI Agents (bots) to a new model where you pay for resolved conversations.
Similar to how Answer Bot used to work before the move to Zendesk Suite, each bot interaction that resolves a customers' question will cost you around 1€ per resolution. This counts for interactions via the Zendesk Bot and Auto replies via email based on articles or replies via triggers that use intents.
[About automated resolutions for AI agentsAI agents are currently available on a trial basis. New pricing will be implemented on July 10, 2024\. For customers who start using AI agents on or after April 16, 2024, pricing will…Zendesk help](https://support.zendesk.com/hc/en-us/articles/5352026794010-About-automated-resolutions-for-AI-agents?ref=internalnote.com)
What counts as a resolution? The above article has all the details but in general any bot conversation where the bot offers an article, AI generated response or arrives at the end of a flow counts as a resolved interaction if the conversation was **not** passed to an agent and the user hasn't interacted with your widget for three days.
You get a small allocated amount of resolutions included in your Zendesk Suite plan, averaging around 10 resolutions per agent per month. (So for a 20 person team this means 200 deflected interactions for free).
💡
I can't judge pricing and financials for other people so I will refrain from making any further non-technical comments on this new pricing approach. I'd rather stick to guidance on how to implement Zendesk well.
### Improved AI Models
- Zendesk intents and sentiment detection now supports more languages: Vietnamese, Bulgarian, Hungarian, Hebrew, Finnish, Greek, Hindi, Ukrainian, Thai, and Indonesian. This increases the number of supported languages to 29.
- All pre-trained intent models got updated with dozens of new intents and updates to the existing intent matching.
- The sentiment model was updated to become more accurate in detecting positive and negative sentiments, so you should see less neutral sentiments. The model can now also between positive and negative sentiments where the user’s comment includes all capitalized letters.
- The supported industries got expanded with new models for entertainment and gaming industries.
- Macro Suggestions now support French, German, Japanese, and Portuguese, in addition to English.
### Set Variable
One of the things that set [Ultimate](https://ultimate.ai/?utm%5Fsource=ppinternalnote) apart from Zendesk's bot was the more advanced options for building custom answers. Where in Zendesk you could only use parameters within a specific flow to pass information from step to step, in Ultimate you had the ability to set a parameter in a conversation and use that value across all subsequent interactions with the customer during that conversation.
For example, if your conversation starts with asking the customer to enter an order number, you can store that input as a variable `order_number`. If you'd then ask the customer to choose between order status, cancel order, modify order and route them to three different answers, you can use that stored value in either one of the flows or even pass that value to the agent as a tag.
[Announcing answer linking enhancements and passing variables to tagsAnnounced on Rollout starts Rollout ends April 24, 2024 April 22, 2024 May 3, 2024 In line with our ongoing investment in improving how variables can power automation for our customers, we’re…Zendesk help](https://support.zendesk.com/hc/en-us/articles/7144411709082-Announcing-answer-linking-enhancements-and-passing-variables-to-tags?ref=internalnote.com)
These options are now also available for Zendesk Bots, getting us one step closer to feature parity between their different bot platforms.
💡
If you want to learn more about this, stay tuned. I'm working on an update on my [Bot Builder](https://internalnote.com/flow-builder-dinosaurs/) tutorial that will include these new capabilities. So subscribe to the blog if you haven't to get the new tutorials right in your inbox!
## 👨🏻💻 Agent Workspace
The Agent Workspace got a how slew of updates this month ranging from small cosmetic updates to new features that have been on many people's wishlist for a long time. Let's dive in!
First one is an update to [Omnichannel Routing](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/) giving agents the ability to [focus](https://support.zendesk.com/hc/en-us/articles/6975540666266-Announcing-focus-mode-for-omnichannel-routing?ref=internalnote.com) on a single channel at a time. I used to create a couple of new custom statuses for agents that put them online in a single channel at a time, but maybe with this feature I can just have one single *online* status again and let focus mode do the rest. Something to test.

### Suggested Replies
At one of the booths at Relate I saw a new Suggested Reply feature being demo'd. This one is now [available](https://support.zendesk.com/hc/en-us/articles/6870610571930-Announcing-suggested-replies?ref=internalnote.com#:~:text=The%20suggested%20replies%20feature%20scans,is%20populated%20in%20the%20composer.) as an EAP for everyone to test. The new Suggested Reply feature will profile the reply field for an agents' first comment on a ticket taking information from your knowledge base, previous tickets and macros. Agents can tab complete the comment, make modifications where needed and submit the ticket.
It feels like yet another step towards the AI Copilot where instead of agents copying content from an article and using the expand/tone shift options to modify the response, the system now does that for you. One limitation is that for now it only works on the initial reply, so further discussion with the customers still needs to be handwritten by the agent.

### Shared App Shortcuts
Last year Agent Workspace got the ability to pin apps to the sidebar, making them easier to get to. This was especially useful for environment with a lot of apps, or in scenarios where you wanted the app to take the full height of the window, instead of being stacked in between other apps.
One feature I heard from customers' time and time again is that they'd loved to be able to pin apps on an admin level and make them available to all agents. Pinned apps used to be a per-agent setting, but now this limitation has been lifted. Similar to views, admins can now preset pinned apps for all agents, while still giving agent the option to add their own personal pinned apps to the sidebar too.

[Managing shared app shortcuts](https://support.zendesk.com/hc/en-us/articles/6866142556954?ref=internalnote.com) is done from within layout builder, and you can use this in combination with Contextual workspace to offer different pinned apps based on group or context.
### Device Information
During Zendesk's migration from Chat to Messaging some existing features got lost. Gradually Zendesk has been adding them back into Messaging. We got user authentication, ability to tag conversations, routing to different groups,.. back in the past few months.
This months' Zendesk re-enabled the capture and display device information for customers contacting agents over web or mobile messaging.

The customer context panel in the sidebar of a ticket will now show device information like IP, location, device or browser type and OS version as context next to the ticket.
> The Device information display is turned on and visible by default. To prioritize privacy, IP address and location are hidden by default, but can be enabled in Admin Center if needed.
## 🔎 Help Center and Self Service
The Zendesk Help Center *only* got two new releases this month.
The first one is a big one: generative search is coming to the Help Center, adding a generated response to a customers' search query on top of the search results.
[Preview of the new generative search for Zendesk Knowledge Base and Agent WorkspaceThe new generative AI search features for the Zendesk Help Center and Agent Workspace turn search results into Quick Answers with custom generated responses.Internal NoteThomas Verschoren](https://internalnote.com/preview-of-the-new/)
Additionally, Zendesk keeps on improving the article editor with the addition of a new header that more clearly shows the article status. I really like these gradual improvements to the editor. All admin features are pushed to the side and the content gets more and more prominence.
I do hope someday we get the same `/shortcuts` that are available in apps like [Slite](https://refer.slite.com/cn8zn9oi7mha?ref=internalnote.com), Notion or Ghost to speed up the insertion of images or other content types.

## 🧱 Open and Flexible Platform
The weeks after Relate always feel like Zendesk guarding a lot of releases and then making them available all at once. This is especially true when we look at the API and platform side of things.
### API and Admin Panel updates
- Custom Objects keys and their respective Field keys weren't reusable. This meant that if you added a `location` textfield to an object, and later deleted that field to replace it with a lookup field, that you had to give it a different identifier. This restriction is now gone!
- It's now possible to merge an organization with another organization via the Zendesk [API](https://developer.zendesk.com/api-reference/ticketing/organizations/organizations/?%5Fga=2.97888735.1362892902.1712714219-718344963.1705364774&%5Fgl=1%2A1oj5vyh%2A%5Fga%2ANzE4MzQ0OTYzLjE3MDUzNjQ3NzQ.%2A%5Fga%5F0G6FC9CS2V%2AMTcxMjkwMTk3MS4xODUuMS4xNzEyOTA0MTAwLjI4LjAuMA..&ref=internalnote.com#merge-organization-with-another-organization) by calling `PUT /api/v2/organizations/{organization_id}/merge`
- Admins can now delete custom ticket statuses. Previously, custom ticket statuses could only be deactivated. Sadly only available via the UI and not via the API for now.
- The Dynamic Content overview page now gets a new column that shows the `{{dc.placeholder}}`. Saves you a click to find it!
- The [Data Importer tool](https://support.zendesk.com/hc/en-us/articles/6985856420762-Announcing-the-general-availability-of-the-data-importer?ref=internalnote.com) is now available for everyone. This tool makes it easier to bulk import and update Organizations and Custom Objects.

### Announcing new Talk hold and wait music by Nova Dawn
The default On Hold music for Talk conversations has been updated to a "*more upbeat yet calming sentiment, infused with a tinkling beat, and driven by the quiet strumming of an acoustic guitar*".
New Greeting
0:00
/189.36
1×
🎶
If anyone has the ****old On Hold song saved**, please let me know!
### Announcing the API Usage Dashboard in Admin Center
The Admin Center got a new API Usage dashboard giving you insights in API usage. You get an overview of errors and usage limits, as well as an overview of the top endpoints by volume or user. Useful to detect badly configured integrations or bad actors!

## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 💡Insights
## AI and the next CX Revolution
The conversations with Zendesk podcast has a great interview with Zendesk CTO Adrian McDermott and Teresa Haun on the impact of AI on CX.
It's an interesting conversation to listen to, but there's two quotes I want to highlight:
> There's this quote from a technologist Tim O'Reilly that I love, right, he says **what new technology does is create new opportunities to do a job that customers want done**. I love that quote, because it's customer centric.
Secondly, they talk about a pattern when it comes to new technologies: optimization often results in a drop in quality.
> So that's the early honeymoon period of a technology shift. **Generally, we see, as these technologies mature and CX, the drive for optimization becomes industry wide**. **And as the drive for optimization becomes industry wide quality standards drop**, you get you wrote answers because things are becoming industrialized, things are becoming standardized, you're getting the same answer over and over again, you feel like the customer service agent isn't empowered anymore, because you're not winging it and making it up like you were in the early days of web 2.0\.
> And so this pattern repeats in each of these phases, right? Volume, increase quality, increased cost reduction turns into flat volume, basically, or slightly increasing volume, reduction in quality, massive reduction in cost.
Give the entire conversation a listen. It's worth your time!
## Authentication end users with messaging
Zendesk published a nice video on [Messaging Authentication](https://internalnote.com/messaging-authentication-identify-and-merge-existing-users/) on their YouTube channel.
# ⚠ Major Changes
One major change that's coming is the aforementioned shift to Resolution Based pricing. You can use the new Automated Resolutions dashboard in your Admin Center to keep an eye on current usage.

## Article Attachments
Small change to the way the [Article Attachments API](https://developer.zendesk.com/api-reference/help%5Fcenter/help-center-api/article%5Fattachments/?ref=internalnote.com) handles URLS and filenames:
> To increase the persistence and reliability of our attachment URLs, we are modifying the response structure to remove the file name from the `content_url` while still providing it in the `file_name` attribute.
[Announcing a URL structure update for the Article Attachments APIAnnounced on Rollout starts Rollout ends April 2, 2024 July 2, 2024 July 2, 2024 We’re announcing an upcoming update to the URL structure returned in responses from the Article Attachments API…Zendesk help](https://support.zendesk.com/hc/en-us/articles/7004594717594-Announcing-a-URL-structure-update-for-the-Article-Attachments-API?ref=internalnote.com)
# 📝 Articles this month
[Preview of the new generative search for Zendesk Knowledge Base and Agent WorkspaceThe new generative AI search features for the Zendesk Help Center and Agent Workspace turn search results into Quick Answers with custom generated responses.Internal NoteThomas Verschoren](https://internalnote.com/preview-of-the-new/)
[Zendesk Relate: What’s available now and show floor impressionsIn this final article of the Zendesk Relate 2024 series I’m doing a review of what Zendesk features are available today, and how they fit in the bigger Zendesk product approach. And I wrap things up with some impressions of the show floor.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-relate-event-recap/)
[What’s new from Zendesk Relate: WFM, QA and Zendesk’s new vision.In today’s newsletters I’ll write about the to remaining topics: Workforce Management (WFM) and Quality Assessment (QA), and wrapping things up with some comment on Zendesk’s new product vision.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-relate/)
[What’s new from Zendesk Relate: AI Agents and Copilot.Today was the first day of Relate, Zendesk’s flagship event where they announce new features, give insights in customer and employee experience trends and showcase their products and customers. This article shows the new Agent Copilot and AI Agents.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-relate-day-1/)
[Beyond triggers. Moving to queue only assignment in ZendeskWhat happens if we trust queues for assignment and remove any assignment triggers from a Zendesk instance?Internal NoteThomas Verschoren](https://internalnote.com/beyond-triggers-moving-to-queue-based-assignment-in-zendesk/)
# And Finally...
We won a [Zendesk Award](https://www.zendesk.com/blog/2023-zendesk-partner-award-recipients/?ref=internalnote.com) at the office, and the announcement article on Zendesk's blog has a quote from yours truly on it. 😎
### Automatically deflect Zendesk spam tickets via triggers and webhooks
URL: https://internalnote.com/automatically-deflect-zendesk-spam-tickets-via-triggers-and-web-hooks/
Last updated: 2024-11-03T10:55:14.000Z
For anyone using Zendesk in the last few days, the image below will be very familiar. All of the sudden your inbox gets flooded with spam tickets. They seem to originate from the web widget channel and contain Chinese characters.

From what I can gather, and confirmed via other people contacting Zendesk, these tickets are created by spammers misusing the unauthenticated `api/v2/requests/` endpoint that's used to create tickets via webforms.
Preventing these tickets is not really possible since the only way to close the endpoint is to prevent [unauthenticated users](https://support.zendesk.com/hc/en-us/articles/4408820924954-How-do-I-remove-the-ability-for-customers-to-sign-up-for-our-account?ref=internalnote.com) from creating tickets, but that kinda defeats the purpose of having a Help Desk.
Zendesk always finds a way to deflect this spam-attacks by adapting their firewall and content filter settings, but in the meanwhile, here's an easy method to handle these tickets.
# How to automatically mark tickets as spam.
## Step 1: Identifying the tickets
Any automatic filter can only work as long as you find a way to identify the tickets. In this scenario there's two approached I took:
First I created an organization QQ that has a linked domain *qq.com*, since that's used by most of these requesters.

Secondly I noticed that all these tickets have a similar structure in their subject *oZxQh用你IP帮我打婇嘌每天*`3OO伽qun`*858543602* so I can also use this to identify them.
💡
This part of the flow is always a bit of cat and mouse and you'll need to adapt your identifiers from time to time.
## Step 2: Webhook
🐛
May 6th - A previous version of this article showed a wrong placeholder in the web hook URL. This has now been fixed!
Zendesk has an endpoint to *mark tickets as spam and suspend end-users* which is documented [here](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/?ref=internalnote.com#mark-ticket-as-spam-and-suspend-requester).
In order to automatically call this endpoint and mark tickets as spam, we'll need to create a webhook.
1. Go to the admin center and navigate to *Apps and integrations > webhooks*
2. Add a new web hook with `https://subdomain.zendesk.com/api/v2/tickets/{{ticket.id}}/mark_as_spam` as the Endpoint URL and set the Request Method to`PUT`.
3. Authenticate with Basic Authentication with `admin@domain.com/token` as the username and a Zendesk API token as the password.

## Step 3: Trigger
Finally, we'll need a trigger that will call the web hook if a potential SPAM ticket is created.
For the conditions, you can use the identifiers we defined in step 1:
- ALL: Tickets are created
- ANY:
- Organization is `Qq`
- Subject Text contains `3OO伽qun`
- (add your own)


And for the actions, select the webhook we just created. You can leave the JSON body empty or leave the `{}` that's added by default.
💡
Note that API calls take a few seconds to execute. So it's best to put this trigger before any assignment triggers so the tickets don't temporarily end-up in your agents' views.
# Wrap up
Any **new** tickets that fall under your spam rules will now be automatically marked as spam and be suspended, no longer filing your views.
You can follow the suspensions executed by looking at the Activity tab of your webhook's configuration page in the Admin Center. Each successful suspension will be market with a Success:200 OK status.

And if you check your Deleted or Suspended Tickets views, you'll be greeted with a list of tickets.

The only real maintenance here is that to keep an eye on spammers using some new format and updating your trigger accordingly.
💡
You can also use an automation that looks at the same identifiers and **tickets older than one hour* to clean up the backlog!
## Sign up for Internal Note
If you want more of these tips and tricks, sign up for our weekly email. And if this email saved you a few hours of work, consider subscribing to hour PLUS tier and support my work!
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Preview of the new generative search for Zendesk Knowledge Base and Agent Workspace
URL: https://internalnote.com/preview-of-the-new/
Last updated: 2024-11-03T10:55:41.000Z
The Help Center is one of Zendesk oldest features and was launched shortly after the Zendesk platform started as an email based ticketing system.
Last year this core part of the Zendesk Suite gained a lot of new features like a new semantic search engine, featured search articles and suggested articles via Answer Bot, but in essence stayed core to its initial offering: a help center with a search bar that returns a list of articles based on whatever the customer searches for.
Its rival, the Zendesk Bot, draws its knowledge from the same articles as the Help Center does. Here too, both the classic Widget, later Answer Bot and now the Zendesk bot initially returned a list of articles based on the input of a customer.
But, last year, the Zendesk Bot got a nice new super power with the arrival of [Generative AI for the Zendesk Bot](https://internalnote.com/quick-look-at-the-new-generative-ai-bot-for-zendesk/). Customers no longer saw a list of articles to read, but the bot returned a custom generated response in return to their question, with the content pulled from the articles in the knowledge base.
This makes things a lot easier for customers, giving them less content to read and parse, while making sure the right (and correct) info is still presented to them.
With the arrival of these new kind of generative search tools, Zendesk Bot, Ultimate GPT, or even OpenAI's ChatGPT, somehow reading an article and hoping it contains that one nugget of information that can help you feels slow and inefficient all of the sudden. And, as a result, a traditional Help Center with long articles and list of links to articles also feels old and inefficient.
# Generative Search for Help Center
Enter: Generative Search for Help Center. This new EAP gives your Help Center, and the knowledge panel for Agents, the same generative capabilities as the Zendesk Bot.
[Announcing generative search for help center EAPAnnounced on Enrollment opens EAP rollout begins April 16, 2024 April 16, 2024 April 22, 2024 We are excited to announce the introduction of generative search for help center, currently availa…Zendesk help](https://support.zendesk.com/hc/en-us/articles/7057446125082?ref=internalnote.com)
## How does it work?
Once enabled, when a customer searches for something like "*what do I do if a T-Rex escapes?*", the search results will no longer just return a list of relevant articles. On top of the page it'll show a new *Quick Answer* block that contains a generated response to your question:
> If a T-Rex escapes at Jurassic Park, stay calm and alert. Seek shelter if you are near a building or vehicle, or stay low to the ground and hide behind a tree or large object if you cannot find shelter. Do not run, as it may trigger the T-Rex's natural instincts. Call the park's emergency hotline and provide your location and information about the T-Rex's whereabouts. Follow instructions from park staff or emergency personnel.
Below the answer is a link to the source article and the option to give feedback to the given result.



What's nice is that these answers are not only limited to your Help Center content, but will also index and return data from external sources added to Zendesk via [Federated Search](https://internalnote.com/federated-search/). For example, searching my Help Center for *custom objects* returns content pulled from this very blog!

## What about agents?
Similarly, when agents open the Knowledge Panel in Agent Workspace they'll not only see a list of relevant articles, but also a *Quick answer*. Here too agents can see the source content and have the option to give feedback.
Naturally, if the answer is not correct they can still search for something themselves in the knowledge panel. This too will generate a new *Quick answer*, and a list of relevant articles.
Once happy, they can copy the answer to a tickets' comment to easily reply to the customer.


💡
Bonus tip: combining the **Quick Answer* with the **Expand* or **Tone Shift* features in the comment field will turn these generate answers in more personalized answers. The customers name and additional context will be taken into account and the response will feel a bit more personal!
# Enabling Generative Search
## Agent Workspace
Enabling this feature for Agents is as easy as turning it on in the Admin Center with the click of a button. It's enabled for all agents and will use the same [filters](https://support.zendesk.com/hc/en-us/articles/4408836451610-About-knowledge-in-the-context-panel-and-the-Knowledge-Capture-app?ref=internalnote.com) as the regular Knowledge Panel search would.

## Help Center
Enabling the feature for the Help Center is a bit more complex. If you use the regular Copenhagen Theme you can install [a newer version](https://support.zendesk.com/hc/en-us/articles/6942732527130-Generative-search-for-help-center-EAP?ref=internalnote.com#topic%5Fdrb%5Fcqq%5F1bc) from Github that contains the right placeholders.
If you have your own custom theme (and if you haven't you really should!), enabling the new feature is done by adding a new placeholder `{{generative_answers}}` to the `search_results.hbs` template in your theme code editor. (Do make sure you're running a v3 version of your theme, and not an older theme)
The screenshot below shows you an example on where to put the placeholder in the default Copenhagen theme. Your theme will be structured differently, but search for `{{#if results}}` and somewhere above that should be good spot to put the placeholder.

One nice thing (or limitation, depending on how you look at it) of the `{{generative_answers}}` placeholder is that it embeds as a single element without direct access to the elements inside. It's setup in such a way that it follows the font and color settings from the Copenhagen theme automatically.
So if your theme has the following identifiers, the *Quick answer* block will nicely follow its settings and adapt colors and fonts accordingly.
```
text_color
link_color
hover_link_color
visited_link_color
heading_font
text_font
```
But if the custom theme you have doesn't contain these setting names, your *Quick answer* block will always get the default treatment.
I really hope Zendesk allows for more customization here, cause most of the themes I built in the past did not have those exact settings names, and changing them is a breaking change so that's going to be a painful migration (or a good lessons learned!).



Some examples on how your theme styling can affect the look and feel of the element
# Conclusion
As an improvement of the Help Center experience I really like this new feature. It borrows from the Zendesk widget and nicely improves your Help Center search.
Are there things to improve? Sure. If your articles are very image or video focussed, the generated answers aren't that great since they only render text and won't surface the right screenshot or video. Some deeper understanding of these types of content in the form of showing the right image, or loading the video at the right timestamp would be nice improvements.
Similar, a customer might have a follow-up question or nuance they want to add as a result of the generated reply. For now, each search query runs independent of prior searches, so a real deep dive on a topic without getting repeated results or article links isn't really possible.
For agents it's a nice timesaver. Instead of reading the article to locate the right paragraph, they now get a quick reply (pun intended) with the content they're looking for. This however still feels like a stopgap to the bigger concept of a real copilot.
We now have the expand/tone-shift feature to turn sentences into real comments. We've got quick reply to propose answers. We've got macros which combined with expand/tone-shift give custom responses. And soon we'll have [suggested replies](https://internalnote.com/zendesk-relate-event-recap/#suggested-reply) that rewrite an answer for agents with a tab-to-complete.
I kinda want to do a Steve Jobs move here: *It's tone shift. It's quick answer. It's suggested replies. Tone shift. Quick Answer. Suggested Replies. Do you get it? These are not three different services. This is one solution. And we're called it: Copilot. 🤪*
As a a final wishlist item, I hope this feature also comes to Auto-reply via email. Having a confirmation email for customers with a built-in custom response to the questions in the email feels like such a natural evolution?
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Zendesk Relate: What's available now and show floor impressions
URL: https://internalnote.com/zendesk-relate-event-recap/
Last updated: 2024-11-03T10:55:49.000Z
That's a wrap for Zendesk Relate 2024\. Three days of insights, meeting people, talking to Zendesk engineers and product managers (also people!) and exploring Las Vegas after hours.
In the previous two articles I wrote about [AI Agents and Agent Copilot](https://internalnote.com/zendesk-relate-day-1/) and [QA and WFM](https://internalnote.com/zendesk-relate/). This third article in the series will serve as a final recap, tying up loose ends with some loose pieces of information I got from the show floor.
I'm also trying to make sense of what's available **today** for customers. Zendesk announced a lot of new products, but not all of them are ready yet. Some are still in EAP and some are currently marketing than actual product.
And to conclude, some pictures from the show floor. Let's dive in!
# Zendesk's product line up
🆕
I updated this article to reflect the available of Intents and Generative Bots in Suite. An older version of the article only included the Generative features.
During the Keynote on Tuesday Zendesk announced a lot, but when we look at their website it's not really clear which of the announcements are actual products you can buy, which are brand names for a set of capabilities and which are just features part of a specific product.
Talking to Zendesk people at the show gave me some additional insights which I tried to draw down in the overview below:

Every Zendesk customer starts by buying one of the **Zendesk Suite** packages. Depending on your needs that can go from Suite Team up to Enterprise, with most customers probably going for the Professional package. This gives you the trio of Agent Workspace, Messaging/Ticketing and a Help Center.
Zendesk Suite also included the Zendesk Bot and Explore to give you ticket deflection as well as insights in your teams' efforts. And Omnichannel routing will make sure tickets arrive at the right team or person, and the triggers and integrations will allow you to automate part of your ticket lifecycle, or integrate with people and data across your company.
In essence, aside from the fact that the new Generative Bot and pre-built AI intents are included in Suite, nothing really changed here after Relate from a product capabilities standpoint.
[Overview of AI agentsAI agents are currently available on a trial basis. New pricing will be implemented on July 10, 2024\. For customers who start using AI agents on or after April 16, 2024, pricing will be applied sta…Zendesk help](https://support.zendesk.com/hc/en-us/articles/6970583409690-Overview-of-AI-agents?ref=internalnote.com)
See this article for a full overview of the available AI features in Suite.
Once you've setup your service platform for your customers or employees you have all the tools needed to offer a good service experience.
However, while you grow as a company, the workloads for your support team will increase due to a rising amount of tickets, or an increase in complexity of inquiries your agents need to handle.
There's two ways we can lower the workload for your Agents: either you lower the amount of tickets in their queue, or you automate steps to make ticket resolution more efficient.
## Reduce the amount of tickets
Reducing the amount of tickets created means increasing your self service capabilities. This can be done by enabling an *AI Agent*. By improving the capabilities of your bot (or automate email replies) you will resolve more customers inquiries without Agent interaction.
Zendesk currently has two *technology* solutions they offer: Advanced AI and Ultimate, all branded as AI Agents.

**Zendesk Advanced AI** gives you an AI model with industry-based intents which allow you to map intents to either generated responses or custom reply flows, which might be integrated via API with your tools. It's included in every Suite instance and will move to *usage-based pricing* in the near future.
However, with the acquisition of [**Ultimate**](https://ultimate.ai/?source=ppinternalnote) it's clear that Zendesk's existing bot capabilities are to be fully replaced with the Ultimate product. So if your company has the budget, or if the solution and value offered by their offering is a match, I highly recommend to look into this solution. (Pricing of Ultimate will change in the future but no official news yet).
Compared to the existing Zendesk offering with Advanced AI, Ultimate gives you the following main benefits:
- A custom model trained on your tickets with intents matching your companies actual work
- A more advanced flow builder and integration engine that allows for more complex flows, including hybrid flows that combine generated responses, API responses and traditional flows
- A powerful reporting model that detects knowledge gaps and allows you to map conversations to intents.
If you're one of these companies where the amount of repeated customer inquiries grows faster than the unique and complex questions, investing in a better bot (AI Agent) is the best way forward.
## Automate the process
The other approach to increase agent efficiency is to make their job easier once a ticket arrives in their inbox. Assigning the ticket to the right person based on a combination or skills and intent mapping is one of the approaches.

The **Zendesk Advanced AI add-on** offers a myriad of AI capabilities to automate part of an agents ticket actions.
Things like the new *suggested reply* (see below), *macro suggestions*, *tone shift* and *expand* make replying to the customer easier and the new [*quick answer*](https://internalnote.com/zendesk-relate-day-1/#generative-search-eap-in-agent-workspace-and-help-center-eap) feature for the Knowledge Panel generates replies based on your Help Center content.
The intelligence panel with its *intent, sentiment* and *language* context, combined with the *summary* feature makes it easy to escalate tickets to others, and provides immediate context without reading the entire ticket.
And the *similar tickets* and *merge suggestions* make it easy to remove duplicate work by referring to other tickets.
💡
All of the above features are available now for anyone who buys the Advanced AI add-on, and will help improving agent efficiency.
Of course, the elephant in the room is the newly announced **AI Copilot**. Only available in EAP it promises to automate a lot of the actions agents normally do themselves, and will, if Zendesk's vision comes true, turn agents into approvers and editors, instead of the ones actually doing the job. However, since this article is about what's possible **today**, and to stay in line with the good advice of 'buy for the features that are here now, not the once that are promised), it's best to validate the product fit of Advanced AI based on the features mentioned in the first few paragraphs.
## Insights
So. Zendesk Suite gives you the tools to do customer care. Ticket deflection with AI Agents, and AI powered agent tools will give you the means to lower agent workload and increase efficiency. But how do you know it actually works?

This is where the remainder of Zendesk's products comes in. **Explore**, part of Zendesk Suite, gives you insight in the agents actual workload and types of tickets they handle. It generates reports, gives you data on SLA adherence and customer satisfaction.
However even though CSAT allows you to measure part of how your team is doing, you might want to get more insights in risks, quality of responses, and how your team is doing in general. Additionally, where Explore only shows data on tickets, a huge part of your customer interactions happen before tickets are created in the form of bot interactions.
If you want insight in all of the above, you should take a look at **Zendesk QA**. This AI powered reporting and quality assessment tool dives into these pieces of data for you and can be considered the end of your journey to optimize your CX. (or the beginning, if you use that data to improve knowledge base content and agents' capabilities).
Which leaves us to the last product: **Zendesk WFM**. For large teams where agents need to be dynamically allocated to the right channel at the right team, this is the tool to go to since it will schedule agents based on your actual Zendesk's data.
## Conclusion
I hope this overview gives you some insight in what Zendesk has available today and how the different products interact. If you work for Zendesk and see a glaring mistake in my logic, please reach out.
# Other releases at the event
## **Outcome-based pricing**
> Starting in July, we will transition to outcome-based pricing for AI agents, focusing on automated resolutions. This new model aligns with the value delivered by AI agents—charging only for issues they resolve autonomously. Automated resolutions will replace the former Zendesk bots’ Monthly Active Users (MAU) and Answer Bot Resolutions pricing models. See [About automated resolutions for AI agents](https://support.zendesk.com/hc/en-us/articles/5352026794010?ref=internalnote.com) for more information.
Zendesk has always been an agent-driven company where you paid a fixed fee per agent, and got an "unlimited" amount of tickets in return. A few years ago their legacy Answer Bot worked with a the 50c/resolution fee, but with the arrival of Zendesk Suite these resolutions were included into Suite.
Now, with AI Agents, Zendesk once again will shift towards a price per interaction on top of the cost for agents. It's logical from their perspective since an increase in bot driven interactions means a potential decrease in licensed agents. And, as companies grow, with the use of both the AI Agent and Agent Copilot, we can only assume that agent count in companies no longer rises at a similar rate as ticket count does.
I do however hope Zendesk takes Agent count into account when pricing this tool. A "you get a 1000 resolutions per agent, and pay for any additional overage" would scale a lot nicer when it comes to budgeting your Zendesk yearly. Let's see where this goes in July..
## Agent Copilot
There's a cool online demo of Agent Copilot available [here](https://www.figma.com/proto/Rck4L1TzJIh6rkK5LpAiUU/Copilot-user-testing-and-demo?page-id=1%3A7000&type=design&node-id=2003-338&viewport=-13973%2C-9115%2C0.85&t=vk0YlK0EL7fPbeOB-1&scaling=contain&starting-point-node-id=2003%3A338&ref=internalnote.com).
## Suggested Reply
One feature that will soon be available as part of the Advanced AI-add-on is a new *Suggested Reply* option for the comment field. Zendesk will take knowledge base content, the conversation, macros and previous tickets into account to generate a first response to the customer. The agent can accept the response with a `tab` and edit where needed before sending it off to the customer.
This feature is independent of Agent Copilot and is only available to customers who haven't (or will not) enable the Copilot. Once you enable Copilot, which offers more powerful reply generation, this feature is deactivated.

## Personalization session
One of the more interesting settings I followed was one done by the Custom Objects and Zendesk Personalization team, that manages, among other thing [Custom Objects](https://internalnote.com/tag/custom-objects/) and [Custom Statuses](https://internalnote.com/tag/custom-ticket-status/).
They gave an overview of the new capabilities coming in Q3 to Zendesk, namely we'll *finally*be able to make lookup fields available for end-users, and custom statuses can be linked to forms.

End-user editable lookup fields will show a dropdown on Help Center forms with a list of custom object records. These can optionally be filtered against the logged in user or their organization.
Custom statuses on the other hand will soon be dynamic and you can choose which statuses should be shown for a specific form. Your Return Form can be linked to a "processing", "waiting for delivery" or "waiting for payment", whereas your Repair form can have a "send to supplier" or "RMA requested" status. (I hope we can soon also link them to groups or contextual workspaces too)

# The Event
I went together with good friend and colleague Thomas D'Hoe with whom I work at [Premium Plus](https://premiumplus.io/?urm%5Fsource=internalnote&ref=internalnote.com). Nothing better than doing these events with company, it doesn't leave you stranded on the show floor, and you can discuss the days learnings with a good beer once the main thing wraps up.
Zendesk Relate was hosted at the Venetian. Vegas being Vegas this means a giant expo zone next to the slot machines with limited daylight and an expensive Starbucks right around the corner.
That being said, once you enter the show floor the entire expo hall really had a Zendesk vibe with everything build in wood, soft colors and a uniform branding across the booth.
The expo hall was split into multiple zones, each dedicated to a specific part of Zendesk's ecosystem: Zendesk, partners, community and social projects. Adjacent to the main expo hall, we had meeting rooms and presentation rooms.



## Zendesk Area
Center in the room were the Zendesk product booth staffed with product managers and other team members who actually worked on the products they were showing. There was an AI Agent (Ultimate) booth, an Agent Copilot booth, 2 stands dedicated to QA and WFM and one with a focus on Employee Experience, each of them having rolling demo's of the newest features.
Right at the edge of the Zendesk zone were two boots I spend a lot of time with. One was the platform and security booth, hosting all the amazing people who build the security, platform, api, app tools and custom object features in Zendesk. Right across that booth was the Marketplace booth, where I *finally* had the chance to meet the people who approved dozens of apps and themes I've submitted for [Premium Plus](https://premiumplus.io/?ref=internalnote.com) over the years.


The nice thing about these demo booths is that the people running this were, as mentioned, those that worked on the products. This gave customers the chance to ask really deep questions and have the people there to answer them. And it gave people like me the chance to kidnap a product manager and have an hour long talk about Agent Home (thanks Zac!). Needless to say, for a Zendesk geek like, this led to some unforgettable experiences.
Expanding on these demo points was the Expert Bar, where customers could talk to a concierge about their product question, and they would be assigned to a separate zone where support agents and advocacy would try to get their problems or questions resolved.
So if you want one tip if you consider going to Relate next year: if you have a product question, make sure to list them in advance, have your list ready and make sure you can give the why/what/how and you're bound to get some good insights!
## Partners
Flanking the Zendesk Area were two zones for Technology Partners. I spoke to the people from [Snapcall](https://www.snapcall.io/?ref=internalnote.com), a way to integrate video into your support flows, [Salto](https://salto.io/?utm%5Fsource=internalnote), a tool to backup and monitor your Zendesk instance, [eOne Solutions](https://www.eonesolutions.com/?utm%5Fsource=internalnote), a code-less integration platform, and [Deepl](https://deeple.com/?utm%5Fsource=internalnote), a translation plugin.

It's nice to see the synergy between the partners and the Marketplace booth. I heard a story of a customer who went to the Marketplace booth to ask about an approval flow, and them promptly looking for one of the partners that offered the solution, and calling them to introduce the customer.
## Luminaries and meeting rooms
Events like Relate are not only Zendesk's opportunity to introduce new products, but they are also a great place to connect customers, partners and their team. The expo had plenty of formal and informal places to have meetings, catch up in couches or sit at long tables and start talking to people in a semi-coffee-bar-vibe.

I'm part of the [Zendesk Luminaries](https://www.zendesk.com/mc/luminaries?%5Fga=2.38843877.739096385.1713551020-2003985015.1713293625&%5Fgl=1%2Arb9b6f%2A%5Fga%2AMjAwMzk4NTAxNS4xNzEzMjkzNjI1%2A%5Fga%5F0G6FC9CS2V%2AMTcxMzYxNTUzNS4zLjAuMTcxMzYxNTUzNS42MC4wLjA.&ref=internalnote.com) program, a group of amazing people from across the world who love to share their experiences around Zendesk with each other and other customers. The Expo had a dedicated lounge to relax and get away from the busy expo floor, but due to the fact that other Luminaries obviously also used that area, it led to plenty of impromptu conversations. Really fun!




# Wrap up
So, Relate:
- Keynote and sessions: 8/10\. Really interesting, but sadly some overlapping sessions so I had to miss some and make some painful choices.
- Booths and information: 10/10\. Bringing product people to the show floor instead of sales people was a very smart move.
- Partner area: 9/10\. They were visible within the main zone, very clean booths and a nice variety of technologies and tools
- Venue: it's Vegas. You love it or you hate it.
See you next year.
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### What's new from Zendesk Relate: WFM, QA and Zendesk’s new vision.
URL: https://internalnote.com/zendesk-relate/
Last updated: 2024-11-05T10:01:58.000Z
The [first part](https://internalnote.com/zendesk-relate-day-1/) of this Relate series gave an overview of the Keynote and dove into the world of Zendesk AI, with AI Agents and the new Agent Copilot.
In today's newsletters I'll write about the to remaining topics: Workforce Management (WFM) and Quality Assessment (QA), and wrapping things up with some comment on Zendesk's new product vision.
Where Zendesk AI is an enhancement of Zendesk Support and a shift towards automation, WEM and QA are new directions for Zendesk that build on top of the existing Suite, further integrating Zendesk as a solution not only for traditional customer care, but offering options for managing the people who actually handle the tickets, and giving the same quality of support to the employees in your company.

## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# Zendesk Workforce Engagement.
> Introducing Zendesk WEM: Workforce Management en QA. AI Powered WEM is essential for AI-first service
Last year Zendesk bough Tymeshift, a leading workforce manager and scheduler that's been purpose built for Zendesk, and Klaus, an AI powered Quality Assurance tool.
This year we see the fruition of these two new additions to the Zendesk family with the launch of Zendesk WEM. A new suite of AI powered capabilities that add workforce management and QA to your Zendesk Suite.
It's a new suite of capabilities that's lives at the end of your CX lifecycle giving you insights in staffing, workloads and quality. Together with reporting you can use this data to improve your Zendesk setup and raise team efficiency and csat.
# WFM - Workforce Management

The main value proposition of the new Zendesk WFM is this simple truth: of your company has too many agents then you'll have a high labor cost without a lot of agent efficiency. On the flip-side, if you have too few agents, you'll have an increased resolution time and angry or dissatisfied customers as a result.
Enter Zendesk WFM: Predictive Workforce Planning, the managing tool formerly known as Tymeshift.
The tool gives you insights in ticket volume, allows you to predict staffing and has an AI engine that dynamically creates your agents' schedule, assigning them to different channels to have the most efficient availability across your team.

Zendesk WFM will also allow you to track agents time so you get insight in average handle time, schedule adherence and, if you want, you can even track time spend outside of Zendesk, so you get an insight in the work done in your CRM, documentation or other online tools.
And to complete the feature set, the reporting dashboard gives you insight in unexpected ticket surges, allowing you to dynamically reassign your team to different channels.
# Zendesk QA

Better ticket handling and higher quality customer interacts leads to happier customers. However, to get insight in how your agents are handling tickets team leads traditionally need to review tickets manually. This review process takes time and, according to Zendesk, they traditionally see only 1-2% of tickets getting an actual review.
This means 98% of your ticket interactions are left in the dark, and these unreviewed interactions are a potential disaster waiting to happen.
Enter Zendesk QA: an automated way to know the quality of all your interactions. The new tool checks the service quality of all tickets, surfaces potential coaching opportunities and highlights knowledge gaps at the agent level.
It also checks grammar, verifies if the ticket actually resolved the initial inquiry and flags interactions a team lead should review
And as a company you can also add additional checks to see if agents use your predefined greetings, use the right product names, and use the right tone of voice.
## VoiceQA

Traditional QA tools run on text-based tickets like chat, social messaging or email. However, with the newly introduced VoiceQA Zendesk will now transcribe all phone calls your agents make with customers and leverage that info to do a full QA on those interactions too. Compatible with Zendesk Voice, Aircall and Amazon Connect, VoiceQA checks those interactions for sentiment, tone, dead air (silence) and all other elements mentioned in the previous section.
This means that, if you were already using Klaus, you now get insight in all your interactions across text **and** voice.
## AutoQA for AI Agents

Aside from text and voice there's one major part of your customer interactions that should be measured and that's those of your AI Agent. Since up to 80% of customer interactions can be driven by your bot, it's important you can measure how accurate, and positive these interactions are. So with the new AutoQA for AI Agents you can now measure their performance the same way you would get data on your human interactions. (It still feels weird treating AI Agents as a real entity similar to humans. I sure hope we're not moving towards a Blade Runner future)
## Spotlight

The last part of the QA announcements gave us Spotlight, a new Conversation Discovery Engine powered by Zendesk AI. It provides an overview of all your customer interactions and flags potential issues like churn risk.
You can then triage these conversations and escalate these customers so you can reach out and try to fix the issues going on.
# My take
As I've described the second half of the AI announcements you might have noticed how unfamiliar I am describing these elements. Zendesk has always been a ticketing system at its core and writing about and working with automations, agent efficiency and self service has been a part of my professional carrier for over ten years now.
At last years' Relate Zendesk took their Zendesk Suite and sprinkled some AI magic on top of existing and familiar flows and product features. This years' Zendesk however breaks from that norm and re-envisions Zendesk as a complete new product approach.

I took this picture a bit to soon and the right most graphic is missing 😅
Zendesk Suite now starts with being available to customers across any channel. You can automate that frontline and offer self service to your customers with the new AI Agents. Anything that bot can't handle is triaged and routed to the right team via Zendesk's intelligent triage powered by intent detection, sentiment analysis and the new queues and routing engine.
Once a ticket gets routed to the right team, the Agent Copilot, Knowledge panel with quick answers and the Intelligence panel gives agents an assist in automating and handling the ticket.
And finally the new WFM and QA tools allow you to make sure the right people are there to handle the influx of tickets, while keeping an eye on quality at the same time.

In this *new* Zendesk the existing Suite products (Help Center, Support, Messaging) are just parts of a bigger engine powered by Ultimate, Klaus, Tymeshift and Zendesk itself, bringing a cohesive and integrate story to companies who need a tool for CX and EX.
Is it perfect? No. There's still confusion about how the Ultimate/Zendesk Bot integration will go. The two products are still distinct entities and I can only assume it'll take another year to integrate the two platforms.
Similarly, even though the approach described about feels like a cohesive marketing story (and don't take this as a negative, I really like this new vision and approach), the actual product is still fractured when you look at it in detail. If you want to get a full insight in a tickets' journey, you need to get reporting insights from the new Bot insights dashboard to measure bot deflection rates, need to look at Explore to get insight in tickets, backlog and intents, and need to jump into the QA spotlight to detect quality and efficiency once tickets are closed. Three dashboard for three stages of a tickets journey.
That being said, Zendesk Relate has always been more about showing where Zendesk is steering its ship and giving us insight in the future, than being a celebration of past successes. Just like last years' Relate showed the initial version of Zendesk AI, which *just* came into fruition with the GA of all AI features right before Relate, I think next years' Relate will tell if Zendesk can deliver the story it told this week.
Thanks for reading!
### What's new from Zendesk Relate: AI Agents and Copilot.
URL: https://internalnote.com/zendesk-relate-day-1/
Last updated: 2024-11-05T10:01:46.000Z
Today was the first day of Relate, Zendesk's flagship event where they announce new features, give insights in customer and employee experience trends and showcase their products and customers. The day started with the Main Keynote, presented by Zendesk CEO Tom Eggemeier, SVP Marketing Lisa Kant and SVP Product, Paxton Cooper.

First on stage was Kelly Waldher, Zendesk's CMO introducing their new ad campaign, followed by Tom Eggemeier introducing the topic of today's keynote.
# The customer is always human
Every customer interaction starts with a customer that reaches out. So even in a world where AI is everywhere, there's still at least one human involved in the interaction.
That could be a customer asking a question, an agent handling the request, or a manager reviewing quality. So when you're developing a platform that deeply integrates AI, that AI should still put the human first.
Speaking of AI, Tom put out three bold predictions. He thinks that by 2027 all interactions will somehow involve AI, that 80% of these will be resolved without an agent action, and that the end result will be a higher satisfaction score.

You might ask, if all these interactions are automated, what's left for agents? For one, while more tickets get automated, the amount of interactions will also steadily rise. And, the remaining tickets that agents handle are those tickets that are higher value work, less monotonous and highly rewarding. Agents will become managers of the AI. Its editor and supervisor.
# Complete solution for the AI era

> The most complete AI-powered CX solution with the launch of AI agents, AI copilot and new ways to tailor your AI
At the center of this new Zendesk is Zendesk AI, that powers AI agents, Agent copilot, Workflow automation, Assessment and Workforce Management, with manager insights via reporting, and build on a secure and trusted platform.

It's no surprise that Zendesk Bots were the first of three topics today. Last year's [Relate launched Zendesk first foray into AI](https://internalnote.com/relate-2023/), and throughout the year they kept building on top of this initial release by launching improvements continuously.
Right before Relate, Zendesk announced the purchase of Ultimate, and the new AI Agents show a vision of how the integration of these two platforms will look.
# AI Agents

First we had Answer Bot, then we got Zendesk Bot, and today we have.. Zendesk AI agents.
Zendesk AI agents are designed to work independent or alongside agent to resolve customer inquiries, or route them to the right agent with context. They act as a personal concierge, always on call.
To start, Zendesk announced a major shift in their strategy. Instead of selling the Zendesk Bot as part of an add-on, starting now , every Zendesk customer will get Zendesk Bot, or Zendesk AI Agents as they're called now, included in their Suite offering.
This also means that the Zendesk AI add-on is repositioned as tools to assist Agents in the Agent Workspace, helping with things like automations, summarization and tone shift.

By leveraging more powerful bot flows and a new AI dashboard with insights and metrics, Zendesk hoped to reach the goal of 80% of interactions to be automated or assisted by their bots.
From a product side, most of the changes available now were already available in EAP, but our now available to all users of Zendesk AI and bots: Generative replies which turns articles into personalized answers and Bot Persona, which allow you to tweak a bot's tone of voice.
The new insights dashboard is available as of today via the Admin Panel > Bots and includes a 7-day performance overview with metrics such as active users, amount of transferred tickets, and automated resolutions. The insights dashboard also has a conversation review feature to see the interactions that were or weren't automatically resolved.

## Ultimate
Woven into this presentation were mentions of [Ultimate](https://ultimate.ai/?utm%5Fsource=ppinternalnote) and it seems Zendesk is shifting their entire Bot strategy towards an engine and platform build on top of Ultimate's technology, with the added benefit of having Zendesk's intents models as the basis to make sure that customers who start without any data or tickets do get immediate value. But I assume for the short term the bot we'll get is Zendesk's bot, and that throughout 2024 (and 2025) we'll see more and more of Ultimate's tech appear.
# Agent copilot (patent pending)

The second major release today was the announcement of the Agent Copilot.
Where AI Agents are there to directly answer to customers and resolve as many inquiries as possible via self service or automated workflows, Agent Copilots are there to assist agents in their day-to-day job.
The Copilot lives right inside the ticket comment field and offers agents suggested responses or actions they'd want to execute on the ticket.

The demo showed for example a customer needed to upgrade their license to get things working again. The Copilot detected this intent, offered a variety of upgrade options to the customer (pulled in via API from another tool) and executed the upgrade, while proposing generated replies to the customer to the agent to approve or edit.
What's nice is that the agent can intercept the conversation at any time and add nuance to the Copilots' actions, like offering a discount by writing it down as a command for the Copilot ("add a 10% discount). The Copilot will learn this behavior and suggest the discount out of its own the next time.
The power of this solution is that it keeps the agent in control of the conversation and business process, but that the boring tasks like asking for an order number, executing a refund, updating the ticket fields all get automated, while they agent can focus on making sure it's the right steps to take.
For now, as with all major announcements Zendesk's makes, this Copilot is an EAP with a very limited scope. It'll only work for e-commerce companies that run on Shopify, but product managers on the show floor told me they want to this scale up **quickly** towards other industries (you need a good grasp of intents for this to work) or other platforms (if it has an API it should be connectable right?).

But the fact that it turns agents into supervisors or approvers of a digital copilot will have a major impact on not only the workload of existing agents, but also will make onboarding new agents on a team easier.
Instead of agents needing to learning all new processes and company tools, reading and copying replies from colleagues on similar tickets and validate their work with team leaders, they can now *trust* the actions of a trained copilot that has learned from the actions their more experiences colleagues, and jump right into the flow of tickets. Or at least, that's the promise the Agent copilot entails.
# Workflow Automation

The final part of the AI product announcements was an overview of how the infusion of AI across the platforms allows for a more automated workflow across your CX (and EX) experience.
A customer that interacts with your company over any of available channels.
Zendesk's intelligent routing assigns the conversation to the AI Agent or human agent based on intent.
Once assigned to a human agent, the Agent Copilot jumps into action to handle as much of the conversation as possible, leaving the agent to supervise the ongoing interaction. And finally we can use intent reporting and the new staffing, and quality assessment features to get insights in how we can improve our CX experience and efficiency. (More on Zendesk WFM and QA in tomorrows newsletter)

# Other releases
Aside from the main AI announcements on the stage, Zendesk also announced a slew of other improvements via announcements on the Zendesk Help Center.
## Small Talk (EAP)
Zendesk Bots are very strict in that they only use knowledge available within your own Help Center. This means you, and your customers, can be sure that what the bot says comes from a trusted source, and chances of the bot hallucinating are small to non-existent.
The downside of such a narrow field of knowledge is that the bot is not very good in filling gaps in the conversation. If a customer says *"Good Morning"*, or assumes they're talking to an agent and asks *"How are you"*, or reacts with *"I'm not sure*", the bot will currently react with a "*I'm sorry, but I don't get what you're asking..*".
With the announcement of the new *small talk* EAP, this behavior is now changed and the bot can react in a more context-aware way with phrases like "Good day to you to!", "I'm fine thank you" or "If you're not sure, ...". The bot will still only reply to actual inquiries with your Help Center content, but can act more "human" in other scenarios.

## Generative Search EAP in Agent Workspace and Help Center (EAP)
Not every support interaction happens within the Zendesk Widget or over social channels. Many customer will still Google a problem, or go to your Help Center to find a solution for their issue.
Similar to how the Generative Reply for the Bot will turn an article into a short answer, the new [Quick Answer feature for the Help Center](https://support.zendesk.com/hc/en-us/articles/7057446125082-Announcing-generative-search-for-help-center-EAP?ref=internalnote.com) will put a generated solution for the customers' question above the search results on the Help Center. Since this feature is part of the Help Center theme, Zendesk also made this [available](https://support.zendesk.com/hc/en-us/articles/6942732527130-Generative-search-for-help-center-EAP?ref=internalnote.com) for custom themes adding a new `{{generative_answers}}` placeholder to the theming templates capabilities. (Can’t wait to test this and see how customizable the design will be, stay tuned!).
In a nice twist, where the Bot only takes Knowledge Base articles into account, the Quick answers in the Help Center also use [content added via Federated Search](https://internalnote.com/tag/federated-search/).

Additionally this feature also becomes available Agents in [Agents Workspace](https://support.zendesk.com/hc/en-us/articles/7057417152538-Announcing-generative-search-for-Agent-Workspace-EAP?ref=internalnote.com) too, with a nice upgrade to the Knowledge Panel. When an agent searches for information while working on a ticket, a summarized answer is displayed above the search results. Agents can then copy those answers into their comments.

## Custom Intents
One major feature, and one that was both one of the major limitations and biggest differentiators between Zendesk and Ultimate, was Zendesk's lack of customization when it comes to the modal and intents the platform uses. Zendesk AI was released with a limited set of supported industries (retail, tech, finance) and grew the last year to support HR, Hospitality, IT and travel sectors.
If you matched one of the industries you got the benefit that Zendesk AI worked right out of the box without custom training requirements. However, if your industry didn't match, or if your use cases were so unique that the default intents are a poor fit, Zendesk AI doesn't work as well. You'd need to move to Ultimate with its ability to generate custom models and intents if you want to get the real benefits of AI.

Just before AI Zendesk announced the capability of [adding custom intents](https://support.zendesk.com/hc/en-us/articles/6298065502874-Viewing-and-managing-intelligent-triage-predictions?ref=internalnote.com#topic%5Fpv1%5Fm5b%5F1bc) to your models. It comes with a twist though. Instead of training a specific model for your instance on the fly to map tickets to the intent, you can *request* a new intent by submitting an intent description and sample tickets to Zendesk's data team. It's not really clear if intents get approved by default, what the wait time is and if that intents is unique to your instance or get aggregated into the industry models Zendesk provided across its customers.
For now I'd advise: if you need custom models to fit your needs, ask Ultimate for a demo. They're part of the Zendesk family and offer much more powerful capabilities that will better fit your needs.
Speaking of customization, another EAP that got announced was the ability to define custom entities Zendesk can detect in requests. Similar to how we can already detect credit cards or names for redaction, the system can recognize an order number in a customers' response and update a ticket field accordingly.
# My take
Every movie trilogy has its beginning, middle and ending. The first episode creates the world, defines the guidelines and introduces us to our heroes and villains.
The second episode expands the world, allows our hero to grow while challenging their expectations and ends with a major cliffhanger that leaves us wanting for more.
And the final episode closes the story arc across all three movies, resolves open threads and allows our hero to triumph. But like any good ending, it also redefines the universe it's playing in.
The same can be applied to Zendesk AI's story arc. Relate 2023 introduced us Zendesk AI on the cusp of OpenAI's ChatGPT revolution. It redefined how the Zendesk Bot functions, added powerful capabilities for agents and showed us what's possible when you combine AI and CX.
Zendesk's AI event in October last year gave us an update that expanded the AI capabilities to Voice, added Similar and Mergeable tickets to the Agent Workspace and introduces Generative AI for the Zendesk Bot. I concluded [my article](https://internalnote.com/zendesk-ai-drop-keynote/) on the event with:
> Now, half a year later, this event feels like an Act II that adds a lot of missing pieces and makes the entire idea of an AI add-on worth while. The automated intent mapping combined with Generative AI makes it possible to empower an entire new Zendesk Bot experience that will change the way customers interact with your Self Service offerings.
That event delivered on the promises of the original Advanced AI add-on, and made it actually worthwhile to purchase, while still leaving some major items like custom models out of reach.
Today's keynote can be considered a Part 3 of our AI trilogy. It reshuffled Zendesk's AI offering. This event makes the Zendesk Bot capabilities available for all Zendesk Suite customers, showing the world that it's ready and that Zendesk is, in their words:

By turning the Advanced AI add-on in an Agent focussed set of features they give themself room to sell AI capabilities that integrate with Agent Workspace to users who need that kind of advanced workflows and insights. But they don't lock their most marketable features behind a paid add-on. By making the bot features part of Zendesk Suite they can differentiate themselves from competitors like Freshdesk or Salesforce and give value to their customers, while giving them a sample of what AI can do for CX, hopefully converting the customer to an Advanced AI customer in the process.
Similarly, I see a future where Zendesk turns Ultimate's custom models in an Enterprise feature, upgrading Zendesk's own pre-trained industry models with custom models for each Enterprise customer. This way they give these companies who probably need this kind of customization the most a fitting model for their types of inquiries and tickets, while conveniently turn Ultimate into a nice upsell reason towards Suite Enterprise
One thing I'm really excited about is the new Agent Copilot. It's still early days, and its capabilities are limited to generating replies and doing some basic actions in Shopify, but from what I've heard the idea is to allow *any* kind of integration by allowing developers (someday) to create their own LLM prompts for the Copilot, while talking to their own platforms or APIs.
Exciting stuff!
💡
Stay tuned for part two of my Relate 2024 coverage where we dive into the world of WEM and EX!
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Beyond triggers. Moving to queue only assignment in Zendesk
URL: https://internalnote.com/beyond-triggers-moving-to-queue-based-assignment-in-zendesk/
Last updated: 2024-11-05T10:01:54.000Z
Earlier this week I published an [Introduction to OmniChannel routing](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/) that gave an overview of the new ways Zendesk allows you to assign tickets to agents and groups making use of availability, agent skills and ticket priority.
I ended the article with the following thought:
> It's important to know that queues still require the existence of the `auto_routing` tag to work. But I am tempted to forgot assignment triggers completely and only rely on queues.
This article will dive into the specifics on how this kind of setup could work.
# The basics
Let's recap the basics first.
In a traditional Zendesk setup a ticket is created and we have triggers that set the ticket priority and assign the ticket to a specific group based on the ticket channel, category or form.
Omnichannel Routing picks up these tickets and use agent availability and capacity to assign the ticket to the best agent at the time.
But now that we have queues we can also use them to route tickets to the right group or groups based on conditions. Which creates an issue since we now have two competing systems – triggers and queues – that battle for assignment. And it also makes setups complicated because we need to take both into account to get the complete picture of how our assignment rules work.
Even worse, imagine a trigger assigning finance tickets to *Sales*, and a queue assigning them to *Finance*. Understanding which one "wins" requires a lot of reading Zendesk documentation and it's not clear from the get to.

So my idea is to make this easier and go all-in on queues and Omnichannel Routing.
Let's dive in.
# Situation Sketch
We have a Zendesk environment with two forms: a *Support Form* and a *Sales Form*. There's two corresponding groups of Agents: *Support Team* and *Sales Team*.
We also setup Omnichannel Routing with an `auto-routing` tag, and we've configured agent statuses and capacity rules.
Our goal is to creating routing rules that will assign all Support tickets to the support group, and the Sales tickets to the sales group.


# Triggers
Now for the radical part: I have deactivated **all** triggers that assign tickets to groups or agents. They are replaced by two triggers.
### Enable Omnichannel Routing
This first trigger adds my Omnichannel Routing tag `auto-routing` to all created tickets. This enables the tickets to be routed.
### Set Default Priority
It's also best practice to set the priority of every ticket created. Ticket Priority is taken into account for the order in which tickets are routed to agents and are required for SLAs to work. So I have the habit of setting all tickets to priority *Normal* by default and then we can always add additional triggers to shift the priority to urgent, high or low based on specific conditions.


# Queues
Before queues we would have setup a Zendesk environment via triggers with, in our case, two triggers.
Now that queues are here, we can move all that logic into queues.
## Support queue
First off, let's create a queue for ticket submitted through the support form. Similar to triggers, we set the conditions (e.g. form = support form) and then we select a primary group to handle these tickets. In our case, this would be the support group.


## Sales queue
Our second queue is a queue that looks for tickets with *Form is Sales Form*. We assign these to the Primary Group Sales.


So far, this works similar to how we would setup a trigger in the past. But queues have some niceties to them. We can use the priority field to decide how queues should handle ticket collisions.
### About priorities
Imagine we have two types of tickets for Sales: Product Info, and Quotes. We can create two queues for sales. A Quotes queue with a priority 1, and a Product Info queue with priority 2\.
If we now have multiple customers sending in a requests, some about quotes, some about products, this will make sure that the quotes tickets get priority over the products. And within the queue, tickets are then handled by priority and creation date.

## What happens now?
When a customer creates a ticket, this ticket will be tagged and enable Omnichannel Routing to start doing its thing.
1. A ticket is created in Zendesk for the Support group
2. The ticket is assigned to the Support queue. You can verify this via the ticket events view.
3. Once an Agent becomes available the ticket will be assigned to them.



There's a few things that are handled different than in traditional trigger based routing:
- Queues only assign tickets once an agent becomes available. So until a ticket is assigned to an agent, it's group is set to -
- Available agents can mean: someone goes online, someone has capacity (e.g. they can handle 3 conversations and they just closed one), or someone has a matching skill
- Once a ticket is assigned to an Agent, it will show up in their Agent Home. They can work, with confidence, from just Agent Home, and you can be sure all tickets will be assigned and handled in the right order, without cherry picking.
### Queued tickets view
Since tickets are only assigned to groups and agents upon agent availability, I advise you to create a view for Team Leads that shows the queued tickets. Even though agents get tickets offered as they have capacity, a team lead might want to know the backlog still in the queues.
They can use that view to manually assign specific tickets that they feel should be handled *now*.
💡
Zendesk has announced further insights in queues in May with average waiting time, number of tickets in the queue etc.


## Fallback queue
One of the benefits of using queues instead of triggers for assignment is that the admin center reads a lot clearer. In one view you can see the queue name and its associated primary and secondary groups for assignment. Whereas in triggers you would probably need to give them very descriptive names to get name, group and conditions visible for agents.
This gives you the benefit that, at a glance, you can detect issues with your assignment rules and reorder or edit them as needed.

As you'll notice in the screenshot above, my queue list ends with a Fallback queue. This queue basically makes sure that all tickets are routed to an agent, even for scenarios I didn't take into account in the queue conditions above.
In the example below a ticket was created in the Complaint Form. Since this is not an existing condition in any of my queues, it's assigned to the fallback queue.
That queue has the sole condition if *Group is -* and has a priority of 100, while being added as the bottom most queue. This makes sure that these tickets are added to a queue, but will be handle with the lowest priority.




So when a customer creates an unmapped ticket, the ticket is assigned to the fallback queue. Then once an agent of any of the primary or secondary group is available, they get the ticket assigned in their respective group.
# Conclusion
The approach above might be a bit radical if you've been using Zendesk for a while. It moves away from assigning tickets to a group, and fully dives into the concept of Agent assignment. It makes use of Agent Home, skills and availability and makes sure that tickets are handled by the right person. By assigning to agents it prevents cherry picking and gives you a top-down control over assignment.
There's a few things I would love to see though. A native way to view queued tickets **by queue** would be a nice starter for example.
For now, I've redesigned my own Zendesk instance to make use of this now approach 100% and I've moved all assignment to queues and omnichannel routing. It's a bit experimental, so keep an eye on the blog for updates on how it works in a few weeks.
### Zendesk Roundup for April 2024
URL: https://internalnote.com/roundup-2024-04/
Last updated: 2024-05-06T18:54:16.000Z
Happy Easter to all! The first quarter of the year has passed already and we're swiftly moving into Spring and Relate season!
In two weeks I'll be joining hundreds of Zendesk customers at Zendesk Relate to (hopefully) get a preview of Zendesk's new product features and roadmap. There's tons of sessions on AI, CX and Employee Experience, so yeah, really looking forward! If you're at Relate, let me know via the Chat below or reach out via LinkedIn.
Let's dive into this month's announcements!
# 🏢 Company
## Ultimate acquisition
Zendesk itself hasn't sat still this month. Where I called [February](https://internalnote.com/roundup-2024-03/) a quiet month, Zendesk decided to start March with a major announcement: they're [acquiring](https://www.zendesk.com/newsroom/articles/ultimate-acquisition24/?ref=internalnote.com) Ultimate.ai, one of the best ticket automation and AI chatbots on the market!
If you've missed it, I've written an [extensive overview](https://internalnote.com/zendesk-acquires-ultimate/) of what it might mean for the Zendesk platform right after the news dropped. And after the news broke, we got this short quote from CEO Tom Eggemeier:
> We believe that somewhere between 70% and 90% of interactions are going to be through AI agents in the future. And Ultimate has done a really nice job solving up to 80% of interactions via their AI agents
[Zendesk adds flexible AI agent capabilities with Ultimate acquisition | TechCrunchZendesk is acquiring Berlin-based startup Ultimate.ai, giving the customer service company access to AI agent technology.TechCrunchRon Miller](https://techcrunch-com.cdn.ampproject.org/c/s/techcrunch.com/2024/03/13/zendesk-adds-flexible-ai-agent-capabilities-with-ultimate-acquisition/amp/?ref=internalnote.com)
Can't wait to see how the Ultimate product getting integrated into Zendesk!
## New Help Center design
The Zendesk Help Center ([support.zendesk.com](http://support.zendesk.com/?ref=internalnote.com)) has been completely redesigned and restructured. It's gotten a brand new theme that better matches the new style [announced](https://www.zendesk.com/newsroom/articles/zendesk-brand-refresh23/?ref=internalnote.com) at last years' Relate, all content has been reorganised in new sections, and the search has been reworked.

There's some rough edges to the design though. Personally I find the text a tad too small to conformably read and some elements are a bit weird when it comes to alignment and margins. But search is the worst of the redesign. The snippets are very short, not always relevant to the search query and the results page has more UI than actual results upon first load.
It's the article pages where the design shines though. The new colours and font read like a newspaper, and if you zoom in a bit they're really nice on the eyes to read. Especially on a tablet.
# 🎉 New Releases
## 🤖 AI Powered Conversational Experiences
Messaging got the short end of the stick this month. The only news worthy upgrade we got was the ability to use variables in the Send Message step for buttons and images. Where you previously could only do this in a dynamic carousel, it's now available for Messages too.



## 👨🏻💻 Agent Workspace
### A modernised conversational experience for Agent Workspace (beta)
Zendesk Agent Workspace is [modernising the ticket conversation interface](https://support.zendesk.com/hc/en-us/articles/6900372839834?ref=internalnote.com) with new visuals and navigation improvements. Phase 1 introduces a new look, agent badges, message grouping, and more. Phase 2 will bring navigation enhancements like pinned notes, collapsed messages and more shortcuts.
Traditionally Zendesk has always been an email first tool. The ticket view displayed tickets as email conversations with replies in a list, similar to how email threads in your email app would look. With the move towards social and chat having this type of content as a basis to display interactions often felt strange. When chatting over WhatsApp customers have a tendency to send a burst of short messages, in place of a long formatted email.

With this new beta we see the Agent Workspace move towards a conversation first layout. Messages are grouped under a single header, they look like text balloons and the interface looks a bit more dense.
There's some rough edges, especially when it comes to rendering emails or long threads, but I like the refreshed look and feel for messages.
My favourite design change? The new set of icons for the channels

### Generative AI for Agents
Most of the Generate AI features available to Agents that are part of the Advanced AI Add-on are now generally available and no longer in early access. For customers subscribing to the add-on this means they now have access to ticket summary, expanding agent comments and adjusting the tone of comments right out of the box!
### Omnichannel routing queues
Queues are a totally new way of assigning and routing tickets in your Zendesk instance. They allow you to route tickets to multiple primary or secondary groups based on ticket conditions and agent availability. They give a better insight in how you've setup your routing, while making sure tickets get assigned quicker by routing them across groups and agents with less restrictions.
[Announcing custom omnichannel routing queuesAnnounced on Rollout starts Rollout ends March 11, 2024 March 11, 2024 March 25, 2024 Zendesk is pleased to announce the ability for admins to create additional queues for omnichannel routing.…Zendesk help](https://support.zendesk.com/hc/en-us/articles/6866051942042-Announcing-custom-omnichannel-routing-queues?ref=internalnote.com)
💡
Earlier this month I [published an introduction to Omnichannel routing](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/) on the blog. And literally a day before I wrapped up writing the article Zendesk dropped the new queues features. I shortly went over the feature in the article, but expect a deeper overview next week.
### SLA redesign
Last year Zendesk redesigned the Service Level (SLA) page to handle the new Group SLA and resolution metrics. Now they've expanded SLA's to allow for rules expressed in seconds, and gave the whole page yet another redesign.
We've now got three collapsable sections for reply time, update metrics and resolution metrics, and each of them contain a set of rules which can be defined in hours, minutes and/or seconds. It's a less dense and cleaner layout, and I like the more granular time slots it allows.

❓
Only question: does this mean we might someday get automations that can run after x minutes or seconds? Or will those forever stay stuck on hourly intervals and conditions?
### Follow Up reassignment
To conclude the Agent Workspace releases this month, we get a small but welcome addition to the Ticket settings page. We can now choose if follow-up tickets retain or loose their original group and assignee.
Where retaining the setup is useful for scenario's where an issue is not yet resolved, there's also plenty of scenario's where customers reply to closed tickets for completely different issues than those raised in the original ticket. This setting allows those tickets to be handled as brand new tickets, and get them assigned to the right group and agent based on it's new content.

💡
I do wonder, this setting is easily build as a trigger too, so how many of those convenience triggers like "assign to first responder", "reopen when a side conversation gets a reply", ... will become checkboxes in the future?
## 🔎 Help Center and Self Service
### Generative AI in Help center
Similar to how the Agent Workspace AI features became generally available, so did the Help Center features. For those subscribing to the add-on options like, expanding text, adjusting tone or simplifying text are now available for all instances in the Help Center
### Article Editor
The article editor got some new design updates too. Where earlier the publish, review and preview buttons moved to a new toolbar in the footer, we now get changes to the editor.
Translations have been moved from the top of the article editor to the new context panel. It allows for a nicer, less cluttered interface to manage translations. And the toolbar which used to house them now focusses solely on showing text and content editing tools.

That same editor also broke free of its container and the text editor now uses more screen space, which allows you to see more of your content at once without the need to scroll as much.
## 🧱 Open and Flexible Platform
To conclude the announcements of this month we've got a few small but welcome changes to the admin panel and platform extensions:
- [Lookup Fields on tickets can now filter](https://support.zendesk.com/hc/en-us/articles/6941856507930-Announcing-dynamic-filtering-for-lookup-relationship-fields-on-tickets?ref=internalnote.com) their content based on the current tickets' requester, assignee or organisation. This way you can, for example, only show the assets that belong to a specific user, or only the buildings occupied by the organisation requesting maintenance. (I'm working on an advanced Custom Objects article, so stay tuned for demo's for this one!)
- The[ Slack integration](https://support.zendesk.com/hc/en-us/articles/6907088602010?ref=internalnote.com) now allows you to link your Zendesk to multiple Slack instances
- The Admin Center got a small upgrade to its [sidebar](https://support.zendesk.com/hc/en-us/articles/6701676506010?ref=internalnote.com). It will now collapse open sections when you select a new section, and the sidebar will also get a minimised state so you have more room to display and work in the main container to edit Zendesk settings.
# ⚠ Major Changes
> Zendesk giveth. And Zendesk taketh away
Zendesk fixed a longstanding feature (bug) that allows you to [assume](https://support.zendesk.com/hc/en-us/articles/4408894200474-Assuming-end-users?ref=internalnote.com) admin users. That loophole is now closed.
# 💡Insights
Zendesk Engineering published a great article on how the new Semantic Search for Zendesk Help Center works.
[Semantic Search at ZendeskExplore our approach to developing embedding models at Zendesk, enhancing search quality and improving customer experience.Zendesk EngineeringArmin Oliya](https://zendesk.engineering/semantic-search-at-zendesk-616c971aa7d3?ref=internalnote.com)
> Our search infrastructure is powered by Elastic-search and has proven to be fast, robust and scalable. However, the default keyword search algorithm fails to capture the relevance when there is little word overlap between the query and documents. Semantic search addresses this by understanding the “meaning” and covers for synonyms and complex patterns that would otherwise be missed.
# 🎥 Videos
A few weeks ago I did a collaboration with [DominicCX](https://internalnote.com/asking/) on Zendesk User Authentication. If you haven't read [the article](https://internalnote.com/messaging-authentication-identify-and-merge-existing-users/) yet and rather listen to two people talk about it for half an hour, well, we've got a video for you!
# 📝 Articles this month
[An introduction to Omnichannel Routing in ZendeskThis article will give you an overview of Zendesk’s Omnichannel Routing, Agent Availability and the brand new Queues features.Internal NoteThomas Verschoren](https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/)
[How to get the most out of Agent Home for ZendeskThis article shows you ten practical tips on how to gain the most out of Zendesk’s new Agent Home.Internal NoteThomas Verschoren](https://internalnote.com/agent-home-tips/)
[SweetHawk - Zendesk apps that give you superpowers! (sponsor)My thanks for SweetHawk for sponsoring this month’s Internal Note newsletter.Internal NoteThomas Verschoren](https://internalnote.com/sponsor-sweethawk/)
[Zendesk acquires Ultimate: an in-depth overview of what the platform will gainZendesk is planning on acquiring Ultimate.ai, a leading AI and ticket automation platform. We’ve seen plenty of headlines, but what does this actually mean? This article dives into the nitty-gritty and shows what’s now possible thanks to this platform expansion!Internal NoteThomas Verschoren](https://internalnote.com/zendesk-acquires-ultimate/)
[Escalating a customer request to a Zendesk Help Center form for more information.This article shows you how to escalate an existing ticket to a new ticket form submission and merge the result.Internal NoteThomas Verschoren](https://internalnote.com/asking/)
# And Finally...
If you've ever wanted to embed a PDF document in a Help Center article, [Zendesk Product Manager Ryan McGrew](https://support.zendesk.com/hc/en-us/community/posts/4409506768666/comments/6923607300634?ref=internalnote.com#community%5Fcomment%5F6923607300634) shared a nice way to embed them without adding any custom code to your theme.
```html
```
> With all that being said, if you need to embed documents today, I recommend the following code snippet which relies on the Google PDF Viewer. You can insert this code in the [source code editor](https://support.zendesk.com/hc/en-us/articles/4408824584602-Editing-the-source-code-of-help-center-articles?ref=internalnote.com).
> In this snippet, replace \*\*{{article\_attachment\_url}} \*\*with the URL of the PDF you've uploaded to the article as an attachment. You can get this URL by opening the article settings, scrolling to the Attachments section. From there you can right click the attachment link and click "Copy link address" or open the attachment in a new tab and copy the URL from the navigation bar of your browser.
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### An introduction to Omnichannel Routing in Zendesk
URL: https://internalnote.com/an-intro-to-omnichannel-routing-in-zendesk/
Last updated: 2024-12-10T09:06:34.000Z
When users contact your support team they expect their question to be answered quickly and correctly in the most efficient way. No customer wants to wait for their issue to be resolved, and IVRs, "please hold for an available agent", or "let me transfer you to the right team" are the bane of any customers' support experience.
In a modern customer care setup the first line of defence is your Help Center or Bot which offers self service solutions for your customers. When the content of your knowledge base can't assist, we can leverage forms or custom bot answers to collect customer intent and contextual information before we pass the request or conversation to one of the available support agents.
# Group Based Routing
Traditionally, this is where Zendesk triggers take over. By looking at a form, custom field values, language, brand or other information, we can use triggers to assign tickets to the right group of agents. The tickets are assigned to a group, and appear in views where agent can work through the list of tickets top to bottom.

This approach has a few downsides though. Tickets appear in a view and chances are that if I look at the top most ticket, it might not be the best ticket for my skills. Similarly, there might be a perfect ticket somewhere in the list that does match the language I speak. Or, since we assign all requests to our Support team first, it might take a while for that one question related to an invoice to be reassigned to Finance.
To tackle these issues Zendesk environments often evolve into complex environments with multiple Support groups per language, and dozens of views to filter tickets about orders, refunds, technical support etc. These "hacks" are all workarounds to give insight in the list of open tickets, and surface the right tickets to the right person or team. But they're not ideal, and scale badly since they're hard to maintain.
# Omnichannel Routing
Let's look at this concept of assignment and routing in a different way.

We begin with a customer inquiry that is created in Zendesk. This inquiry can be an email based ticket, a messaging conversation or a phone call.
The inquiry has an intent, or in other words, what's the question about? And it relates to a brand or product
The customer reading the question speaks a specific language and might be a customer, lead or VIP user.
On the other side we have agents, Agents speak specific languages, are knowledgeable in certain topics and are allowed to execute certain tasks within the CRM systems. And, importantly, they are either at work or not at work, and already have a certain workload assigned to them.
Forgetting groups, triggers and views for a moment, what we want is to make sure that if a ticket is raised, that we assign that ticket to the best agent to handle that ticket. Best can mean, the agent that is online, it can mean the agent that knows about the topic, or it can be the agent already working on that ticket.
This concept is what Zendesk calls: Omnichannel Routing. It's a new method to assign tickets to the best agent to handle the inquiry.

## How does it work
Before we dive into the setup, let's first give a high level example on how this would work. Let's take three tickets.
1. One ticket is a question about an invoice raised by a French speaking customer
2. The second ticket is a question about a product from an English speaking customer
3. A third ticket is raised by a English VIP user about a product
In our Zendesk instance we have two agents. Jack and Rose, they can both handle all topics, but Jack speaks only English.
With omnichannel routing our tickets arrive in Zendesk. We have triggers that assign both tickets to the support team. Since both agents are online, omnichannel routing can assign those tickets to any of the users.
Since the first ticket is in French, the system decided to assign the ticket to Rose, skipping Jack in the queue. The third ticket is assigned to Jack, since he has no assigned tickets and is available, and the priority of VIP tickets is higher than regular tickets. And the remaining second ticket will be assigned by whoever has capacity first: Jack, or Rose.
When Jack and Rose look at their [Agent Home](https://internalnote.com/agent-home-tips/) they will see their tickets appear in their inbox, and similarly, when they look at their [open tickets](https://internalnote.com/my-approach-to-zendesk-views/) view, they see all three tickets, with tickets assigned to either one of them.
Now imagine Jack going away. At that moment any response to a pending ticket will be routed to Rose, who's online. Or, if both of them go offline, the ticket can be reassigned to a fallback group and Molly, a friend of Rose who works in another department, can take over the ticket.
So that's omnichannel routing. We still assign tickets to groups based on topic, but the system dynamically routes to the right person for the job.
# Setup up omnichannel routing
There's a few moving parts in order to get omnichannel routing setup.
1. We need to tag tickets we want to auto-route
2. We need to allow agents to set their online status
3. We need to give agents a maximum capacity
And additionally we can enable two optional features: we can assign skills to agents, and we can queues.
Let's take them one by one.
💡
The first steps of this flow ignore skills and will just assign tickets within their existing groups.
## Routing
Omnichannel routing does not route all email based tickets by default. It will only route tickets tagged with a specific tag. This way you can choose to use routing for e.g. your first line support team, but leave the more complex finance tickets as a traditional group assignment in a view.
To start, you can decide which tag you'll use to identify which tickets should be automatically routed to agents. For my setup I picked `auto_routing` as a tag.

## Triggers
Next, go into your triggers and add the tag to all tickets you want the system to auto-route. In my setup I had four triggers that handle assignment:

I've decided that **Company** tickets are going to remain assigned to a specific group, and should not be auto-routed to an agent.
All other tickets are also assigned to their respective groups, but will be automatically routed and assigned to an available agent. Tickets about Internal Note are assigned to the Support group, and get the `auto_routing` tag. I also have a trigger that assigns *French* tickets to a Support - French group. For now, I keep that trigger as is, but also add the `auto_routing` tag so that these tickets to are assigned to available agents.


As a result of these changes we'll see some tickets assigned to groups, and other tickets assigned to agents within that group.
E.g. a customer contacting me about a Company related question, will get their ticket assigned to the Company group. But all other Internal Note inquiries will be assigned to the Support group, and assigned to a specific agent in that group.
💡
Omnichannel routing takes priority and SLA into account. So while updating your triggers to set the routing tag, also check that all tickets at least get a priority "normal" set too. This will make sure every ticket has an associated SLA policy if those are enabled.
## Agent Statuses
Now that tickets are routed to the right group and routing will also attempt to assign tickets, it's important that we can set statuses so that agents can make it clear if they can, or can't receive tickets or conversations at the moment.
By default Zendesk offers the following four statuses:
- Online: all channels are available
- Away: the agent does not accept messaging conversations or phone calls. Email can be assigned though since it's not a live interaction
- Offline: the agent does not accept any tickets
- Transfers only: no tickets are routed to them, by other agents can assign ticket to them. This is an ideal fit for team leads for example.
We can add additional statuses. You can for example add a "Messaging only" status, which only allows for conversations. Or a "Phone only" which indicates that this agent will only accept phone calls.


Once activated, agents can use the status dropdown in the Agent Workspace to indicate their status.

## Capacity Rules
We now have tickets routed to specific groups, and assigned to available agents. But imagine a scenario where we have 50 incoming messaging conversations, or a dozen phone calls. If our team has 6 agents, we can't expect the agent to each handle 8 tickets at once.
Most agents can maybe manage around 3 active conversations. Obviously we can only handle one phone call at a time, and to keep tickets moving swiftly we maybe want to assign only a few tickets to agents at a time, leaving the rest unassigned until someone has capacity.
This is where capacity rules come in. They allow you to set a limit to the amount of tickets an agent can handle, and this for either messaging, voice, tickets or a combination of the above.
You can create as many capacity rules as you need, and you can assign specific agents (but not groups) to that capacity rule.


My default rule set allows agents to handle 3 email, 5 messaging and one talk interaction at a given time.
But my rule set for *Second line* agents, who handle more complex tasks, only allows for 2 email tickets and one 1 messaging conversation due to the longer resolve time and additional focus needed for their tickets.


So in our example above, if we have 50 incoming conversations, and we allow our team of 6 to handle 3 conversations at a time, we'll have 18 assigned tickets, and 32 remaining unassigned tickets.
Once a conversation is handled, the next one will be assigned, or the customers in line will get an "no agents available" message in chat, and the conversation will be turned into a ticket. This last part depends on how you've configured your Zendesk Bot.
Similarly, if one of our agents sets themselves to offline, or voice only, then we've got only 5 agents available to handle those incoming conversations. Once they come back online, they'll get the next ticket in the queue assigned to them.
## Advanced features
There's a couple of advanced elements we can setup:
- You can enable[ auto-acceptance](https://support.zendesk.com/hc/en-us/articles/6009407849754/?ref=internalnote.com) of messages, which will assign tickets to agents and start the conversation immediately.
- Setup an [idle-time](https://support.zendesk.com/hc/en-us/articles/4410525357594?ref=internalnote.com) out which sets passive agents to offline or away after a while.
- You can allow tickets to be reassigned to a new agent if they are reopened.
- By default inactive tickets (e.g. customer doesn't respond anymore, or ticket is pending) are not counted against capacity. By enabling [messaging activity routing](https://support.zendesk.com/hc/en-us/articles/4828787357210?ref=internalnote.com) they are.
# Skill based routing
So far our routing only took agent availability into account. If two agents are available and a ticket comes in, it will be assigned to the "least active" agent with capacity.
Referring back to our initial example, if we have two agents, Jack and Rose, and only one of them speaks French, we want to assign French tickets to Rose, and split English tickets across the two of them.
This is where Skill-based routing comes in. It allows you to assign one or more skills to agents, and those will be taken into account when assigning.
Some examples:
- We can use languages as skills. A ticket matching a language will be assigned to an agent with that language as a skill
- We can use intents as skills. E.g. all tickets matching a Refunds intent, will be assigned to agents with the skill "Invoicing and Payment" which includes Refunds.
- We can use custom fields as skills. E.g. tickets with the category "Book a journey" will be assigned to agents with the skill "Travel"
## Assigning skills to agents
Setting up skills is done under Business Rules in the Admin Center.
- You start by creating a Skill a name: e.g. "Language"
- Add your skill options: French, English, Dutch, ...
- For each skill, setup the conditions. These work similar to how you setup triggers or views: e.g. Language is Dutch. Or "Country is Belgium" or "Country is Netherlands"
- And finally assign the skills to one or more agents.
💡
One agent can have multiple skills and skill options assigned to them. So an agent can be fluent in English, French and Dutch, and can be good in Finance, Sales and Development.
Similarly, one skill – English – can be assigned to multiple agents.



## Skills match view
Once you've setup your skills, you need to select a View which will show the agent their Skill-matched tickets. Since tickets are routed and assigned to agents, this view is not really a requirement when using Omnichannel Routing, but it could give agents insight in how many active tickets pertaining to their skills there are across all agents. I recommend making a copy of your "My Tickets" view and using that one.

## A word about triggers
You'll notice that the skills only contain a set of conditions and are assigned to agents. It's imperative that tickets contain the parameters you're using **upon ticket creation**. So if you're condition is e.g. "Category is refunds", you have to have a trigger that sets the custom field "Category" upon ticket creation.
Since skills are assigned when a ticket is created, as opposite to when a ticket is updated, only tickets with a category set will match your skill. So make sure that your conditions are usable for newly created tickets, and if not, use triggers to set those fields upon ticket creation.
## Using the skills for routing
Now that Skills are enabled, we need to tell our Omnichannel Routing configuration to use them.
This is done by going to the Admin Center > Routing Configuration > Edit, and enabling skills-based routing. Once enabled the skills will be taken into account when assigning tickets to agents.
In order to prevent tickets being unassigned for a long time if no available agent with the skills is found, you can us the timeout settings to allow the routing to assign tickets to *any* available agent in the group, if no skill-matching agent is online.

# Queues
So far we've only routed tickets with the context of a group and available agents.
Our initial triggers tagged tickets with `auto_routing` and assigned them to their respective groups: Support, Company, etc.
Within those groups we have agents with skills that get those tickets assigned if they have capacity and are available.
But what happens if all agents in our Support group are offline or are above capacity. In this case all tickets remain unassigned in the Support group until one of the agent becomes available.

But imagine there are a lot of Finance tickets in the queue of open tickets. Even though are support team is supposed to triage these first, it might be useful to automatically shift those tickets to an available finance agent who happens to have capacity. This clears the queue of unassigned tickets, and allows the finance team to work at full capacity.
Similar, we might have a Support team in EMEA, and once in USA. Even though tickets originating from Belgium are supposed to be handled by our EMEA team, it might be useful, especially at the end of a working day, if the unassigned tickets could overflow to our USA team.
This is where Queues come in. This [newly announced](https://support.zendesk.com/hc/en-us/articles/6712096584090?ref=internalnote.com) feature allows you to "intercept" the default routing behaviour and put matching tickets into a queue. The queue will first be handled by agent in the primary group, and of they are over capacity or offline, will optionally be assigned to a fallback group, or groups.
## How do queues work?
The default omnichannel routing is actually managed by a *hidden* default queue. This queue looks at the group a ticket is assigned to, and its respective agents, to route a ticket to the best available agent.
If you add new custom queues, you can remove tickets from this default assignment behaviour, and assign them to different groups, or even allow for fallback groups.
To make it a bit more clear: if we go back to our Finance example above we can by default assign all incoming tickets to the Support group, just like we explained in the first part of this article. But if we create a "Finance queue", we can tell our Omnichannel Routing to always route tickets whose intent matches "Refunds" to the primary group Support. If that group is over capacity or offline, we can allow tickets to overflow to the Finance group and get tickets assigned to available agents in that group.

Similarly, we can assign all tickets originating from Europe to our Support EMEA team, and set Support USA as the secondary group. We could even set Support USA and Support Asia as our secondary groups.
# Conclusion
We started this article with explaining how traditional assignment in Zendesk works. A ticket is assigned a group, and an agent in the group picks up the ticket.
With omnichannel routing we assign tickets to agents based on capacity and availability. And skill-based routing takes the skills of agents into account to route tickets to the best fitting agent for the job in that group.
Ticket queues take this approach one step further by moving ticket assignment from triggers and group towards queues that route tickets to one or more groups based on a set of criteria. Once routed, tickets then get assigned to an agent in that group.
They complicate the Zendesk setup since we can now use both triggers and queues to assign tickets to groups and, by extension, agents.
It's important to know that queues still require the existence of the `auto_routing` tag to work. But I am tempted to forgot assignment triggers completely and only rely on queues by leveraging the following setup:
- Have a trigger that adds the tag `auto_routing` to all tickets
- Have multiple queues for specific scenarios that assigns to the right group and fallback groups
- Have a final queue with low priority (100) that checks for tickets without a group, and assigns them to my default group without a fallback option enabled.
This setup means that all routing management is now in one place, and triggers are only used to tag or update ticket content.
So, what option will you pick for your ticket assignment?
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** via email or ****share** the article to your colleagues.
### How to get the most out of Agent Home for Zendesk
URL: https://internalnote.com/agent-home-tips/
Last updated: 2024-09-27T05:45:19.000Z
Last year Zendesk made their [Agent Home](https://internalnote.com/agent-home-beta/) generally available to users. Agent Home replaced the old dashboard interface we've all come to hate and love over the last 15 years. It creates a new landing page for your agents with a focus on work to be done, showcasing tickets in a sorted list based on Service Level Agreements and routed to them via assignment rules.
This article will show you a few tips and tricks to get the most out of your new Agent Home.


# Getting started
Enabling Agent home is as simple as flipping a switch in Admin Center > Workspaces > Agent Interface. Once enabled Agents will see the Home tab of their Zendesk replaced with the new Home interface right away.

Most companies are used to use Views to check what tickets require attention. I'm a big fan of an Action Needed view that shows all active tickets that require an agent's attention. This view shows an SLA descending list of open tickets and allows a group of agents to run through them first to last. This has the upside that an empty queue means all customers at least got a reply, and prevents cherry picking if done correctly.
[My approach to Zendesk ViewsIn this article I explain my approach to Zendesk Views, and how you only need 8 views to make an efficient setup.Internal NoteThomas Verschoren](https://internalnote.com/my-approach-to-zendesk-views/)
You can find a full overview of my preferred Zendesk View setup here:
But with the arrival of Omnichannel or Skill based Routing and Messaging tickets are more and more assigned to an available agent and not to a group in general anymore, making views not the ideal place to get the next actionable item.
Agent Home solves this by giving each agent a unique view into the work they should tackle today. Tickets are assigned to available agents on a status, skill and priority basis, and each agent can be sure that, if their Agent Home is empty, they handled all the work they should do right now.
There are however a few things you can do to make Agent Home even better.
## Sign up for Internal Note
A blog about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 10 Tips to improve Agent Home
## Assign to agents via omnichannel routing or assign to first replying agent
This first tip is probably the biggest one. Agent Home relies on tickets being assigned to Agents, in order to show up in their dashboard.
So in order to make sure tickets are shown, you should have an approach to assigning tickets.
### Option 1: Use triggers.
The traditional flow of assigning tickets in Zendesk is based on triggers.
For Email-based tickets, you can assign tickets to the first responding agent, or you can create triggers to assign to specific people (Finance tickets go to Alexa).
For Messaging-based tickets you have the benefit that they require someone to "take" the ticket in order to reply, so assignment is built-in.


### Option 2: Use Omnichannel and skill-based routing
The second option is enabling skill-based or omnichannel routing in your instance. This feature automates ticket assignment based on the availability and skill of agents, the priority of tickets, and their category or intent.
Each ticket gets a `routing` tag via triggers, and that enables Zendesk to route the ticket to the best person to handle the ticket now. It's a bit complicated to setup, but is really the basis of most modern Zendesk features when it comes to making sure tickets are handled correctly.
You can find a fill guide on setting up routing in [this Zendesk article](https://support.zendesk.com/hc/en-us/articles/4828787357210?ref=internalnote.com). (I really need to write an article on this entire topic someday).
When setting up routing, also make sure to take a look at the reassignment and idle timeout settings. This will move tickets to other agents' queues if an agent goes offline.

## Use Agent statuses
When leveraging Omnichannel Routing, or when working with Messaging, it's imperative to show your agents how to use the [Agent Status](https://internalnote.com/tag/agent-availability/) feature. When an agent is online they can get tickets assigned. Or in case of a messaging conversation, new and active conversations will appear on top of the Agent Home queue for your agents.
By default Zendesk comes with an online, offline or away status. It might be worthwhile to explore adding an "Messaging Only" or "Ticketing Only" status to make agents only available for focussed ticketing work, or available as messaging-first Chat agents.

## Use the right statuses
A ticket's lifetime is based on its status. A ticket moved from new to open, can be set aside as Pending or On Hold, and hopefully becomes Solved fast. Tickets can flow between statuses and can go from Pending to Open, and vice versa.
The tickets that show up in Agent Home are almost always Open tickets, or tickets where you were mentioned. So in order to keep your Agent Home clean, you should move tickets you as an agent have handled to any other status than Open once you've replied to them.
Similarly, if you mention a colleague and need a reply, put the ticket On Hold, and make sure to put all tickets that require customer action to Pending.
This way your, and your colleagues Home views will only contain real actionable tickets.
## Reopen side conversations
By default, side conversations that get a reply do not re-open their parent ticket, and they stay in their respective status.
So resurface those tickets in Agent Home once they get a reply, make sure to add a trigger with the following conditions, and set its status to Open.

Similarly, make sure to put tickets that you've replied to On Hold to move them out of sight until you get a reply.
## Use followers and @mentions
Agent Home has a section for Followed tickets. This section will contain all tickets you've been added as a Follower too sorted by the most recent/oldest first.
In the past you would often reassign a ticket to an Agent whose attention you require so it would show up in their Action Needed view.
Now with a dedicated spot for followed tickets, you can add them as a Follower and those tickets won't clutter their inbox anymore.
Similar, any @mention in an Internal Note (hehe) will also appear in the Your Work section of your colleagues' Agent Home.
## Unfollow what you don’t need to follow
Similar to how assigning tickets and adding people as followers make tickets appear in their Agent Home, it's best practice to remove yourself as a follower from those tickets that no longer require your attention.
This way your Following list is as short as possible and only those tickets that need you will stay in the queue, and the list won't be cluttered with updates to tickets you no longer need to see, but still follow.
I've even made it a habit of removing colleagues from a ticket once they answered my questions.
## Keep conversations in Zendesk
This is a given for any Zendesk setup: the more conversations happen in Zendesk as tickets, side conversations or messaging conversations, the more relevant your Agent Workspace and Agent Home will become.

So instead of reaching to Slack or Outlook to send out an email, @mention a colleague or use side conversations over Slack and Email to reach out. This way, if people reply, the work will show up in Agent Home.
Similar, instead of getting IT requests over email from a colleague in an Employee environment, make sure all those requests are forwarded to Zendesk so your ticket queue resembles all your actual work.
## Use Service Level agreements
Whenever I setup a Zendesk instance I always make sure I add at least three initial triggers:
- If Ticket Type is not set >> set type to question
- If Ticket Priority is not set >> set priority to normal
- If Ticket Schedule is not set >> set schedule x (Enterprise only)
Whatever happens after those triggers doesn't matter, but these three settings are the basic requirements to make use of Service Level Agreements (SLAs).
Once set, you can use SLAs to add time-based rules to your tickets. I prefer to use an initial First Reply Time and Next Reply Time set like this:

Once enabled, the tickets in your Agent Home will be sorted based on the SLA time set and the tickets that meet the nearest reply time breach, will be offered first. This will make sure that an urgent ticket created at 9 will be top of the list, but an old low priority ticket from 2 days ago might get priority over a more recent High Priority ticket with a few hours to spare.
Agent Home sees and uses these Reply Times by default, so once set your agent will now work on a mix of tickets and you'll be better set to give a timely response to all ticket types, instead of always handling the most urgent or most recent.
## Use triggers to set priorities
Even though the basic three triggers out of the previous example make SLAs work for all tickets, you do want to set up a series of triggers to raise or lower the priority of specific tickets to influence their sorting in Agent Home.
Examples can be:
- Set priority of tickets of users tagged with VIP to High.
- Set priority of tickets of category "Fire!!" to Urgent
- Set priority of tickets containing "Karen" to Low
By playing with priorities this way, you can use a single SLA policy and still nudge the sorting in Agent Home by shifting them up or down a priority column.
## For the brave 🙃
This last recommendation is one for the brave.
Agent Home has dedicated views for Open and Recently Solved tickets, and has a nice widget top right that shows your current CSAT rating, as well as a list of recently updated tickets,
So if you're brave enough: go to your views settings and deactivate any view that shows agents open and solved tickets, as well as views that show recently updated and recently feedback'd tickets. This will force agents to use the new Agent Home and will lessen your dependency on traditional views that enable cherry picking.
# 5 ways Zendesk can improve Agent Home
## Give me a way to show other agents' home.
For team leads especially, a way to view the list of tickets offered to another agent might be insightful
## Show me the numbers
Add a pill next to each list in the sidebar with the amount of tickets requiring my attention.

## Jump to the next ticket
Currently when you've updated a ticket you stay either on the ticket, or jump back into your Agent Home. An option to get the next available ticket as your view, similar to how Views handle tickets, would be nice.
## More Filtering
Even though tickets are sorted on a system level based on priority, and assigned based on skill or availability, it would be nice to be able to filter your list to only show tickets of a certain intent or category so you can focus on a single type of work for a while as an agent.
Although, there's still views, so maybe a focused list of tickets might be the best way forward here.
## Additional updates
If Agent Home is to be considered my start page as an Agent, integrating elements from the Knowledge base or Custom Objects in the updates list would be a useful addition.
You would be able to see which articles were published, which ones got an update and get up to speed with the latest information quickly.
Similarly, seeing which new records were added, which contracts expire or which assets have an issue in the dashboard would give you additional context for today's workload.
# Conclusion
I hope this list gives you some inspiration on how to make the most of Agent Home and start using it on your company.
If you've got additional tips and tricks, be sure to add them in the comments below, and as always, if you like this kind of content, forward it to a colleague, or consider subscribing to Internal Note Plus to support this project!
### Zendesk acquires Ultimate: an in-depth overview of what the platform will gain
URL: https://internalnote.com/zendesk-acquires-ultimate/
Last updated: 2026-03-25T13:54:32.000Z
Zendesk has been on a big shopping spree these last 12 months. They bought [Tymeshift](https://www.zendesk.com/newsroom/articles/tymeshift-acquisition23/?ref=internalnote.com) — a workforce management tool — and [Klaus](https://www.zendesk.com/newsroom/articles/klaus-close24/?ref=internalnote.com) — a quality assurance platform —. Before that, Zendesk also bought [Cleverly](https://www.zendesk.com/newsroom/articles/zendesk-welcomes-cleverly/?ref=internalnote.com), which formed the basis for Zendesk AI, and [Smooch.io](https://www.zendesk.com/blog/zendesk-welcomes-smooch-messaging-platform/?ref=internalnote.com), a powerful chat-routing engine that became the basis for Messaging and the Sunshine platform.
And now they’re planning to buy [Ultimate](https://ultimate.ai/?utm%5Fsource=ppinternalnote), an AI powered ticket automation platform.
I’m glad to see Zendesk expand from their core solution — customer support — to a broader platform that encompasses both customers and employees and broadens their toolkit with solutions that improve agent workloads, provide deeper insights and offers measure self service options for end-users alike.
It’s a far cry from their earlier acquisitions. When Zendesk bought Base CRM four years ago and turned it into Sell, they clearly wanted to attack Salesforce by offering a powerful sales and support combination. But now four years later, it’s clear that Zendesk has shifted their focused and wants to be the de facto standard for Customer and Employee experience powered by modern AI automations, powerful reporting and a focus on offering efficient self service options.
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# So why Ultimate?
For those who don't know the tool (although I've written about them a few times on this blog), [Ultimate](https://ultimate.ai/?utm%5Fsource=ppinternalnote) is an AI powered ticket automation platform.
Which is a long way to say: they offer a modern chatbot that nicely integrated with Zendesk, they allow users to build custom models to match customer questions to intents, and they have a rich dashboard for maintaining and improving your flows.
Reading this you might wonder: isn't this very close to what Zendesk Messaging and Zendesk AI does? Yeah. It is.
But for me, Zendesk AI can be seen as your iPhone's default apps. Zendesk comes out of the box with a powerful chatbot, prebuilt intent models, and reporting tools to get insights in your bot and customer behaviour.
But just like people move from Apple Notes to tools like Notion, [Slite](https://refer.slite.com/cn8zn9oi7mha?ref=internalnote.com) or Craft, use Gmail instead of Apple Mail, or move from Safari to [Arc](https://arc.net/?ref=internalnote.com), some Zendesk customers also outgrow Zendesk AI and the Zendesk Bot because their needs are very custom and don't fit a default industry model, or their bot requires integrations with external tools (like their webshop) that can't easily be build inside of Zendesk.
For these customers, Ultimate is an ideal fit because it offers what Zendesk AI and the Zendesk Bot does, but turns all features to 11.
Now that Zendesk has the intent to buy Ultimate (pun intended), let's see what potential features Zendesk users will gain once both platforms merge or Ultimate licensing folds into Zendesk.
# What Ultimate has to offer
## AI Models and Insights
### Custom models
Zendesk comes with a set of pre-built models for travel, retail, finance, technology and hospitality. This has the benefit that a new customer without any ticket history can get started immediately, but this also has the downside that if your company's ticket intents don't really match one of those industries, or if you need custom intents that fall outside of the model, your only options is custom answers in Flow Builder with manual training phrases.

Ultimate on the other hand built their own AI training engine that ingest all your existing ticket data and then builds a custom model based on your ticket data in a bottom up approach. They index all tickets, cluster them per intent, and you can then approve these approved intents and you get a model that's 100% based on your data.
On the flip-side they also allow a top-down model where you can give the system the intents you expect to need with training phrases, and Ultimate will then take that input to create a model based on your input.
This not only allows your chatbot to better align with what customers ask, but it will also provide better insights in what customers are asking, which also means potential pain points are visible quicker.
💬
How do I see Zendesk add this to Zendesk? I think they will offer this as either an add-on on top of Zendesk AI, or they will make their fixed models available for Professional customers, and "give" the custom models to their Enterprise customers. Although, if the cost of running and creating models goes down in a few years, I can see a future where every Suite customers gets Zendesk AI, and the Advanced AI add-on gets custom models.
### Bot training
Expanding on the custom models, Ultimate also comes with a training module to improve your intent-matching model. You can create new intents and show the system which tickets should be used to recognise the intents. Or you can dive into an intent and remove all tickets that create confusion (e.g difference between Event Tickets and Bus Tickets) so that customers have a higher change to get the right answer based on their inquiry.

Currently Zendesk has none of this. Their intent-mapping option only allows you to disable certain intents, and whenever an agent manually changes the intent in the Intelligence Panel, those changes apply to that ticket only, and have no impact on future inquiries. Those improvements are only made available if Zendesk updates their fixed models across all customers.
💬
Since intent training is only possible if your tickets can actually influence the model, here too I think this can only be made available to Enterprise users who get access to the custom model. That or Zendesk allows the creation of custom models that run in between the default industry models they offer and a customers' instance to nudge the intent-mapping results one way or the other.
### Better reporting
Let's face it, Zendesk current reporting is not that deep when it comes to the chatbot and intents. Explore gives a lot of insight once tickets are created, but the Bot dashboard in the Admin Panel only shows how many times an intent was triggered, but that's about it.
With Ultimate customers get insight in intents, full conversation logs with the bot, the fall-off point where customers leave your bot flows, and insight in resolution types (answer solved, agent escalation, drop-off, bad intent)

Combining the Bot training, reporting and custom intent mapping also gives insight in blind spots. These 25 tickets about customers asking for Apple Pay support? Yep, that intent/issue that wasn't documented on your Help Center will show up.
💬
For this one I think we'll see the bot flows and drop-off points available in Explore sooner rather than later. Currently all Zendesk customers are blind to how their bot behaves, so this seems like a low-hanging fruit regardless of the Ultimate purchase.
As for insights in bot conversations, I heard that this is Zendesk's current stance:
> We don't want agents to waste time reading conversations the bot already completely handled, so we chose to not create tickets for those resolved inquiries by design. (*paraphrased)*
But who knows, maybe Ultimate can influence that decision..
## Generative AI
Just like Zendesk, the Ultimate platform starts from the idea that it's better to leverage your existing content, than to create a custom flow for each intent.
In other words, by combining existing content like knowledge base articles and Generative AI, you can create custom answers for customer inquiries which will probably handle most of your tickets.
You can then focus your Bot Building time on detecting gaps in your knowledge base, or build bespoke flows for the more complex scenario's that can't be handled by an article alone. Do that, and you're left with a limited set of inquires that inquire human attention and love.
Similar to Zendesk, Ultimate has an onboarding flow that "just works". You link your knowledge base to the bot, enable Generative AI, and the bot will use its (custom) intent model to match inquiries to articles, and generate short custom answers for your customers.
Ultimate however has a few additional tricks up its sleeve.
### More data sources than just Zendesk
Zendesk supports Zendesk Guide as its sole knowledge source. Your Help Center articles are your trusted source for answers, and Zendesk Bot will use that content to offer answers to your customers.
Ultimate, being an independent platform, supports a lot more sources. Naturally you can import your Zendesk Help Center, but you can just as easily import your website, a set of documents, or other sources of data.

But, similar to Zendesk it's important that whatever the bot will render, is based on and limited to your imported data sources. Just like with Zendesk there's no chance of the bot going off topic since they build a lot of safety features and checks into the platform by design, both from a data integrity, as well as people and privacy standpoint.
💬
I can only assume this solution will be "quickly" integrated into Zendesk so that the Zendesk Bot can also pull in data from e.g. your website or webshop.
### Generative AI inside bot answers
With Zendesk Bots you can either use Generative AI to generate replies, or use custom answers to create bespoke flows for certain intents. Those flows allow for branches, asking for customer details and offering data via API or the Help Center in the form of a carousel of articles.

But what's not possible, and **is** possible with Ultimate, is to use generative AI in the middle of a custom flow. You can do things like "ask for an order number", "get the order status via API from your systems", and then have Generative AI use that API data to create a human-readable reply "Your order is expected to be delivered next Tuesday, hope this is still on time!". It seems like a small thing, but it allows to build personal conversations inside your statically defined flows.
This seems yet again one of those improvements that were probably already on Zendesk's roadmap, but I hope this will get fast-tracked now that Zendesk has Ultimate in-house to copy.
### More nuanced personae
And to conclude the Generative AI section, Ultimate comes with a more nuances personae feature. You can not only choose between your traditional "friendly, professional, neutral" persona for your bot, but you can also write down a short description of your bot so that the answers get a tone of voice that apply more to your use case.

## Bot Builder
Just like Zendesk, Ultimate comes with a Bot builder as part of its offering. It allows you to create custom flows to handle the more unique or complex intents by defining a flow with branches your customer can navigate through.
### More complex flows
I already called Ultimate the more advanced version of the native tools Zendesk offers, and their bot builder is no different.
You can create more complex flows by linking steps in flows to other parts of a flow. You can for example check for the existence of an order number at the start of the flow. If there is one, you call an API, get the status and return it to the customer as one part of your flow.
A separate branch handles the flow where there is no valid order number. We explain the customer where to find it and allow them to enter an order number. Once validated, we can link directly to the first branch, and get the order status.
This kind of internal linking is just one of the features where the bot builder is better than Zendesk's. We have more display types to show data (more complex carousels, custom forms, ...), if/then conditional blocks can have more than 10 options, and you can link between flows, create variations of answers to give customers a slightly different experience each time they talk to you,...

Aside from the above, their bot building experience is very close to Zendesk's. They also use blocks with content types, you can do carousels, API steps, buttons,..
💬
So here I wonder what will happen. Since they are so close in experience I think it's going to be a case of Zendesk making a list of the features they lack as compared to Ultimate, see which ones make sense, and then "just" replace the Ultimate builder with their own Flow Builder.
### Separate integrations
One major difference between how the Ultimate bot builder and Zendesk's operate is how they handle integrations.
With Zendesk integrations are developed inline in the flow builder. You add your API URL, headers and mapping as a step in your flow and go from there. If you have two flows that need to make the same API call, you'll need to add those API configurations in both flows.
In Ultimate there is a separate Integrations section where you can define API calls. You enter credentials, urls, expected input parameters and mapped returned data in a configuration.



Within the bot the API step then offers a dropdown of created integrations, and you can use those across multiple bots.
It allows for testing and building integrations outside of flows, and makes them easier to implement and reuse across flows.
💬
If you look at Zendesk today, we're halfway there. The connections section in the Admin Center already stores all credentials for Bot Builder API calls, so I can see a future effort to move the entire API setup to that section and move it out of Bot Builder.
### Ask for custom input as variable without creating custom fields
This is a big one. If you ever build a more complex flow in Zendesk, you quickly run into the limitation that every user input (order number, color choice, amount of nuggets,..) has to be asked via an Ask for Details step, and requires the creation of a custom field.
Useful for order numbers, since your agents might need that info later when they handle the ticket, but annoying of you want to collect temporary info to e.g. show the right set of articles or as an intermediate step in a complex flow, where we only need the end-result in a ticket (Laptop or Desktop? MacBook Pro or Air? Ultra or Max? ⟶ You picked a 15 MacBook Pro!)
Ultimate's bot builder allows for ad hoc parameters stored in the flow. They can be used to ask the customer for info (postcode?), validate to see if it's correctly formatted (lacks a digit!) and then passed to Generative AI answers or API calls without cluttering your agents' ticket fields.
💬
This feature is one I see Zendesk adding regardless of the Ultimate acquisition. Their recent option to use Dynamic Carousels in flows is one step in that direction, so I can only hope this feature was already on the roadmap, or will now be copied over sooner rather than later.
# How the acquisition will make Ultimate better
The above sections were all examples on how Zendesk will get better from Ultimate's product once they start integrating both platforms.
There's however also a lot of features that will now be possible that will make Ultimate better for existing customers:
## Intents matching
Currently when you use Zendesk AI a customer asking for a refund will get the Intent "Refund" added to its conversation. When that conversation moves to an Agent the ticket will get tagged with the same Refund intent, and the Admin Panel and Explore reporting shows that same intent natively across the UI
Ultimate customers however have the benefit of a custom intent model but once the conversation ends up in Zendesk, that data appears only as a custom field next to your ticket, and only if you've configured it. So similar how to Tymeshift now nicely integrates with Custom Agent Statuses, I hope the custom intents from Ultimate will also appear in the Intelligence Panel for Agents.
## User Authentication
Last month I wrote [a long article](https://internalnote.com/messaging-authentication-identify-and-merge-existing-users/) on how user authentication in Messaging works. It's complex, it takes some work to get your users aligned, but once it works your Messaging widget and bot can recognise users and use that metadata in flows and answers, or you can show restricted content for specific user segments.
Ultimate lives outside of the Zendesk ecosystem and interacts with Zendesk over the Sunshine Conversation API, leveraging the Messaging or SunCo widget. Those widgets however not (easily) transfer authentication data to and from third party services out of the box, meaning the Ultimate bot often needs a separate login flow and then pass (or match) that data with Zendesk users via the SunCo APIs and integrations.
Now that Ultimate will become part of the Zendesk Suite, I can only hope that items like user authentication, current browser URL, Help Center Segments e.a. all become available to the Ultimate Bot. Naturally once the Ultimate Bot and Zendesk Bot merge you'll automatically get access.
## Simpler licensing
This one comes with some caveats, namely that depending on your license type you might have Sunshine Conversation as part of Suite, only have Messaging, or have one of the Premium or Legacy SunCo tiers.
Either way, chances are big that you're paying for Zendesk Suite Agents, paying for an Ultimate license and pay both Zendesk and Ultimate for an allotted set of MAU or monthly active users.
Similarly if you're a Zendesk AI customer (cause you need the Agent Workspace features with summary, intent mapping and expand/tone-shift) and an Ultimate Customer (for their bot, AI models and ticket automation), you're kinda paying for a Zendesk Bot you're not using.
So I wonder, once the acquisition is finished and Zendesk starts breaking Ultimate into pieces integrated into their platform, I can only assume a Zendesk MAU is also includes as an Ultimate MAU and we're not passing past go twice?
Similarly, I can see users getting a discount on Zendesk AI if they also buy Ultimate to compensate for the unused Zendesk Bot)
Or maybe this section is just wishful thinking and Zendesk is just going to keep pricing as is 😅
# Conclusion
So, where do we go from here. My ideal outcome would be the following:
1. The Zendesk Flow Builder incorporates the more complex features from Ultimate with regard to linking to different branches, ad-hoc parameters and predefined integrations as reusable blocks. This becomes available across all Zendesk Suite customers
2. The deeper reporting on bot behaviour, conversation logs and resolution types become available for all Zendesk users
3. Ultimate intents are mapped against Zendesk intents and appear in the knowledge panel
4. In a year or two all Zendesk Suite users get access to the pre-trained Zendesk intents and AI features, and all Advanced AI customers, regardless of Suite type, get access to the custom models.
This means that, for now, while Zendesk is busy integrating the (awesome!) Ultimate team into their company, customers buying Zendesk AI still get the prebuilt models, and Ultimate is an upsell to custom models and better training/intent mapping.
Once the bot builder and reporting and intents are ported over to Zendesk, they can redraw their offering with Zendesk AI available across the board for all Suite customers (which will probably increase price) and reposition Advanced AI as custom models, better reporting and intent training.
Exciting times!
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Escalating a customer request to a Zendesk Help Center form for more information.
URL: https://internalnote.com/asking/
Last updated: 2025-09-08T06:42:00.000Z
We all know the following scenario: a customer contacts your support team over email with a minimal set of details. Your first reaction might be to reply to the customer asking for those details. However, you also have a nice form on your Help Center that already asks for those elements, and in a perfect world, the customer would have used that form for their inquiry.
This article will show you a simple setup that allows you to fix this flow. It runs as follows:
When a customer contacts you over email, you can use a macro to reply to them. The macro contains a link to your Help Center where you have a form that ask for more details. If they fill in the form your Zendesk will detect it comes from the same user, and will merge the two requests into one ticket with all information nicely combined.
## When to use this
Let's say we have a scenario where your customer emails you about a returning a product. To handle this inquiry the agent needs an order number, the product serial, a return reason and the customer needs to choose between a refund, voucher or a different sized product.
The agent could ask for this information in reply to the email, and then input the response into custom fields to make sure the Shopify sidebar app picks up the order, and that reporting in Explore correctly reflects this ticket. But that takes effort, the customer might not provide all the info, and there's a chance some information is not correct.
Imagine if we can instead reply to the customer with a link to the right "return product" form. The agent replies with a macro and puts the ticket on Pending.
The customer then clicks the link and sees a form pre-filled with their existing comment. They can fill in the required info and the form validates all items before submission.
After submit Zendesk will merge the two tickets, and show the agent an open ticket, with all fields correctly filled in, and the original ticket solved and linked to this inquiry. They can immediately get to work with the right information, and no loose tickets are left pending (pun intended).
# The setup
The way this setup works is by leveraging an intermediate ticket field that stores the original ticket id. That field – hidden on the enduser form – can then be picked up in a webhook that [merges](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/?ref=internalnote.com#merge-tickets-into-target-ticket) the existing ticket into this new, more complete ticket.
To start, we need to create a new custom field called *Original Ticket ID*. It's easiest to use a Numeric Field for this one, and make sure it's end-user editable. Add the field to your webform(s), and note down both the Ticket Field ID as well as the ID of the form(s) you want to use it for.
In my case it's Ticket Field `16830518183570` and Ticket Form: `7056207523474`


## Macro
Next up, we need a macro that agents can use to ask for more details. This macro will contain a link to your Help Center Form which makes use of the pre-filled ticket forms feature in Zendesk Guide.
[Creating pre-filled ticket formsWhat’s my plan? You can set up a ticket form that has pre-filled values in specific fields (such as the Subject or Description fields). This can save time for your end users and get them closer to…Zendesk helpNova Dawn](https://support.zendesk.com/hc/en-us/articles/4408839114522-Creating-pre-filled-ticket-forms?ref=internalnote.com)
This features leverages URL parameters to prefill fields in your guide form. In our scenario we need to select the right form and prefill the *Original Ticket ID* field. Optionally we can also add parameters to copy over the requester email, and their original ticket subject and description. This gives the end-user additional context, and profiles more fields for them, making their job a bit easier too.
The URL we need has the following structure. (Make sure to replace the IDs to match your field and form id
```
https://support.internalnote.com/hc/en-us/requests/new?ticket_form_id=7056207523474&tf_16830518183570={{ticket.id}
```
And if you want to add the additional fields it turns into:
```
https://support.internalnote.com/hc/en-us/requests/new?ticket_form_id=7056207523474&tf_16830518183570={{ticket.id}&tf_subject={{ticket.title}}&tf_description={{ticket.description}}&tf_anonymous_requester_email={{ticket.requester.email}}
```
Once you've created your URL, you can test it by pasting it into a new browser tab. Next, go to the Admin Panel > Macros and create a new macro for your agents. You can create multiple macros for each form you have, and you can add some additional text to give your customer some context.


## Help Center (optional)
The intermediate ticket field we created is editable for end-users and will appear on the Help Center form(s). If you want too you can hide the field by adding the following code to the `new_request.hbs` file of your team. But you can leave it visible too, as long as the customer doesn't remove or edit the ID, it does no harm.
```javascript
$( document ).ready(async function() {
const urlParams = new URLSearchParams(window.location.search);
const ticket_form_id = urlParams.get('ticket_form_id')
if (ticket_form_id == '7056207523474'){
$('.request_custom_fields_16830518183570').hide();
}
});
```
## Webhook
Once the form has been filled in by the end-user, we will leverage a trigger and webhook to merge the two tickets.
To create a new webhook, navigate to Admin Panel > Apps and Integrations > Webhooks and create a new Trigger Based webhook.
Give it the following target URL.
```
https://yourdomain.zendesk.com/api/v2/tickets/{{ticket.id}}/merge
```
You'll need to authenticate with either an email + password or email + token combination. Leave the rest of the settings as is.
## Trigger
And to conclude the setup, we need to create a trigger that fires whenever a new ticket is created. Our condition relies on the presence of an *Original Ticket ID.*
***Conditions***
- Ticket is created
- Original Ticket ID is present
- Form is 'choose a form' (optional)



***Actions***
- Notify By > Active Webhook > 'The webhook created earlier'
**JSON Body**
```javascript
{
"ids":[{{ticket.ticket_field_16830518183570}}],
"source_comment": "Closing in favor of #{{ticket.id}}",
"target_comment": "Combining with #{{ticket.ticket_field_16830518183570}}"
}
```
🚨
By default merged ticket comments via API are private. I would strongly recommend keeping it that way. If a customer changes the Original Field ID to another Ticket ID it will merge their ticket into the other ticket, risking sharing conversations. As long as you keep the merge api parameters set to private and not public, this risk is not there!
# The result
Once we've setup the entire flow, we can test our flow:
1. Create a test ticket by emailing to your Zendesk instance
2. Use the macro to ask for more details
3. You'll receive an email with a link to the Help Center
4. Open the link and fill in the form
5. The submitted ticket is picked up by the trigger and the original and new tickets will be merged, closing the original ticket in the process.
6. Each ticket will contain a link to each other for easy reference.





### Zendesk Roundup for March 2024
URL: https://internalnote.com/roundup-2024-03/
Last updated: 2024-03-05T07:30:33.000Z
Welcome to March! Winter's almost over, spring is coming and we're only a month away from Zendesk Relate!
Compared to last month, this month was a lot quieter when we look at the new releases. We got some much needed improvements in the Bot setup UI, and a major change in how verified email is handled, but not much else got released.
I assume this is a quiet before the storm and Zendesk's holding back major releases for Relate.
On the EAP site there are some fun new things announced though. [Brand Spaces](https://support.zendesk.com/hc/en-us/articles/4408829663642-Current-and-upcoming-Zendesk-betas-and-early-access-programs-EAPs?ref=internalnote.com#h%5F01HQKPPYZYTP7Y41H1M47PV0GZ) promises a new way to interact with multiple brands from within the agent workspace, and the new [Redaction Suggestions](https://support.zendesk.com/hc/en-us/community/posts/6785440307226?ref=internalnote.com) will improve privacy and security across your Zendesk instance.
I do wonder when we'll see all the Zendesk AI beta's go live. Most of the features announced last year like Similar Tickets, Expand and Tone Shift or AI for Voice are all still only available as early access, and they're bound to be generally available sooner rather than later.
Lastly, today Zendesk’s hosting a [What’s New](https://click20.bigmarker.com/links/ml3m1fFA6e7/n2eyyuoul/5d4GYY46IOy/Ob6CzIuuGE?bu=57f73632d8e8367de77238eb395fdea92d3e285350306546a7c005a08784808dcb0cf5fcf8a8811ab3851a9ec8db48eb38ac23c724fa1db97d53edc0e64f9a6c8669a859f3f461818a59a25e99b7c0633cf350dfb747d2fc2e70e7bd102b9a030e20af0eae4542a65dd3e98258f8f90a&ref=internalnote.com) webinar. If anything cool is released, I’ll send an update about it later this week, but knowing these last few webinars, it’s probably a nice recap of last quarter’s releases.
Let's dive in!
# 🎉 New Releases
## 🤖 AI Powered Conversational Experiences
The Zendesk Bot management page has gotten a few much needed updates this month.
All settings for a bot are now consolidated into one view that combines both setup, behaviour, intents and answers in one view, instead of the multiple pages those settings uses to be spread across.

With the change the setup page also got some new features. You can now [clone](https://support.zendesk.com👨🏻💻/hc/en-us/articles/6707589714458) custom answer flows within the same bot, or to another bot you have setup.
### Setting custom fields in the transfer to agent step
And within a Custom Answer you can now update custom fields within the Transfer to Agent step so pass additional information to agents upon escalation.
### Verified Email Addresses
Zendesk **finally** fixed the long standing issue where authenticated messaging users were created in Zendesk without a valid email address linked to their profile. The issue got fixed by introducing the concept of verified email addresses for user profiles. Whenever a user is authenticated in the Messaging Widget or SDK and its `external_id` matches and existing user profile with a verified email address, your users will get mapped to the right user, and the email address will be visible in the Agent Workspace.
Businesses can use a combination of an external id and an email address to uniquely identify their end users. Developers will need to include a new *email\_verified* claim in issued JWTs. For more information, take a look at the article below.
[Messaging Authentication: Verified email and merging existing users based on emailZendesk introduced a new email verification flow to handle the mapping of authenticated Messaging users and exiting end-user profiles. It’s a lot so let’s dive in!Internal NoteThomas Verschoren](https://internalnote.com/messaging-authentication-identify-and-merge-existing-users/)
## 👨🏻💻Agent Workspace
You can [now](https://support.zendesk.com/hc/en-us/articles/6704549639194-Announcing-ability-to-change-agent-state-from-Explore?ref=internalnote.com) set Agent status from within the Agent Workload dashboard in Zendesk Explore. It's a handy shortcut to make changes to your teams' availability right from the dashboard. See a huge backlog in Messages conversations? Set more team members online in Messaging, and remove a few from Talk.

The [Merging ](https://support.zendesk.com/hc/en-us/articles/6216929727898-Merging-organizations-beta?ref=internalnote.com)Organizations[ (Beta)](https://support.zendesk.com/hc/en-us/articles/6216929727898-Merging-organizations-beta?ref=internalnote.com), which allows you to merge organisations in your Zendesk instance, has been updated to now also correctly reassign closed and archived tickets during a merge.
## 🔎 Help Center and Self Service
After last month's updates on enabling tables in Content Blocks, we can now [include custom HTML code](https://support.zendesk.com/hc/en-us/articles/6773995337754?ref=internalnote.com) in content blocks, with included support for custom Javascript code.

## 🧱 Open and Flexible Platform
The [Custom Objects](https://internalnote.com/tag/custom-objects/) API has been extended with new [APIs for custom objects](https://developer.zendesk.com/api-reference/custom-data/custom-objects/custom%5Fobject%5Frecords/?ref=internalnote.com#custom-object-record-bulk-jobs). WE can now execute Bulk actions to update or create records, and objects are now accessible for updating and deletion on their `external_id` instead of only the internal Zendesk ID.
Keep an eye out on this website, or subscribe to [Internal Note Plus](https://internalnote.com/plus/#/portal/signup), if you're interested in these. I'm working on an update of the Custom Object series to include all the new updates!

Since the API now allows for bulk actions on custom objects, the [data importer](https://support.zendesk.com/hc/en-us/articles/6705584080794?ref=internalnote.com) got an update too. You can now not only bulk import organisations or custom objects, but we can now also update exiting records during the import. Just make sure your objects have unique and stable external ids.
### PowerBi connector beta
Zendesk has introduced a new Power BI connector that allows you to easily import Zendesk Explore data into Power Bi. It makes used of new cursor based pagination and allows for the import of a lot more historical data, while also making the data available as structured and mapped data so you can more easily use the data directly in your reports.
[Using the Power BI Connector by Zendesk (Beta)Disclaimer: Zendesk doesn’t provide support for Power BI. See the Microsoft documentation if you need assistance. The existing Zendesk Power BI connector by Microsoft has a known issue where it c…Zendesk helpJin Huang](https://support.zendesk.com/hc/en-us/articles/6700481028634-Using-the-Power-BI-Connector-by-Zendesk-Beta?ref=internalnote.com)
# 🛒 Marketplace
## App Authorisations
While browsing the Zendesk release notes this new app from [Sweethawk](https://sweethawk.com/?utm%5Fsource=internalnote) caught my eye:
> [App Authorizations](https://www.zendesk.com/marketplace/apps/support/1011454/app-authorizations/?utm%5Fsource=internalnote) helps you review app authorisations and revoke them if no longer needed. With this app, you can see integrations that have access to your Zendesk data, when it was authorised, who authorised it, when it was last used, and more importantly, provides the ability to revoke tokens you authorised that you want to cycle.
If it had been available when I wrote my Zendesk security Checklist last month, I'd have added it for sure!
[➕ Zendesk Security ChecklistOne of the big Trends for 2024 is the idea that security no longer is an add-on but should be seamlessly incorporated throughout the customer journey. To get started the right way, I’ve written a Zendesk Security Checklist. It’s a practical approach to improve the security of your Zendesk instance.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-security-checklist/)
# 💡Insights
Zendesk's Developer Blog published an article with some nice insights on how to get started with Custom Objects:
[Simplifying Complex Workflows with Custom ObjectsWith Custom Objects, customer data that doesn’t fit neatly within native Zendesk objects (organizations, users, tickets, etc.) can be…Zendesk Developer BlogChris Kennedy](https://developerblog.zendesk.com/simplifying-complex-workflows-with-custom-objects-1c6a8cc57ba7?ref=internalnote.com)
# 🎥 Videos
This video has nothing to do with Customer Care or Zendesk, but at the end of the video the following was said:
> I think we can't deny that. And ultimately, human plus computer beats human and beats computer.
> It is the marriage of these two in which technology's always shined.
I think that's a valid way to approach Bots too. A company that only has a bot but no agents will not be able to assist all their customers. But if you only have agents and no self service or bot, you'll get overworked agents doing the same stuff day in day out. But the combination of bot-driven ticket self service and escalation to agents for that human touch, that's a winning combination for sure.
# ⚠ Major Changes
> [As of December 1, 2023](https://docs.smooch.io/guide/web-messenger/?ref=internalnote.com#conversation-list), the Sunshine Conversations Web Messenger and Mobile SDKs are in maintenance mode and will not be receiving new features. Bug and security fixes will continue when required. Zendesk recommends that if possible, customers use the Zendesk Web Widget and Mobile SDKs for enhancing their messaging experience across Web, Android, and iOS platforms. These widgets and SDKs are regularly updated and improved with new features.
# 📝 Articles this month
[➕ A full guide to handling agent availability in Zendesk MessagingThis article will show you how to handle agent availability in the Zendesk Messaging Widget.Internal NoteThomas Verschoren](https://internalnote.com/a-full-guide-to-handling-agent-availability-in-zendesk-messaging/)
[Messaging Authentication: Verified email and merging existing users based on emailZendesk introduced a new email verification flow to handle the mapping of authenticated Messaging users and exiting end-user profiles. It’s a lot so let’s dive in!Internal NoteThomas Verschoren](https://internalnote.com/messaging-authentication-identify-and-merge-existing-users/)
[➕ Your new Zendesk super power: Internal WebhooksZendesk offers robust triggers and automations to modify tickets. For complex tasks like copying field data, Zendesk’s Webhooks can execute API calls for advanced modifications. This article explains how to utilize these tools.Internal NoteThomas Verschoren](https://internalnote.com/your-new-zendesk-super-power/)
[Restarting a Zendesk Messaging ConversationThis tutorial shows you how to build an Answer flow for Zendesk Messaging that allows visitors to restart the conversation.Internal NoteThomas Verschoren](https://internalnote.com/restarting-a-zendesk-chat-conversation/)
# And Finally...
The new [Generative AI](https://internalnote.com/preview-of-the-new-generative-ai-for-knowledge-in-zendesk/) for the Help Center has a new hidden prompt feature. You can write down your article idea in a single sentence, and use the Expand feature to create a full article for you.
💡
Note that you should always validate and check these generated articles!




### A full guide to handling agent availability in Zendesk Messaging
URL: https://internalnote.com/a-full-guide-to-handling-agent-availability-in-zendesk-messaging/
Last updated: 2024-08-19T20:32:57.000Z
When customers interact with your customer care team via a traditional channel like email of webforms the concept of availability and online are almost irrelevant. Customers expect a first reply time of hours (or maybe days..) and the conversation is asynchronous where a customer and an agent reply with minutes, days or hours in between interactions.
Traditional web chat is the opposite. Customers who interact with a chat widget expect immediate availability, and they expect a resolution of their issue within that single conversation since the moment they close that chat window all context to that conversation is gone.
Zendesk Messaging is a new take on these interactions that creates a hybrid between these two models that takes elements from Social Messaging and combines it with traditional chat and email support.
# Asynchronous and continuous
Zendesk Messaging is a so-called asynchronous and continuous channel.
Asynchronous, in the sense that the tool does not expect both agent and customers to interact and resolve the conversation within one short time span. Just like with email and agent can reply to the customer, and the response will show up in the web widget, WhatsApp conversation or Facebook Messenger inbox.
The customer can reply immediately, or later that night to continue the conversation, just like you would drop a message to a friend, and you might get a response later that day, or the day after.
Conversations are also continuous, in the sense that, if the customer starts the conversation in a web widget and then closes their browser, Zendesk will know this and will send the customer the customer response via email, giving the customer the choice to continue that conversation back in the web widget, or switch to email entirely.
Or similar, a conversation started in the web widget, can be moved to WhatsApp via the contextual dropdown.
But what's important is that it's one conversation that's continuous until the issue is resolved, across channels and only replied too when the customer or agent has time (or attention) to handle the conversation.
# Availability
Even with a channel like Messaging that's build around async, it is important to let the customer know when and if someone is available to handle their question. If they have an urgent question about a flight cancellation, the fact that an agent is, or is not, available right now will influence the way they'll handle their inquirey And similar, even though your Chatbot will probably allow the customer to self-serve most questions, the customer should know that, if their issue needs a human agent, there is someone right now who will handle it, or if they can safely send their message and move on to something else until an agent becomes available to handle the ticket.
Within Zendesk Messaging and the Zendesk Bot there's a couple of scenario's we can handle with regard to agent escalations:
- Is the agent escalation within or outside of business hours
- If it's within business hours, are there agents available?
And similar, what happens when an agent goes offline during a conversation for a break or due to a technical issue?
This article will show you how to handle these scenario's in the Zendesk Bot.
# Setup
## Basics
This article starts from the idea that we will build one **escalate to agent** answer that you can use across all your answer flows via the new [Linking Feature.](https://internalnote.com/answer-linking-for-the-zendesk-bot/) It's a complex flow with a few moving parts, so it's best to build this once and re-use it. But if you want you can build and copy this flow across all your answers too.
## Business Hours
Within the Admin Center you can setup Business Hours for your company under the Business Rules section. If you've set these up, you can then add a Business Hours step to your bot. This step will allow you to show different messages to your customers depending on the time they contact you.

When selecting the '*Business Hours*' step you can pick one of your schedules, and the bot will show a split flow handling two scenario's:
- Within business hours we know that agents might be available. We just need to check if there are any.
- Outside of business hours you can let them know you're closed and you'll reopen at 9AM, but that they can leave a message and an agent will come back to them with an answer via email. You can do this by asking for name and email via an *'Ask for Details'* step, and a '*Transfer'* step.

💡
If you haven't setup continuous conversations that allow for follow-up via email, you can do so via Admin Center > Tickets > Settings.
More info [here](https://support.zendesk.com/hc/en-us/articles/4408829095706-Allowing-customers-to-continue-their-conversation-over-email?ref=internalnote.com).
## Checking for agent availability
Within business hours we know that agents might be available, but sometimes – because of a lunch break, or agents reaching their limits set in their [Capacity Rules](https://support.zendesk.com/hc/en-us/articles/4776409839770?ref=internalnote.com) – agents might not be online as expected.
By leveraging the Zendesk Chat API we can check for agent availability and let the customer know if any agents are available right know to handle their inquiry.

If the API returns a `200` success status we know at least one agent is available, or in case of a `404` error, we know no one is available for the customer at the moment.
We can then use a combination of '*Send Message*' and '*Transfer'* steps to let the customer know what's up.

If you're interested in setting up this availability API, please check out this article:
[➕ Checking for Agent Availability in Zendesk MessagingSometimes you want to let your customers know if agents are available before they try to reach out. This article will show you how to do it (on any Zendesk plan!)Internal NoteThomas Verschoren](https://internalnote.com/agent-availability-in-zendesk-messaging/)
## Agent goes offline
We've now setup a nice Bot Flow that can let the customer know if someone is available, and can reply with very specific comments to handle questions outside of business hours, or when no agents are online during business hours.
In the latter two scenarios a ticket will be created in Zendesk, and when an agent replies the customer will get an email with the reply, or, if the reply arrives within 10 minutes, will also get an alert in their active browser tab.
When the customer reads the email they can then choose between replying via email, or continuing the conversation in the web widget.

This leaves us with the final scenario where an agent goes offline during the conversation. Scenario's could be
- A customer starts a ticket just before lunch, the agent replies and put the ticket on pending and the agent goes on break before the customer replies to the final comment
- An agents' internet connection goes offline during a conversation
- ...
Our bot has already passed control to Zendesk so we can't handle this one within a bot Answer Flow. Luckily, buried in the Classic Chat portal there's a section called Chat Triggers that allows you to send automated messages over the web widget. (the feature is also available under Chat Triggers in the Business Rules section of the Admin Center).
To let the customer know an agent has gone offline, create a new trigger with the following conditions and rules:

- Channel: Messaging
- Run trigger: When a chat message is sent
- Check Conditions: All
- Account status equals offline
- Perform the following actions:
- Send message to visitor: "The agent you were talking to seems to have gone offline"
- Request email (continuous conversations)
Give your trigger a name, and make sure to enable *Each visitor will receive this message only once* to prevent repeat alerts during a single conversation.
If you already ask for an email address in your Bot flow, you can omit the "request email" step in the trigger
Once enabled a customer who replies to a conversation while the agent has gone offline, will get the following experience.

# Conclusion
So, there you have it, a few configurations you can add to your Zendesk environment that will inform your customers on agent availability.
### Messaging Authentication: Verified email and merging existing users based on email
URL: https://internalnote.com/messaging-authentication-identify-and-merge-existing-users/
Last updated: 2025-07-21T06:10:14.000Z
One of the biggest feature requests for Zendesk Messaging is a way to link authenticated Messaging users to existing end-user profiles in Zendesk.
Currently, when a user interacts with the Zendesk Messaging Widget and we ask for an email address, that conversation is linked to their existing profile and the agent sees both the messaging conversation and the existing email threads in one overview.
However, when we authenticate a user in Zendesk Messaging via JWT, that same interaction will create a new profile in Zendesk for that user, regardless of an existing user with that email already available in Zendesk. The only way to currently make sure both are matched, is by making sure the `external_id` matches.
If you look at the [Zendesk Community](https://support.zendesk.com/hc/en-us/articles/4411666638746-Authenticating-end-users-in-messaging-for-the-Web-Widget-and-mobile-SDK?ref=internalnote.com) or at my own [blog](https://internalnote.com/deepdive-into-messaging-profiles/) you'll notice that this let to a lot of confusion, frustration and duplicate users.
This week Zendesk finally addressed this issue and fixed it by writing one of the most complex support articles I've ever seen:
[Using email identities to authenticate end users for messagingWhat’s my plan? Zendesk identities are unique, which means the email identity owned by one user can’t simultaneously be owned by another user. This article explains what email identities are…Zendesk helpAndrew Lavers](https://support.zendesk.com/hc/en-us/articles/6687009874074-Using-email-identities-to-authenticate-end-users-for-messaging?ref=internalnote.com#topic%5Fafx%5Fpzj%5Fh1c)
😎
If you like this content and want to support the blog, take a look at [Internal Note Plus](https://internalnote.com/plus), our paid tier with additional content.
# Be careful what you wish for...
Before we dive into this new release, let me tell you what it's not:
> **It is not a simple way to link authenticated Zendesk users to existing end-users based on email.**
So for those who hoped to be able to authenticate users and.. have the conversations show up in their profiles, well, there's more to it than just that.
Instead Zendesk starts from the concept of a Verified Email Identity. This verified status means agents can trust that the user they're talking to is the actual user and not an impersonation.
Starting from this status we can then map the scenarios and up with users linked against their existing profiles, or not.

# How Messaging used to work
For unauthenticated users:
- If an `email` in an unauthenticated Messaging conversation matches an existing profile, the conversation will be added to that profile.
- If an `email` in an unauthenticated Messaging conversation does not exist, a profile with that email is created.
For authenticated users:
- If an `external_id` in an authenticated Messaging conversation matches an existing profile's id, the conversation will be added to that profile.
- If an `external_id` in an authenticated Messaging conversation does not exist, a profile with that id is created, but no email linked
What we all wanted is to have an authenticated user that matches in email to an existing profile, to just match that profile and have the email available in the profile.
However this could lead to a security risk. Imagine I'm interacting with Zendesk as an authenticated end-user and the conversation is linked to my profile. Then, an unauthenticated user who impersonates me starts a conversation in Messaging with my email address. Currently, that conversation is linked to my existing profile, and it's not clear for the agent if I'm really me.
So, instead of *just* linking (un)authenticate accounts based on email, Zendesk took it one step further and updated the way email identities are handled in a more holistic way.
# The new flow
When you go to the *Admin Center > Messaging > Settings* you will see a new advanced section that handles email identities.
By default, any new Zendesk instance will have its configuration set to "Use only verified emails". This is the new setup that will allow for linking Messaging and existing users.
Existing instances however will have the settings set to "Use both verified and unverified emails" and "Unauthenticated users can claim verified emails". **This one is the experience we're used to,** where unauthenticated messaging users who enter an email of an existing user, will see it's conversation added to that profile.

# How it will work from now on
In short the new flow starts from the concept of verified email users. A verified email user is a user that is authenticated via JWT in Messaging and has a matching user in Zendesk.
The idea is that if you're known and verified, your conversation gets linked to your user in Zendesk and the agent knows your trusted. In all other scenario's you can talk to an agent, but it's up to an agent (or your policies) to trust the user and if so, merge the conversation and user into the "real" account, if there's one.
In short:
- Authenticated and verified users have their conversation linked to their profile in Zendesk and a verified email will be added to the profile and the conversation will get a green checkbox. ✅
- In all other scenarios Zendesk will create a new user profile with the users' name and no email address linked to their user.
However, there's a lot more to it, and there's actually around 48 different flows I was able to map (for now..)
Read on to get the full overview of the new options!
# Flow Chart
🎉
I want to say thanks to the Andrew Lavers from Zendesk who gave some awesome input and fact checked this flow chart for me and simplified the chart a lot!
Below you can find a flow chart with the available options.
You'll notice that the authenticated branch does not take the options for unverified and claiming existing accounts into account. This is because the options in the admin panel only affect unverified and unauthenticated flows.

[Email Identities FlowEmail Identities Flow.pdf26 KBdownload-circle](https://internalnote.com/content/files/2024/02/Email-Identities-Flow.pdf "Download")
# Email identity options.
## '*Use only verified emails*'-option selected
This option is the new default for all new Zendesk instances, and is the one that should be enabled if you want to make sure that the person you're talking too is actually the owner of the email or account they entered.
In essence it works as follows:
💡
Conversations will be linked to existing end-users who have a matching external id and verified email address.
If not new profiles are created only for users who are authenticated and have a [verified email address](https://openid.net/specs/openid-connect-core-1%5F0.html?ref=internalnote.com#StandardClaims) included with their issued JWT. In all other scenario's a new profile without email will be created for each conversation.
Or, if we want to run through the scenario's:
#### Scenario's
- If I'm logged in and the `external_id` in the payload does not match an existing user, a new user will be created with that `verified email` and `external_id` and the conversation will be added to that profile. ****If any user already has that email address, it will be removed from that profile.**
- If I'm logged in and the payload matches an existing `verified email` and `external_id`, the conversation will be added to that profile.
- If I'm logged in and the payload matches an existing `unverified email` and `external_id`, the conversation will be added to that profile but the profile becomes [verified](https://support.zendesk.com/hc/en-us/articles/6687009874074/comments/6745233727514?ref=internalnote.com).
- If I'm logged in and the payload matches an existing `external_id` but no `email` was available on the profile, the email address is added and the conversation will be added to that profile.
- If I'm not logged in, a new profile will be created for each new conversation. The email will be visible in the comments, but will not be added to the profile
## Both unverified an verified option selected
This option creates a bit of nuance and is less strict.
💡
This option allows for the creation of accounts with unverified email addresses, and conversations matching those unverified email addresses and external id will link to the same profile
#### Scenario's
- \[NOT CHANGED\] - If I'm logged in and the `external_id` in the payload does not match an existing user, a new user will be created with that `verified email` and `external_id` and the conversation will be added to that profile. ****If any user already has that email address, it will be removed from that profile if the profile is unverified.**
- \[NOT CHANGED\] - If I'm logged in and the payload matches an existing `verified email` and `external_id`, the conversation will be added to that profile.
- \[NOT CHANGED\] - If I'm logged in and the payload matches an existing `unverified email` and `external_id`, the conversation will be added to that profile and the profile becomes verified.
- \[NOT CHANGED\] - If I'm logged in and the payload matches an existing `external_id` but no `email` was available on the profile, the email address is added and the conversation will be added to that profile.
- \[⭐️ CHANGED\] If I'm not logged in, and the email matches a verified email, a new profile will be created for each new conversation. The email will be visible in the comments, but will not be added to the profile
- \[⭐️ CHANGED\] - If I'm not logged in, and the email matches an unverified email, the conversation will be added to that profile
- \[⭐️ CHANGED\] - If I'm not logged in, and the email matches no existing profiles, a new profile will be created for that unverified email address and the conversations for that unauthenticated user will be added to that profile.
## Unauthenticated uses can claim verified profiles
And finally we end up with the least secure option.
💡
If an unauthenticated user email matches an existing profiles' email, the conversation will be added to that profile, regardless of the verified status.
#### Scenario's
- \[NOT CHANGED\] - If I'm logged in and the `external_id` in the payload does not match an existing user, a new user will be created with that `verified email` and `external_id` and the conversation will be added to that profile. ****If any user already has that email address, it will be removed from that profile.**
- \[NOT CHANGED\] - If I'm logged in and the payload matches an existing `verified email` and `external_id`, the conversation will be added to that profile.
- \[NOT CHANGED\] - If I'm logged in and the payload matches an existing `unverified email` and `external_id`, the conversation will be added to that profile and the profile becomes verified.
- \[NOT CHANGED\] - If I'm logged in and the payload matches an existing `external_id` but no `email` was available on the profile, the email address is added and the conversation will be added to that profile.
- \[⭐️ CHANGED\] If I'm not logged in, and the email matches any email, the conversation will be added to that profile
- \[⭐️ CHANGED\] - If I'm not logged in, and the email matches no existing profiles, a new profile will be created for that unverified email address and the conversations for that unauthenticated user will be added to that profile.
# How it will look for agents
💡
Currently the essentials does not reflect the verified/unverified state of an email address. The checkbox next to the External ID only reflects the authenticated state of the user/conversation.

Authenticated messaging user with an email address linked to their profile

Authenticated messaging user without an email address linked to the profile

Unauthenticated user

Unauthenticated user in a flow where we allow unverified email addresses
# How to handle this
So, if you want to link authenticated users to existing profiles in Zendesk you basically still need to make sure that **the external\_id of your user** matches the Zendesk user. If your users do not have `external_id`'s, you still can't match logged in accounts to existing accounts.
## Mapping users
So there's a few approaches here.
1. You can go for a Messaging first approach. You assume most users will interact with your customer care team over Messaging for the first time, and if you implement an authenticated flow you will create verified email profiles with the correct `external_id` from the get go for each user.
When, or if, those users ever email you, the communication will be linked to their profiles correctly.
2. If you already have a large user database in Zendesk it's best to import your user database with their UUID and update your users. This way you're sure the external\_id and email are there before a user ever logs into messaging again, and they'll be matched correctly.
3. Or, you could cut your losses and live with the fact that new profiles will be created, while being sure those users are authenticated and verified.
## Verified only
Aside from preventing multiple user profiles being created for your users, the other side of this coin, is the reason you want users to authenticate. Authentication is not just about pre-filling an email address, but it's about knowing for sure that the person talking to you is the actual person.
If we take this as a basis, I strongly recommend going with the new Verified only configuration.
But, since this goes against years of habits and most customer profiles are unverified, the following approach might work:
- Configure your account to allow both verified and unverified accounts (for now)
- Run an import of your existing users with their external IDs.
- Push customers towards verifying their accounts by linking to the [Customer Portal](https://support.zendesk.com/hc/en-us/articles/4408846805530-Submitting-and-tracking-requests-in-the-help-center-Customer-Portal?ref=internalnote.com#topic%5Fqgd%5Fmqd%5Fyy) section of your Help Center in your emails. Each time a customer logs in, they will verify their email
- Regularly check this API endpoint to see how many unverified users you still have. If the number is low enough, toggle the verified only setup.
```
api/v2/search.json?query=is_verified:false
```
🚨
I would never enable "Allowing unauthenticated users to claim verified email addresses" from now on. It's clear Zendesk is moving towards a verified and authenticated flow, and this will just prolong your legacy setup.
# Bonus
I've updated my Messaging Authentication demo and article to include the new `email_verified = true` payload.
[Authenticate Zendesk MessagingZendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.Internal NoteThomas Verschoren](https://internalnote.com/jwt-messaging/)
```javascript
var payload;
payload = JSON.stringify({
scope: "user",
exp: Math.floor(new Date().getTime() / 1000.0) + 86400,
name: json.user_name,
email: json.user_email,
external_id: "user_" + json.user_external_id,
email_verified: true
});
```
### Your new Zendesk super power: Internal Webhooks
URL: https://internalnote.com/your-new-zendesk-super-power/
Last updated: 2025-07-06T17:54:01.000Z
Zendesk has a myriad features you can use to create powerful automations and flows for your tickets without resorting to external scripts or tools like Zapier, server-less functions or other tools.
The most basic of those are Triggers and Automations which allow you to update tickets [based](https://app.asana.com/0/1205421583449648/1206479113670348/f?ref=internalnote.com) on changes or time. You can for example set a ticket to open if it's been on pending for more than 3 days, you can increase the priority of all tickets that contain the word *Fire 🔥* or open a ticket when its due. These are all pretty basic examples of how you can leverage those two business rule types to change ticket data.
But sometimes you want to do more complex changes. You want to copy data from one ticket field to another, want to use data from a users' organisation to update data in their tickets or similar flows.
For these more complex scenario's we can leverage Webhooks in Zendesk to have Zendesk itself execute API calls on itself to make changes to your tickets.
This article will give you some examples on what can be accomplishes by leveraging Zendesk Webhooks and the Zendesk API.
# Webhooks
Webhooks are a feature available in Zendesk normally used to alert external platforms of actions that happened within Zendesk.
You can get notified for Zendesk Events: an article get published, a user is created, a custom object's expiration date has passed,...
Or you can use triggers and automations to send out alerts based on specific ticket conditions like "a vip ticket has been created", or "a ticket has been on hold for 3 days".
When those conditions are met the webhook will send a payload to a specific API endpoint or website. You can for example create a webhook that [adds an alert to Slack](https://internalnote.com/webhooks-for-guide/) whenever an article is added to your Help Center.
For a full overview of what's possible with Webhooks, take a look at these articles:
[Webhooks - Internal NoteInternal Note](https://internalnote.com/tag/webhooks/)
# Calling the Zendesk API
As mentioned above, one of the most powerful and hidden webhook features is their ability to call the Zendesk API from within a webhook. Or as I call it: leveraging the power of `/api/v2/tickets/{{ticket.id}}.json`.
I've written about it in the past in passing in a l couple of articles already:
1. [Return to Sender - Reassign Zendesk Tickets back to the original agent](https://internalnote.com/return-to-sender/) \- This article mentions reusing an update ticket webhook and provides details on setting up a webhook for user and organisation events.
2. [Update a requester name via webhooks and custom fields](https://internalnote.com/update-a-requester-name-via-webhooks-and-custom-fields/) \- This article details the setup of a webhook that updates the ticket requester's name using a custom field and a trigger for created tickets that calls the webhook for web form tickets.
3. [Zendesk Custom Objects - Part 4: End-User and Forms](https://internalnote.com/custom-objects-part-4-end-user-and-forms/) \- This article explains setting up a webhook to fill in a Lookup field for end-users by having them fill in an Intermediate Field.
4. [Automatically link incidents and problems in Zendesk](https://internalnote.com/automatically-link-incidents-and-problems-in-zendesk/) \- This article outlines the creation of a trigger that utilises a webhook to update a ticket based on specific conditions.
In each of these scenarios we use the Zendesk ticket API to update tickets based on conditions in triggers and automations.
# Setting up the webhook
Before we can get started with some examples, we need to setup the webhook itself. We only need to setup this webhook once, and we can use it across all the triggers and automations that require it.
To setup the webhook go to *Admin Panel > Apps and Integrations > Webhooks* and add a new webhook.
## **Conditions**
- Name: Update Ticket
- Endpoint URL: `https://domain.zendesk.com/api/v2/{ticket.id}}.json`
- Type: POST
- Authentication: Basic
- admin@domain.com/token
- A Zendesk API Token
Once configured the system will run a test. You'll need to enter an existing ticket ID. No worries, no actual data will be updated!




# Example scenarios
## **Migrate Field Data**
Zendesk Messaging and the Zendesk Bot allow for asking customers for information during a flow, or before a ticket is submitted to an agent.
So in a scenario where you want customers to contact you, you might want them to enter a Membership number during the flow. Chances are you already had such a ticket field setup for your Help Center forms.
But now you run into an issue. The existing Membership ID field was a numeric field, but Messaging only supports Text Fields in its Answers. Which means you need to create a new Membership Ticket Field of type *Text* which leaves you with two Membership Fields.
The best solution here is to deactivate the existing Membership numeric field, and also add the text field to your forms so that you have one field to work from, or one field to use in reporting.

To make such a migration, it would be nice if you could migrate all memberships entered into the numeric field to the new text field for all active tickets so that agents don't loose this information while you're making the changes. This is where the webhook comes in!
### Solution
To migrate all the existing data over we can use an Automation combined with our webhook.



The webhook has the following conditions:
- Ticket status is less than solved (since we only want to update active tickets)
- Ticket tags do not include `updated_membership` . We set this tag upon update so we know which once we already updated.
We then have two actions:
- Set tags to `updated_membership`
- Notify Webhook: Update Ticket (the one we created earlier).
Our webhook has the following payload:
```JSON
{
"ticket": {
"custom_fields": [
{
"id": 123456789,
"value": "{{ticket.ticket.ticket_field_987654321}}"
},
{
"id": 987654321,
"value": null
}
]
}
}
```
💡
Note that `123456789` is the ID of the new text field, and `987654321` is the ID of the old numeric field.
Once we create our automation it will start migrating data up to 1000 tickets every hour. So depending on your backlog, your entire ticket queue will be updated quickly. Once all tickets are processed you can disable the automation, deactivate the old numeric field, and enable the new text field in your forms.
💡
I like to create a view during these kind if migrations where I show a list of all tickets where the Membership Text Field is set. Every hour you'll see this view free up until it contains no more tickets.
### Alternative uses
This combination of automations and webhooks is perfect to process large amount of tickets while your refactoring an existing Zendesk instance and want to combine or update existing fields without losing data. I've used it for combining category fields, moving from text fields to the new lookup fields, or similar flows.
Just note that this will only work on tickets that are not closed since these are read-only so your old tickets will remain as is.
## Account Manager
Lookup Fields in Zendesk can be used to link different objects together.
One popular use case for Sales oriented Zendesk environments is adding an *Account Manager* field to Organisations, that links to an Agent or Light Agent in your instance. This way you can quickly reference that John McClane is managing the Nagasaki account.

When looking at a ticket for that organisation, you might want to use a macro or trigger to automatically add John as a follower to the ticket when escalation is needed. The problem is that although you can reference a tickets' organisation in triggers, you cannot (yet) access nested lookup fields in triggers. So the Account Manager field on the organisation level is not accessible in your trigger.


### Solution
This is yet again a scenario where our webhook comes into play:
What we'll do is create a new Ticket Field *Account Manager*. This field is a Lookup Field that links to user objects.

We can then create a trigger with the following conditions:
- Ticket is created
- Organisation > Account Manager is present

We then add an action to notify our Update Ticket webhook with the following payload:
```json
{
"ticket": {
"custom_fields": [
{
"id": 1234567890,
"value": {{ticket.organization.custom_fields.account_manager.id}}
}
]
}
}
```
Here, `123456789` is the ID of our Account Manager Ticket field. Note that by using the `.id` suffix for the `{{ticket.organization.customfields}}` placeholder will return the ID of the account manager linked to the organisation, instead of their name.
Now, whenever a ticket is created for whose organisation an account manager is set, we'll update the ticket to set the account manager field on the ticket. We can then leverage that value for escalations as Follower, Side Conversation e.a.
### Alternative uses
You can use this flow to set any kind of lookup field. So if you've linked an asset to a ticket, you can fill in a location field on the ticket for routing to the right team, or fill in a supplier field for automatically escalation the work to them via side conversation.
Or, instead of setting a custom field, you can also set the ticket assignee to the account manager linked to the organisation via:
```
{
"ticket": {
"assignee": {{ticket.organization.custom_fields.account_manager.id}}
}
}
```
# Similar use cases
The scenarios above focus on updating the current ticket with information from organisations, users or other ticket fields.
## Updating users
We can leverage the same concept to update a ticket requester instead by creating a new *Update Requester* webhook that points to `api/v2/users/{{ticket.requester.id}}.json`.
You can leverage this webhook for a couple of scenarios:
Zendesk doesn't natively allow you to ask for a phone number in the same way we can ask for a name or email address. So most users resort to creating a ticket field *Phone Number* to ask for that information.
The issue here is that the data lives on the ticket object, where it should live on the user object so the profile information is always available across tickets.
By creating a trigger that notifies the *Update Requester* webhook and pushes the following payload, we can push the Phone Number stored in ticket field `123456` to the users' profile
```
{
"user": {
"phone": "{{ticket.ticket_fields_123456}}"
}
}
```
Or similar, if we want to store the membership number from our first scenario at the start of this article on the user profile, we can use the same webhook and push the following payload. (Assuming we have a user field called "membership"
```
{
"user": {
"user_fields": {
"membership": "{{ticket.ticket_fields_123456789}}"
}
}
}
```
## Help Center Escalation
To wrap this up with one final flow I'm tinkering with is a way to turn good comments into draft articles for your Help Center:
- Have a macro that tags a ticket with "worthy of an article"
- Have a webhook that calls `/api/v2/help_center/en-us/sections/123456789/articles`
- Post the last comment of the article via `{{ticket.latest_comment_formatted}}` as part of the [article payload](https://developer.zendesk.com/api-reference/help%5Fcenter/help-center-api/articles/?ref=internalnote.com#create-article).
```
{
"article": {
"title": "Porposed article - {{ticket.subject}}",
"body": "{{ticket.latest_comment_formatted}}",
"locale": "en-us",
"draft": true
}
}
```
This will create a new draft article, which will get picked up in your Zendesk Guide knowledge base management. You then use the new [Zendesk Guide AI](https://internalnote.com/preview-of-the-new-generative-ai-for-knowledge-in-zendesk/) features to expand that comment into an article.
# Conclusion
As you've seen above, no matter if it's automation copying data between fields in bulk via automations, or linking user and organisation data to tickets and users, you can leverage the webhooks to make these complex flows possible without resorting to external resources.
How are you going to leverage this new superpower?
### Zendesk Roundup for February 2024
URL: https://internalnote.com/roundup-2024-02/
Last updated: 2024-02-06T19:08:04.000Z
Last month part of my team at the office went to Zendesk's internal sales kick-off, and came back with dozens of photos from their roadmap for this year. Without going into details, I think we can define the last month as *quiet before the storm*.
I'm sure we'll get all the details at Zendesk's [Relate](https://www.zendeskrelate.com/event/819e790c-37ac-4207-bfef-ab965999c0ef/websitePage:e96179e2-d1f4-42b1-a98c-93a7e810563d?ref=internalnote.com)[ Event](https://www.zendeskrelate.com/event/819e790c-37ac-4207-bfef-ab965999c0ef/websitePage:e96179e2-d1f4-42b1-a98c-93a7e810563d?ref=internalnote.com) in April. Zendesk has just put the entire schedule online with over 60 sessions and presentations about AI, Employee experience, trends and workforce management. For those who can't join the event itself, they also made a digital event [available](https://virtualevents.zendesk.com/series/relate-24/landing%5Fpage?utm%5Fsource=relateirl&%5Fgl=1%2A2y1bfz%2A%5Fga%2AODAzMTc2OTEzLjE3MDA2NjY4NjA.%2A%5Fga%5FFBP7C61M6Z%2AMTcwNjg2MzU4My43LjAuMTcwNjg2MzU4My42MC4wLjA.) where they'll - presumably - live stream the main keynote, so be sure to join that one!
## Sign up for Internal Note
A blog about Zendesk with a focus on ticket automation
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🏢 Company
## 🐱 Klaus
Zendesk has announced they'll be acquiring [Klaus](https://www.klausapp.com/blog/a-message-from-the-founders/?ref=internalnote.com), an AI powered Quality Assessment tool. They offer a range of dashboards and tooling to combine insights in tickets, agent feedback, customer feedback into one tool and give Team Leads actionable insights in how their team is doing.
This seems like a logical move for Zendesk. A few years ago they made a failed move into Sales with the purchase of Zendesk Sell, but ever since they went private again they made a 180 with a focus on customer and employee experience. They also set their sights on the Enterprise market and with bigger companies come bigger customer care teams. So expanding Zendesk with Workforce Management (Tymeshift) and better insights into these teams (Klaus) will give companies using Zendesk the data they need to keep improving their service.
[A message from the founders: Zendesk has signed a definitive agreement to acquire KlausWe’re happy to announce that Klaus and Zendesk have signed a definitive agreement to push the boundaries of high-quality customer interactions.KlausKlaus](https://www.klausapp.com/blog/a-message-from-the-founders/?ref=internalnote.com)
## 🌍 Green Targets
Next up, an announcement that's [close to my heart](https://verschoren.com/values?ref=internalnote.com): Zendesk updated their Sustainability Targets with a refocused strategy on renewably energy, sustainable data-centers and green offices. You can read the full announcement [here](https://www.zendesk.com/newsroom/articles/science-based-targets/?ref=internalnote.com), but [this](https://www.linkedin.com/posts/megantrotter%5Fi-am-incredibly-proud-to-announce-zendesks-activity-7155263678865362944-h0zh?utm%5Fsource=share&utm%5Fmedium=member%5Fdesktop) LinkedIn post sums it up nicely.
I personally try to contribute by giving away 1% of the revenue of this blog via [Stripe Climate](https://climate.stripe.com/PkrvZK?ref=verschoren.com), and Ghost, the platform where I run this blog on, has the [same](https://climate.stripe.com/6MNofu?ref=internalnote.com) initiative.

# 🎉 New Releases
## 🤖 AI Powered Conversational Experiences
This month saw a few long-awaited improvements for Messaging platform. First up is the ability to [show](https://support.zendesk.com/hc/en-us/articles/6604813452570?ref=internalnote.com) restricted Help Center content in the Zendesk Bot for authenticated end-users. When you use sign-in only Help Center, or if you restrict certain articles for Agents or user-segments, the Zendesk Bot will now be able to return these articles as part of a search, AI generated response or within Bot Flows.
It's not (yet) possible to restrict specific Bot Answers to a segment, but at least when your Help Center is properly segmented, your Messaging flow is now able to handle those articles. If you haven't setup Authentication yet, take a look at the article below to get started!
[Authenticate Zendesk MessagingZendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.Internal NoteThomas Verschoren](https://internalnote.com/jwt-messaging/)
### Omnichannel Routing support for Chat
> However, we understand that accounts might have a transition period when adopting messaging in which both messaging and live chat are in use. Therefore, omnichannel routing now supports accounts that are using live chat and messaging channels. When activated, omnichannel routing will assign chat and messaging tickets to agents. - [Link](https://support.zendesk.com/hc/en-us/articles/6645794339866?ref=internalnote.com)
Omnichannel routing is Zendesk's new method of assigning tickets to agents. It replaced the old trigger or cherrypicking based approaches of the past and routes tickets to the right agent based on skills, availability and priority of tickets.
Since this is a new approach it is build entirely on top of Messaging, Agent Workspace and Agent Status, but that left out a big chunk of older Zendesk customers that still rely on Chat. The feature gap between chat and messaging is almost gone, but moving big setups to Messaging and implementing that change in big companies can take time, so Zendesk has now added basic support to their Omnichannel Routing to at least support Chat messages, even though not all bells and whistles are supported.
### Answer Linking
And to conclude this month's Messaging announcements, you can now link to other Bot Answers at the end of other flows. This enabled re-usable Answer Flows, reduced the size of existing flows, and even allows to link to the beginning of the conversation.
[Answer Linking for the Zendesk BotAs a first big release for the Zendesk Bot this year, Zendesk is introducing Answer Linking, which can turn answers into reusable blocks!Internal NoteThomas Verschoren](https://internalnote.com/answer-linking-for-the-zendesk-bot/)
## 👨🏻💻 Agent Workspace
The Agent Workspace got only one new release this month, with the addition of recent search queries, and recent tickets/users in the search field. It's a nice addition that makes jumping back to earlier work just that bit faster.
> When agents click the search bar within Support a new menu appears that displays their three most recent searches and their three most recently viewed content records.
>
> Content records include Tickets, Users, Organisations, Articles, and Side Conversations. Clicking on a recent search automatically performs the search. Clicking on recently viewed content automatically navigates to that record.

For those who use the Zendesk Mobile app, you might have noticed it got a rebranding this month. It's no longer called *Support*, but is now called *Zendesk Support* and the logo has moved from the classic green logo block, to a new black Zendesk logo.

## 🔎 Help Center and Self Service
Since last year Zendesk has a [Redirect EAP](https://internalnote.com/redirect-rules-for-zendesk-guide/) available for Zendesk Guide that allows you to redirect Help Center urls to other pages. It's useful for redirecting archived articles to their newer version. In its initial release you could only redirect existing paths (like an article url), but the EAP got expanded with the ability to redirect any kind of URL. So you can now have support.domain.com/password redirect to your article that explains a password reset.
Last month [saw](https://internalnote.com/roundup-2024-01/#%F0%9F%94%8E-help-center-and-self-service) the addition of `` to the Content Blocks feature. This month the list of tags got expanded – as announced [late last](https://internalnote.com/roundup-2024-01/#%F0%9F%94%8E-help-center-and-self-service) year – with a whole new set of supported elements, which makes building nice CTA blocks to be used across article that much easier!
```
`a`, `abbr`, `address`, `aside`, `bdi`, `bdo`, `blockquote`,
`br`, `caption`, `cite`, `code`, `col`, `colgroup`, `data`, `dd`,
`del`, `details`, `dfn`, `div`, `dl`, `dt`, `em`, `figcaption`,
`figure`, `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `hr`, `iframe`,
`img`, `ins`, `kbd`, `li`, `mark`, `ol`, `p`, `pre`, `q`, `rp`,
`rt`, `ruby`, `s`, `samp`, `small`, `source`, `span`, `strong`,
`sub`, `summary`, `sup`, `table`, `tbody`, `td`, `tfoot`, `th`,
`thead`, `time`, `tr`, `track`, `ul`, `var`, `video`
```
The [Generative AI feature for Zendesk Guide](https://internalnote.com/preview-of-the-new-generative-ai-for-knowledge-in-zendesk/) got expanded with a new Tone that will simplify the written text into shorter, less complex text. Perfect for turning an article written by your developers into something end-users actually understand 😅.
And to conclude, the Request List for end-users in the Help Center now supports the [Custom Status](https://internalnote.com/tag/custom-ticket-status/) feature.
## 🧱 Open and Flexible Platform
First off, it’s now possible for end-users to [enable 2FA](https://support.zendesk.com/hc/en-us/articles/6584372830362-Announcing-two-factor-authentication-for-end-users?ref=internalnote.com) on their accounts. This is enabled by default for all instances and doesn’t require any admin settings.
Secondly, for those using [Custom Objects](https://internalnote.com/tag/custom-objects/) you can now hide object types for your agents. So if you have objects that are only surfaced in a third party app, or are used to store data that should be directly interacted with by agents you can now hide those in the Object Viewer. Or similarly, if you have object types you don't use anymore, you can hide them instead of deleting them.

Zendesk AI got also expanded with a new Industry: Travel. This leaves HR, IT, Hospitality still on the announced roadmap. (Although I think most of us are waiting for fully custom models based on your own data like [Ultimate.ai](https://ultimate.ai/?utm%5Fsource=internalnote) offers)
# 💡Insights
## Demystifying LLMs
[Demystifying LLMs: Ultimate’s take on Next-Gen Conversational AI – Ultimate. RnD BlogThe rapidly evolving landscape of AI has witnessed an influx of new terminology, acronyms and buzzwords, such as GenAI, LLM, Prompt Engineering, and others. This article aims to demystify these terms, focussing on Large Language Models (LLMs), which have emerged as game-changers, blending technological prowess with vast capabilities. We will discuss their capabilities, how they are trained and look at both their risks and their potential as well as briefly touch on how Ultimate embraced these models to revolutionize customer Interactions.Meysam Asgari-Chenaghlu, Staff AI Researcher](https://rnd.ultimate.ai/blog/large-language-models-and-generative-ai?ref=internalnote.com)
The team at [Ultimate.ai](https://rnd.ultimate.ai/blog/large-language-models-and-generative-ai?ref=internalnote.com) has created a development focus blog where they dive into the technical side of their product. One of the first articles offers a deep dive on how LLMs for Conversational AI really works. Worth a read!
## Extreme brainstorming questions
[Extreme brainstorming questions to trigger new, better ideasWe know, “no idea is a bad idea,” but brainstorming is often unsuccessful. These prompts actually work. They could even lead to a unique business model.A Smart BearJason Cohen](https://longform.asmartbear.com/extreme-questions/?ref=internalnote.com)
This article focuses on brainstorming, but also posed an interesting question: what would you need to setup in order to remove the need of an actual customer support team?
> If you were never allowed to provide tech support, in any form, what would have to change?
My 3 big ticket items are:
- a knowledge base to gather documentation
- a way to have self-service based on that info on an FAQ or Chatbot
- and a feedback loop that detect gaps in your knowledge.
What are yours?
## Help Center PDF Export
The people at SwiftEQ wrote up a nice tutorial on how to add a print option to your Help Center that outputs nicely formatted PDFs with your company’s logo.
[How to Enable PDF Export for your Zendesk Help Center ArticlesImage by vectorjuice on Freepik Welcome to a step-by-step guide on enhancing your Zendesk Help Center! By the end of this tutorial, you’ll have successfully implemented an option for visitors to download or export articles as PDFs in a professional format using the printing function of their browser (Ctrl+P). This feature not only adds value for your customers by allowing them to easily download articles for offline use, sharing, or printing, but also enhances the overall user experience of yourswifteqSorin Alupoaie](https://www.swifteq.com/post/export-pdf-zendesk-help-center%20?ref=internalnote.com)
# 🎥 Videos
I spoke on a recent event from [Ultimate.ai](https://www.ultimate.ai/webinars/scale-smarter-with-generative-ai-conversation-design?utm%5Fsource=internalnote) and they just put the conversation on Youtube. Apologies for the terrible freeze-frame 😅.
# ⚠ Major Changes
### Legacy Social Messaging deactivation
> Effective July 31, 2024, the legacy Social Messaging app will cease to function and customers will no longer be able to send or receive messages using the legacy app. To retain messaging functionality, you will need to set up social messaging within Agent Workspace by following the instructions linked below. - [link](https://support.zendesk.com/hc/en-us/articles/6558217474458?ref=internalnote.com)
Ye be warned 🏴☠️
### Automatic activation of Omnichannel Routing
> Starting April 2024 Zendesk will start the automatic activation of Omnichannel Routing for specific accounts. Once enabled agents will have the use the new Unified status updates to set themselves available for chat, phone or ticketing assignments. - [link](https://support.zendesk.com/hc/en-us/articles/5716181238938?ref=internalnote.com)
Zendesk will automatically enable the feature, but as long as you don't setup a routing tag or tweak your triggers to make use of it, you won't notice any difference.
# 📝 Articles this month
[Managing Storage Limits in ZendeskThis article gives insights in how to manage your data usage limits in Zendesk, how to bulk delete specific tickets and how to remove attachments to keep your data usage under the allowed limits and reduce the risk of paying more!Internal NoteThomas Verschoren](https://internalnote.com/storage-limits/)
[➕ Zendesk Security ChecklistOne of the big Trends for 2024 is the idea that security no longer is an add-on but should be seamlessly incorporated throughout the customer journey. To get started the right way, I’ve written a Zendesk Security Checklist. It’s a practical approach to improve the security of your Zendesk instance.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-security-checklist/)
[Zendesk CX Trends 2024Zendesk just launched their Trends Report for 2024 giving insight into where Customer Experience and support is moving towards this year. I’ve written up my own overview of the trends and how I see the product moving forward influenced by these trends.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-cxtrends-2024/)
[Answer Linking for the Zendesk BotAs a first big release for the Zendesk Bot this year, Zendesk is introducing Answer Linking, which can turn answers into reusable blocks!Internal NoteThomas Verschoren](https://internalnote.com/answer-linking-for-the-zendesk-bot/)
[Restarting a Zendesk Messaging ConversationThis tutorial shows you how to build an Answer flow for Zendesk Messaging that allows visitors to restart the conversation.Internal NoteThomas Verschoren](https://internalnote.com/restarting-a-zendesk-chat-conversation/)
# And Finally...

> "We're building so many things in 2024, but one product my team is especially looking forward to building is Dark Mode as a native setting across Zendesk Support, one of our highest requested features from agents. It's not just about aesthetics. Agents are starting at our default bright white screen 8-hours-a-day, 5-days-a-week, which ultimately ends up causing strain and drains agent efficiency. This also opens up the door for theming - which is a way for customers to customize their entire Ul with their company branding/colours." - JJ Miclat, Group Product Manager Agent Workspace.
🎉
### Restarting a Zendesk Messaging Conversation
URL: https://internalnote.com/restarting-a-zendesk-chat-conversation/
Last updated: 2024-04-08T07:54:47.000Z
At the end of the [Answer Linking for Zendesk Bot](https://internalnote.com/answer-linking-for-the-zendesk-bot/) article I quickly mentioned it's now possible to restart a conversation in the Messaging Widget. I didn't really go into details, so enjoy this short bonus article that explains you how!
[Answer Linking for the Zendesk BotAs a first big release for the Zendesk Bot this year, Zendesk is introducing Answer Linking, which can turn answers into reusable blocks!Internal NoteThomas Verschoren](https://internalnote.com/answer-linking-for-the-zendesk-bot/)
## Sign up for Internal Note
The blog about Zendesk with a focus on Ticket Automation and AI
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
## How to restart a conversation
With the new Answer Linking you can link back to the beginning of the conversation. So if we create a custom Answer that only applies this step, we can restart the conversation for our customers.
Setting it up requires only a few short steps:
1. Create a new Answer for your bot, called *Restart Conversation*
2. Give it a few training phrases like *"Reset", "Restart Conversation", "Back to the beginning"*
3. The Bot flow exists out of one step: a "Link Answer" step that links back to the start of the conversation.



Once you set it up, whenever a customer interacts with your bot and indicates they want to restart the conversation, the conversation will restart with your welcome message.
Enjoy.
➕
If you like this kind of content and want to support this blog, take a look at [Internal Note Plus](https://internalnote.com/plus), a paid tier with more content.
### Answer Linking for the Zendesk Bot
URL: https://internalnote.com/answer-linking-for-the-zendesk-bot/
Last updated: 2024-08-19T20:34:40.000Z
Over the last year Zendesk has been investing heavily in their Zendesk Bot both from an Intent Mapping and from a Flow Builder standpoint.
At the end of last year they introduced [Dynamic Bot experiences](https://internalnote.com/dynamic-conversation-experiences/) which allow more powerful API integrations with support for variables, arrays and dynamic carousels. This release removed some big ticket items from my feature wish list.
This week, as the first big release for 2024, they are introducing [**Answer Linking**](https://support.zendesk.com/hc/en-us/articles/6636652095770-Announcing-answer-linking-for-Zendesk-bots?ref=internalnote.com) as a way to make big complex bot flows more easy to manage.
# Answers
When Zendesk introduced the Zendesk Bot – or Answer Bot as it was called then – they relied almost entirely on Flow Builder to build the bot with steps, flows and conditions. You can add comments, offer options and buttons, and have conditional flows to route customers to articles, external pages or, if needed, agents.
With the arrival of Zendesk AI they changed their approach to the bot and made it intent based. Now, out of the box, the bot will read a customers' comment and propose up to three Help Center articles, either as direct links with snippets, or as generated replies via Zendesk AI.
For more complex flows where we need more information from the customer like an order number, or want to route the customer to a series of questions to detect the right solution for their problem, Zendesk still offers these custom build flows under the section *Answers.* These answers can be triggered with specific keywords or intents and allow you to build more complex purpose-built flows for your customers.
This way, your self service approach can scale from very broad to very specific within the same bot.

The evolution of Zendesk Bot
Ideally you deflect the most requested (and easy) questions via Help Center articles and generated replies to those questions. Then, for more complex flows, you can build an Answer with steps and options to guide the customer to an answer, or to pull in external information. And for the most complex and unique questions that require a human touch, you still have your agents.
"*How do I reset my password?*", can be answered with an article. "*Where is my order?*" might require an Answer flow with an API call. "*My hamster escaped on the plane*" needs a real agent to assist. And hopefully we can move more and more customer questions from Agent towards automated articles or Answers.
# Custom Flows
When building custom flows to assist your customers you quickly run into the scenario where multiple answers require the same steps. Each question about a malfuncting smartphone requires a software update or reset. Each complex scenario you didn't account for requires an escalation to an agent. Each customer who needs to access your system might need the steps to reset a password or remember their account.
Until now there were two approaches to handle these repeated scenarios. You can copy-paste all the required steps across all the custom answers you build. Or you could end each flow with a "did this help? ⟶ "No" and ask them to rephrase the question, or tell the customer to ask for "how to reset my password"
However you turn it, it's not ideal. A change in the password reset flow requires you to update every answer that references it, and good luck remembering all of them.

# Linked Answers
This week Zendesk released a new *Step Type* for Flow Builder. This new type allows you to link to another Answer within another flow. This means we can take the flow above, that has repeated Agent Escalations steps and split it into two.
One flow contains the *"Talk to an agent"* steps, including a check for Business Hours, and an Ask for Details step to ask for name and email.
And the original complex flow replaces the entire Transfer to Agent flow with a new Linked Answer step that links to the new "Talk to an agent" flow.

And similarly, we can use this same "*Talk to an Agent"* step and use it in another flow

# Best Practices
Now that we can reuse flows and link to them, it might become best practice to go over your existing flows and identify any flows you re-use. Good candidates are escalation flows or lookups via API.
You can then pick one of these recurring flows and copy the steps to a new Answer. I like to prefix mine with \[BLOCK\] so I know this is a block I use a lot. Then go over all your flows once again and replace these recurring flows with your new blocks.
Similarly, if you have very big flows you can now break them up into smaller chunks and create one flow that handles the routing (e.g. question about iPhone, iPad, MacBook) and then link to the answer flows that handle these three types. Your flow builder trees become a lot smaller per Answer, and a lot more more handy to navigate.
# Caveats
There's a few caveats with this new step type:
- The *Transfer to Agent* steps allow you to add a `tag` to the escalation. Naturally, all answers that link to a transfer step with a tag will contain the same tag now.
- Any *Ask for Details* requested in previous steps are forwarded to the ticket if you escalate to an agent (e.g. Order Number). However, if you create a variable, those are not usable across Answers. So if you get the Order Status in your "Order Status" flow via API, you can't use that status as a variable in steps of a linked answer.
💡
In [comments](https://support.zendesk.com/hc/en-us/articles/6636652095770/comments/6646695864858?ref=internalnote.com#comment%5F6646695864858) on the original post the Product Manager gave this feedback:
"Currently, variables and tags can’t be carried across linked answers. However, we are already working on supporting this with our next release scheduled for early Q2."
- If you asked for data via *Ask for Details*, and the next flow references that same Field in its own *Ask for Details* field, it will already be prefilled with the previous data.
- You can't currently link an Answer to itself (luckily). You can however create a loop by linking Answer A to Answer B, Answer B to Answer C, and Answer C back to Answer A. So be careful not create a loop.
# Conclusion
This step type is a welcome addition to the bot building flow that will make many complex flows a lot smaller and easier maintainable.
Are there things I'd like to see? Sure, I'd like to put an Answer in the middle of a flow and have it process input (e.g. an API call to get order status might be used in the middle of multiple flows for different purposes). But even without that, I'll welcome this new Linked Step type with open arms!
💡
The Linked Answers step also allows you to link back to ****Start of the Conversation**! So if used wisely, it can be used as a reset button at the end of specific flows if the customer gets stuck.
### Zendesk CX Trends 2024
URL: https://internalnote.com/zendesk-cxtrends-2024/
Last updated: 2024-01-26T14:58:07.000Z
Zendesk just launched their [Trends Report for 2024](https://premiumplus.io/the-10-cx-trends-driving-2024-powered-by-zendesk/?utm%5Fsource=InternalNote&utm%5Fmedium=Article&utm%5Fcampaign=CXTrends) giving insight into where Customer Experience and support is moving towards this year.
Last year's report had 5 big trends:
1. AI experiences are becoming more evolved and seamless
2. Conversational experiences are empowering consumers
3. Customers are eager for deeper personalisation
4. Consumer well-being and sentiment are reshaping CX
5. CX teams are breaking down silos as they become more integrated
Looking back at those trends today, you can clearly see that Zendesk made big shifts and improvements in their platform to accommodate these trends. The launch of Zendesk AI, major expansions in their Messaging platform and bots, and improvements in Agent Workspace with regards to Teams integrations, Slack bots, and custom objects, made sure that Zendesk could offer a technical solution for each of the trends.
This year's report doubles the amount of trends with a whopping ten insights that will allow you to *Unlock the power of intelligent CX*.

The trends are split across three Innovation Areas: AI & intelligent Experiences, Data & Trustworthy Experiences, and Next Gen & Immersive Experiences.
Conveniently, these three areas map nicely into two new add-ons Zendesk launched in 2023: *Zendesk* *Advanced AI* and *Advanced Customer Data and Privacy Protection*, with the third area partially covered with the acquisition of Tymeshift last year.
Let's dive in.
# AI & Intelligent Experiences

## Trend 1: Generative AI will accelerate the delivery of a more humanised journey that feels personable & interactive.
> But can generative AI help businesses provide the kind of warm, human service that feels like interactions with local, family-owned businesses? More than two-thirds of CX organisations think that it will help their business provide that warmth and familiarity, even if they serve millions of customers.
One of the main benefits I find in these new Generative AI-driven bots like those from Zendesk or Ultimate is the fact that they work completely differently than the decision tree-based bots from before.
It used to be that a bot was the chat equivalent of a phone IVR. Do you want sales or support? Support. What kind of question do you have? "something broke", "product support", "upgrade questions" and so on, until you hopefully either make the right decisions and get an answer, get completely frustrated and restart the conversation until you find the right incantation, or start typing human, human, human, until you reach an agent.
Now with Generative AI bots instead of me searching for an answer, I can just ask a question "How do I update my iPhone?" and the bot will reply with the answer without the need of navigating a decision tree of predefined options.
That combined with a specific tone of voice, context from my previous questions and, hopefully, the data the company has on me, will result in better answers and quicker resolutions.
Is Zendesk there yet to fulfil the needs of this trend? Partially. Asking a question and getting data from your Help Center works like a charm, but there's no actual conversation happening here, and the data available to the bot is limited to the Help Center, the Zendesk AI bot cannot execute API calls or collect information from external or internal resources to give a richer answer with more context.
💡
Coincidentally, the Ultimate webinar where I [spoke](https://www.ultimate.ai/webinars/scale-smarter-with-generative-ai-conversation-design?ref=internalnote.com) last week did cover these kinds of richer hybrid AI + integrations approach that's currently lacking in Zendesk.

## Trend 2: Chatbots are rapidly transforming into digital agents that have the capacity to do more.
> Chatbots are doing a better job at surfacing information quickly, and they're also improving their ability to tailor responses to better fit where customers are in their journey.
A good customer care approach has always and will always revolve around self-service and knowledge management. Even before chatbots, having a knowledge base with your top 10 support inquiries and a system in place that can automatically reply with those topics will dramatically reduce the workload of your customer care team.
Chatbots and AI offer a more powerful version of this since it improves on two aspects:
1. It can turn a customer inquiry into an intent and have a better grasp of what the customer needs instead of doing a basic keyword search in the knowledge base.
2. It can turn the available knowledge sources into a custom answer tailored to the needs of the customer, instead of replying with a link to the article or the exact article contents.
It comes as no surprise that these two improvements are what make agents better at handling support than regular search, and now that bots have these same capabilities, even more customer questions can be handled by the bot without any human interactions.
What's missing is the more complex workflows. Autonomously handling refunds, booking changes, reservations... Some of these are already possible by using the API endpoints for the Zendesk Bot, and I'm sure we'll be seeing more of these items become natively available in the Zendesk Bot once elements like [Conversational Commerce](https://www.zendesk.com/blog/conversational-commerce/?ref=internalnote.com#:~:text=Conversational%20commerce%20refers%20to%20how,Last%20updated%20August%2016%2C%202023) become more widely available within Zendesk.

## Trend 3: Disconnect grows between CX leaders and agents on everything related to AI; strategy, tools, and role impact.
> The problem is that many agents aren't so sure. They look at the new tools with a mix of wariness and deflation, fearing what AI will mean for their job security.
The big promise of AI is that it can automate a lot more processes and lower the workload for agents. It generates insights by tagging each conversation and automates offering answers to customer inquiries.
This gain in efficiency can have two results which are on the opposite side of the spectrum. On one hand, you can start from the status quo. You're kind of happy with your CSAT and First Reply Time metrics and see the reduction in tickets as a way to reduce headcount. Less work means fewer people needed to do that work while not really impacting your customer experience in a negative way.
On the flip side is the idea that you can use that extra time to improve your customer support. You can give agents actual time to dive into the complex issues or you can use that time to look into processes and documentation. The former allows you to have deeper, more personal conversations with your customers and really solve their issue, the latter improves self-service and offers more knowledge to your bot to deflect even more tickets.
However you look at it, if you use the impact AI can have on your support interactions as a trigger to improve, you create room for agents to grow and become experts in handling cases or documentation.
So it's important that, as a company, you lay out your vision and choose to go for quality or quantity and be transparent on why you implement AI in your company and what you will do with the efficiency gain. You can choose the short-term solution of reducing headcount and freeing up costs. Or you can go for the long-term approach of creating a cycle of continuously improving your customer experience by shifting agents towards more complex roles.

## Trend 4: AI transparency and decision-making are now the rule, not the exception
> The need for trust through transparency becomes especially important when dealing with sensitive information that reveals a person's identity, their health history, and their financial status. No customer wants to feel like AI is snooping on them or making their data available to bad actors. As 58 percent of consumers told Zendesk, knowing how their data is collected, stored, and used plays an outsized role in whether they'll purchase a product or service from a company.
The answer to the question "who owns or runs your AI model" will become a hot topic this year.
Where 2023 was the year of "everyone uses OpenAI" as a way to hack AI into your company, I think 2024 will become the year where the question "who owns our model" is the big question to ask when enabling AI in your company. You want to be sure answers are based on actual facts, and you want to be sure that it's only you who can use your own data, and not a competitor.
Zendesk has its own AI models trained on Zendesk Data, and made available to their customers. The answers generated to reply to tickets are based **solely** on the data in your Help Center or your own ticket data in the case of suggested macros. It only uses OpenAI to generate a reply, but the data used to generate the reply is 100% controlled by Zendesk, and in the case of intent or sentiment mapping, OpenAI is not even involved.
As a company, this [Mark Zuckerberg](https://www.youtube.com/watch?v=9aCg7jH4S1w&ref=internalnote.com) vision is a sure thing within Zendesk. Your customers can only get answers based on data you made available to Zendesk.
> Yeah, so our view is that there’s actually going to be a lot of these that people talk to you for different things. \[...\] let’s say you’re a small business and you want to have an AI that can help you interface with customers to do sales and support. You want to be pretty confident that
>
> your AI isn’t going to be promoting your competitor’s products, right?"
As a customer, the question about trust is twofold. On one side it's the question "can I trust the answer I get from the bot", and on the other side it's the question "can I trust this bot or company to handle my data correctly".
One is about making sure that the answer "can I melt an egg" is replied to correctly. The other is about "if I enter my birthday here, how securely do they store it". I don't think we'll get to a point where customers will see the Zendesk Logo on a chatbot as a way to know "hey this is safe". But I do think that a quality bot with good answers will automatically infer a feeling of trust that will give customers assurance that they can *trust* the bot with their personal data.
# Data & Trustworthy Experiences

## Trend 5: Businesses are heavily focused on being able to instantly modify user experiences, putting increased pressure on leveraging data in real time.
> That preference means companies must focus on boosting their bot capabilities via Al, specifically using its power to capture and analyse sentiment and intent. Doing so will help businesses predict customer needs and resolve issues quickly and efficiently (including knowing when a bot needs to hand over an interaction to a human agent).
For me one of the main benefits of bots powered by Generative AI is the aforementioned idea that they allow customers to ask questions instead of customers navigating a flow to find an answer.
- A generated response based on knowledge base data (or other sources)
- An API powered flow that pulls in context (e.g. order status) to reply to the customer
- An escalation to the right agent based on intent, sentiment and conversation content
Most customer interactions possible today (In Zendesk) are very closely linked to indexed knowledge base content as a basis for an automated self service approach. But recent updates in e.g the Zendesk Bot for more [dynamic conversation experiences](https://internalnote.com/dynamic-conversation-experiences/) make the bot capable of pulling in external data to offer more complex answer flows.
I really hope Zendesk will keep improving that part of their bot in the next year, making it easier to pull in data from CRM, webshop or other systems and combine that data with Generative AI to have more complex and data-driven conversations with customers.
So now that the Knowledge Based bots are a solved matter from a technical standpoint, the focus this year will shift towards conversations powered by other types of data, further reducing the need for agents to do these repetitive lookups, and once again giving them more time to dive into the complex and unique questions.

## Trend 6: CX leaders are the new drivers of data privacy as AI & personalisation take on a greater role.
> They know that it's not good enough to simply have Al tools for personalisation; those solutions must keep customer data secure.
Looking back at Relate 2023 it's almost surprising this trend wasn't Trend 1 in this report. At the keynote they showed off this awesome slide which kinda sums up the entire trend.

There's a couple of benefits of powering your customer interactions with AI. One benefit is that you can better capture intent, which also means that instead of asking a lot of data in a form, you can ask for only the data needed to solve the inquiry, since you can closely match question and intent.
Within Zendesk we've now got [automatic ticket deletion](https://internalnote.com/storage-limits/), build-in redaction tools in the Agent Workspace and more secure integrations to make sure data is shared correctly across platforms.
Similarly, if we can have API integrations in the bot that pull in the data directly from the source, we need to pass less data to agents, or store less data in tickets, since we can resolve inquiries before they even reach the ticket stage.
It's all small changes, but they can amount to a big reduction in customer data stored, while not loosing the ability to correctly and swiftly resolve their inquiries.

## Trend 7: Security is no longer an add-on but is seamlessly incorporated throughout the customer journey.
> Thankfully, CX leaders have options for seamlessly integrating security measures into customer experiences, most of which aren't new: multi-factor authentication, encryption of service interactions, and being transparent with customers about security and data privacy practices.
Security and Privacy go hand in hand, and this is a trend one where Zendesk is has made big efforts in the last 12 months, starting with a renewed focus on Privacy and Security at [Relate 2023](https://internalnote.com/relate-2023/#%F0%9F%94%92-privacy) and the release of more complex role and permission settings, messaging and end-user authentication, an entire new security add-on and more.
If you're interesting in securing your Zendesk instance, take a look at my Security checklist published earlier this month.
[Zendesk Security ChecklistOne of the big Trends for 2024 is the idea that security no longer is an add-on but should be seamlessly incorporated throughout the customer journey. To get started the right way, I’ve written a Zendesk Security Checklist. It’s a practical approach to improve the security of your Zendesk instance.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-security-checklist/)
# Next Gen & Immersive Experiences

## Trend 8: Live and immersive experiences are now heavily influencing the future of online shopping.
> Now, 80 percent of consumers expect chat agents and support representatives to assist them with everything they need. The line between support and sales has begun to blur.
Remember [Zendesk Labs](https://zendesklabs.zendesk.com/hc/en-us?ref=internalnote.com) announced at Relate 2023? We've still not seen any actual feature releases or EAPs for their idea of conversation commerce, even though this concept is closely related to this eight trend.
As mentioned in one of the earlier trends, shifting conversations towards bots gives agents the room to dive into the unique issues. Similarly, the more complex scenarios bots can handle, the more is expected of the bot by consumers.
In a classic scenario I might get an article about the return policy, or in a AI powered scenario I might get a custom reply based on my question.
For example, if I booked a flight but want to move my return journey one day forward. My first step would be to open the airline's app and view my booking and try to change the booking there. If that doesn't work, I'd either open the in-app chat and ask for "how to change my return flight," or even better, I could get a proactive bot message asking me about my booking changes.
But even if the answer I get is "yes, this is possible" or "no, it's not possible, you need to book another flight," to actually resolve my question, the chatbot or agent would need context (who am I, what flight, which ticket type), would need power (update, cancel, reschedule bookings), and would need to do it right then and there in the chat.
Is this a sales scenario? Yes, since I need to potentially buy a new ticket or pay a surplus for the rescheduled journey. Or is this a support scenario? Yes, because I don't know if it's possible and how to reschedule my ticket.

## Trend 9: Voice is carving out a more advanced role focused on handling complex and escalated issues.
> When companies create a seamless transition from digital to voice channels for handling complex issues, consumer confidence in the former rises. That in turn becomes a virtuous cycle in which customers feel increasingly satisfied with reaching out via digital channels, thus lessening demand for phone options.
People who know me, know I'm not the biggest fan of voice as a customer care channel. Voice requires both the customer and the agent on the other side to make time **now** to handle and resolve an issue, whereas more often than not an asynchronous approach of asking a question and getting an informed response or solution offered an hour later is often way more rewarding.
This idea, sadly, starts from the negative idea that most customer care teams are not able to resolve issues now and then, and that the person picking up the phone is often not enabled to make the decisions or changes needed to resolve an issue.
However, like the trend report mentions, if a lot of customer interactions shift towards the automated chat channels I prefer, this actually frees up time for agents to handle only the complex issues that require an actual human interaction. And, just like with Siri or Alexa, asking via voice to add "coffee to the shopping list' is way faster than typing it out, and a phone call or conversation does allow for a more nuanced discussion often needed to handle these complex issues.
So if companies follow the idea I mentioned earlier of using the efficiency gain made possible via AI to give agents the room to dive into the complex issues, then voice might become the logical channel to have those longer and deeper conversations that actually solve my issue.[an easy way](https://internalnote.com/voice-api-for-zendesk/) to turn a chat conversation into a call via the web widget, and the new [Generative AI for Voice](https://internalnote.com/preview-of-the-new-generative-ai-for-voice/) turns long conversations into short summaries, allowing for easier escalation to the right person to handle the ticket.

## Trend 10: Predictive agent management tools are finally eclipsing traditional methods.
> However, leaders now have agent management tools at their disposal that can take a lot of the guesswork out of running a support operation. These tools can offer both operational and strategic foresight, helping managers make better staffing and training choices.
It's no coincidence that, in the last twelve months, Zendesk has bought both [Tymeshift](https://www.tymeshift.com/?ref=internalnote.com), an agent scheduling and forecast tool, and [Klaus](https://www.klausapp.com/?ref=internalnote.com), an AI-powered Quality Management platform. They both fill gaps in the platform that enable bigger customer care teams to get insight in what agents are doing, and make sure the right type and amount of agents are available to handle customer inquiries.
Both purchases are fairly recent (or in the case of Klaus not even fully completed) so there's not much to say about how the tools currently integrate deeply into the Zendesk platform, but given the wealth of historical data available in your own Zendesk, the insights they can pull based on all the thousands of other Zendesk customers, it's only logical that they leverage that data to give insight into agent availability natively, instead of handing that data off to an external party.
And if AI Bots shift agents towards more complex interactions, you want to make sure that, if a customer needs a human, the right person is available to chat, call, or reply to you.
# Conclusion
I have to admit, this was a tough article to write. Where my overview of the [Customer Service Trends](https://internalnote.com/ultimate-trends-2024/) by Ultimate last year went fairly easy due to the trends being practical and more technically focused, Zendesk's trends are a bit more *fluffy* and less grounded in technical reality.
That being said, they do force me to take a bird's eye view of the Zendesk Platform and how it plays in the broader ecosystem of customer care and companies, instead of writing weekly about the nitty-gritty feature releases launched by them.
**If I have to pick one favourite Trend, it's gotta be Trend 4 (AI transparency and decisioning are now the rule, not the exception).**
I'm a big proponent of "control your own data". It's the reason I write on my own website and not just post on LinkedIn. It's the reason why I use Apple products, since they have a very strict stance on privacy, and it's the reason why I like to work with Zendesk or Ultimate.
They both allow companies to build solutions based on their own data and tweak it to their own needs, while integrating with basically everything. But regardless if a customer contacts you via Facebook or email, searches your FAQ, or chats with your bot, you have to be sure you give answers based on the data you provide, and that you can report on all the interactions you have. And your customers have to be sure that the answers they get can be trusted.
### Zendesk Security Checklist
URL: https://internalnote.com/zendesk-security-checklist/
Last updated: 2025-09-08T06:41:23.000Z
One of the big Trends for 2024 is the idea that security no longer is an add-on but should be seamlessly incorporated throughout the customer journey.
To get started the right way, I've written a Zendesk Security Checklist. It's a practical approach to improve the security of your Zendesk instance.
# Email, Web and DNS
Zendesk comes secured out of the box with a fully validated set of email addresses and domains to get started. In my case that would be `support@internalnote.zendesk.com` for the support address, and a `https://internalnote.zendesk.com/hc` domain for my Help Center that's secured with an SSL Certificate.
However it's best practice to replace those with email accounts and a Help Center domain that are based of your own domain name. E.g. `note@internalnote.com` and `https://support.internalnote.com`. Not only do those look better and reflect mine or your brand, they also give you full control later if you ever want to move away from Zendesk, migrate to another instance, or want to control security yourself. Doing this does not remove Zendesk's build-in security measures, it just shifts the branding and domains towards your own.
## Email
When it comes to securing your email communication there's a few basic settings you need to get right. First off, make sure you're using a custom support address (e.g.`note@internalnote.com`) and it's set as the primary email address. This way you're never sending out emails with a `@subdomain.zendesk.com` email address, and your customers only receive emails from your trusted domain.
While you're in the list, it might also be a good idea to [remove](https://support.zendesk.com/hc/en-us/articles/360057705734-Decommissioning-email-support-addresses?ref=internalnote.com) any unwanted email addresses from the list. A cleaner list is easier to manage, and less change of bad configurations.
If you've added your own custom domain to Zendesk, you'll also want to validate the DNS settings for your support email addresses. The `SPF` record will make sure your email that gets send from Zendesk does not go into customers' spam.
The `zendeskverification` record binds your domain uniquely to that specific Zendesk instance, and the two `DKIM` records authenticate your outgoing emails.
| DNS | Type | Value | Comment |
| -------------------- | ---- | ------------------------------------ | ------------------------------------------------------------ |
| @ | TXT | v=spf1 include:mail.zendesk.com -all | You might have more values here |
| zendeskverification. | TXT | Random Text Value | Unique per Zendesk instance and domain. You can add multiple |
You can check if your settings are correct by validating if all items under *Admin Center > Channels > Emai*l are green. If some give an error, use [this article](https://support.zendesk.com/hc/en-us/articles/115014034108-Authenticating-incoming-email-SPF-DKIM-DMARC-?ref=internalnote.com) to fix your issues. Note that you need to do this for each (sub)domain added to your Zendesk instance.

After validating all your email settings, make sure to go all the way to the bottom of that page and enable a Custom Domain for [DKIM](https://support.zendesk.com/hc/en-us/articles/203663326-Digitally-signing-your-email-with-DKIM?ref=internalnote.com) too. This will authenticate your emails as being allowed to be send from Zendesk with your custom domain, and will further prevent them going into spam.

| DNS | Type | Value | Comment |
| --------------------- | ----- | -------------------------------- | ---------------------- |
| zendesk1.\_domainkey. | CNAME | zendesk1.\_domainkey.zendesk.com | Primary DKIM domain. |
| zendesk2.\_domainkey. | CNAME | zendesk2.\_domainkey.zendesk.com | Secondary DKIM domain. |
While you're in the Admin Center, also make sure to enable *Authenticate emails received with SPF, DKIM, and DMARC alignment*. This used to create a lot of suspended tickets, but now that DKIM and DMARC are more and more adopted, it actually helps reducing spam in your instance.

## Help Center
The next item on the list is mapping the default Zendesk domain to a custom subdomain of your own. This is done by adding the following record to your DNS table:
| DNS | Type | Value | Comment |
| -------- | ----- | --------------------- | -------------------- |
| support. | CNAME | subdomain.zendesk.com | Help Center hostname |
Once you've done so go to either:
- *Admin Panel > Account > Branding*
- *Admin Panel > Account > Brands > (choose a brand)* (Enterprise)
And [add your custom domain](https://support.zendesk.com/hc/en-us/articles/203664356-Host-mapping-Changing-the-URL-of-your-Help-Center?ref=internalnote.com#topic%5Fpwv%5Fln2%5Fv3) in the Host mapping field.
Next, go to *Admin Panel > Account > Security > More Settings > SSL* and enable a [Hosted SSL certificate](https://support.zendesk.com/hc/en-us/articles/203664356-Host-mapping-Changing-the-URL-of-your-Help-Center?ref=internalnote.com#topic%5Fpwv%5Fln2%5Fv3). Also make sure to enable HTTP Strict Transport Security to make sure you never fall back to HTTP

💡
Zendesk offers automatic SSL management via LetsEncrypt. You can use your own Certification chain if you want, but if you don't own or manage your own certificate chain, LetsEncrypt is a good way to get SSL enabled without any management of your own. (Or worrying about annual renewals)
## Web Widget
You can[ setup the Web Widget](https://support.zendesk.com/hc/en-us/articles/4500748175258-Installing-the-Web-Widget?ref=internalnote.com#topic%5Fedv%5Fxd5%5F2tb) to be available only on specific domains. This prevents others from copying your widget code and embedding the widget on their own website. Doing this wouldn't give them access to your tickets or data, but would lend credibility to the rest of their website.
# Agent Accounts
The second big block of security measures can be found in the way your end-users and agents sign into Zendesk. By default Zendesk allows anyone to create tickets, and users can create accounts with passwords stored in Zendesk itself.
You can choose to allow other login methods like social or business platforms, or, if you choose to allow Zendesk accounts, you can setup the security levels for passwords and enforce 2FA options to further secure your logins.
## Login Methods
When configuring the way your agents login to Zendesk there's two methods available:
1. You use the native Zendesk option and have agents login with credentials directly within Zendesk
2. You have an Enterprise SSO solution like Microsoft, Google Workspace or Okta enabled in your company and want agents to login that way.
### Enterprise SSO for Agents
The benefit of enabling any kind of SSO solution is that you centralise your agents' authentication flows within your company and control access to all your SAAS tools in once place. This makes on- and off boarding employees easier, you can setup a single account with security policies, and Zendesk, your email tool, your intranet and all other platforms linked will adhere to those policies.
Zendesk has some pretty good [documentation](https://support.zendesk.com/hc/en-us/articles/203663826-SSO-single-sign-on-options-in-Zendesk?ref=internalnote.com) on how to enable this.
> what to do with the Zendesk authentication once an external authentication method like an Enterprise SSO is enabled?"

There's two ways to approach this.
1. If you have external parties using your Zendesk, like e.g. contractors, who aren't in your Enterprise SSO, you can leave the Zendesk accounts enabled. This way Agents can login with their business account, and contractors can access Zendesk via `https://subdomain.zendesk.com/access/normal` to login with a password stored in Zendesk.
Obviously, this will also allow agents to login similarly, potentially circumventing your SSO policies.
2. If you never want someone to use a Zendesk password, you can disable Zendesk authentication. This way you can only login with your SSO account credentials. However, if your SSO goes offline, you're locked out of Zendesk too. Luckily admins can use the SSO Bypass via [https://subdomain.zendesk.com/access/sso\_bypass](https://d3v-verschoren.zendesk.com/access/sso%5Fbypass?ref=internalnote.com) to login with a one-time-password link emailed to them to gain access again and restore the Enterprise SSO options in that scenario.
### Zendesk Accounts
Since last month Zendesk now has a new Recommend setting for their accounts. This is enabled by default for all new customers, but existing customers might have a different option enabled. I recommend using this new setting by default since it checks for breached password matches via [HIBP](https://haveibeenpwned.com/?ref=internalnote.com).

If you go to *Admin Panel > Account > Security > Advanced* there's also a few settings you might want to validate:
- Disable "*Enable admins to set passwords*". This setting allows admins to set passwords and then email them as clear text to customers. Passwords should never be shared and sending a reset password link from the Agents' profile is a better practice.
- *Email notifications* on password change should be enabled so people are aware of unwanted actions.
- Enforce [2FA](https://support.zendesk.com/hc/en-us/articles/4408826974874?ref=internalnote.com) to further secure Accounts. This is not required if you use Enterprise SSO solutions since they often have their own 2FA policies.
## Roles and Permissions
Once you've setup the way agents get access to your instance there'a a few extra audits you can run to make sure agents have the right access and permissions.
### Groups
First off, make sure your agents only belong to the groups they should have access too. Often agents are temporarily added to other groups to cover for colleagues during holidays, or are still in their old department groups.
The easiest way to handle this is to go to the Groups settings in Admin Center > People and do a quick audit of each group.
### Ticket Access
Regardless of your instance having access to custom roles or not, you should check if [Agents](https://support.zendesk.com/hc/en-us/articles/4408886939930-Adding-agents-and-administrators?ref=internalnote.com#topic%5F3zw%5Fyl2%5Fyg) or their [roles](https://support.zendesk.com/hc/en-us/articles/4408882153882?ref=internalnote.com) (enterprise) have access to the right tickets.
You can set an agent's access to tickets as:
1. All tickets
2. Tickets in agent's groups
3. Tickets in agent's org
4. Assigned tickets only
It's best practice to set this to the second option since this way an agents can work as a team on their assigned tickets, without getting access to other departments' work (important in case of HR or Finance scenarios).
### Admin Access
If you're using Zendesk Enterprise you have the benefit of giving [specific user roles](https://support.zendesk.com/hc/en-us/articles/4408882153882?ref=internalnote.com) limited admin access. This way you can allow Team Leads to e.g. manage Views or Macros, while keeping the rest of the Admin Center locked to a specific set of Administrators.
Best practice in this scenario is to create custom roles for Agents, Team Leads (with minimal Admin permissions) and Admins (all permissions). This way you can allow for customisation, while retaining control of your instance and preventing too many people from having full access rights.
I've even seen customers with roles for Guide Admin, Reporting Admin, Agent Workspace Admin, ... and assign these bespoke custom roles to maybe just one or two people in the organisation.
### Agent Roles
Once you're done validating Agent group access, reviews your user roles and maybe created a few new "Light Admins", you need to review all your agents in Admin Center > People > Team members and make sure that only active employees are in that list. You can downgrade anyone else to end-user (or suspend them, see below). This is especially important in the case if light agents since they often get access to a lot of tickets for third line support roles, but are always outside of the Customer Care team and might be overlooked in reporting or audits.
Once your list is cleaned, go over the remaining agents and make sure they all have the right Ticket Access or Custom Role assigned to them.
# Triggers
This one might seem weird but disabling all triggers that alert agents of incoming tickets is a security measure.
Imagine a scenario where a potential scammer creates an urgent message via email to support@yourdomain.zendesk.com.
If they enter, for example, a message that ask you to reset om your password by clicking here, then all your agents will get an email from your instance that they should do so. Some will see this as legit, and will do so. Phishing attempt: successful!
So disable triggers that alert your agents and train them to go to Zendesk regularly.
# End-Users
💡
One topic I'm not handling in this article is the choice between an open Zendesk environment and a closed environment that only allows specific or [authenticated](https://support.zendesk.com/hc/en-us/articles/4408893912986-Permitting-only-users-with-approved-email-addresses-to-submit-tickets?ref=internalnote.com) users to submit tickets.
This choice is not really about security but is more about catering to specific use cases like Financial Institutions or Internal Help Desk, instead of supporting every potential customer like most B2C setups would do.
## Login Methods
Similar to Agents, one of the first things to look at are the login methods for end-users. But where the login for agents handles protecting your Zendesk instance and all the data within, authentication for end-users is important because it's the way to know if you're actually speaking to a specific customer, and to allow customers to find their past conversations.
By default Zendesk offers their own Zendesk Accounts and passwords. Here too I would recommend to pick the [Recommended](https://support.zendesk.com/hc/en-us/articles/4408887573274-Understanding-options-for-end-user-access-and-sign-in?ref=internalnote.com) option cause it protects end-users from falling into the trap of re-using the same (breached) passwords. As for 2FA, the ability for end-users to enable this has [just](https://support.zendesk.com/hc/en-us/articles/6584372830362-Announcing-two-factor-authentication-for-end-users?ref=internalnote.com) been announced!
Since good customer experiences is all about meeting the customer where they are and supporting them within the right context, it's important to also adopt that same process when it comes to authentication. So enabling social logins via Facebook, Google or Microsoft accounts offers the customer flexibility in choosing their channel of preference, while still making sure you get the right information: name, email and validation it's them.
Similarly, if you run your own login system for your webshop, product or platform, it might be worthwhile to look [into linking that](https://support.zendesk.com/hc/en-us/articles/4408885847962?ref=internalnote.com) to Zendesk so you can offer a transparant SSO flow to your customers.
## Messaging
Zendesk Messaging and the Web Widget allow you to authenticate users by passing along a JWT token. This gives agents the benefit they can see they're talking to the actual person, and removes the need for end-users to provide their name and email each time.

You can read all about enabling authentication for Zendesk Messaging in the widget and on your Help Center in the article below.
[Authenticate Zendesk MessagingZendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.Internal NoteThomas Verschoren](https://internalnote.com/jwt-messaging/)
## Data Access
When working with end-users there's a few additional options to check. In *Admin Center > People > End-users* you should make sure that end-users can always change their passwords (in case of a breach elsewhere).
While you're in that section it might also be good to enable the "Validate Phone numbers" option. This makes sure the numbers stored are actual phone numbers and not just some random digits, so if you ever need them to map your customers' WhatsApp profiles or incoming Talk tickets, you know the data is good. (This will only show an error when numbers are edited or added and will not remove any exiting data).
# Data integrity
So far we've handled communication and access to and from your Zendesk instance. This section will dive into the data that's actually in your Zendesk instance.
The first topic might be a controversial one, but I'm a big proponent of setting up some kind of auto-deletion rule for old and archived data because if the data isn't there, you never run the risk of exposing or leaking it. I wrote a full guide on this last week, so you can refer to that one if you want to clear some old data.
[Managing Storage Limits in ZendeskThis article gives insights in how to manage your data usage limits in Zendesk, how to bulk delete specific tickets and how to remove attachments to keep your data usage under the allowed limits and reduce the risk of paying more!Internal NoteThomas Verschoren](https://internalnote.com/storage-limits/)
## Redaction
Next up, make sure to enable the[ Automatic Ticket redaction](https://support.zendesk.com/hc/en-us/articles/203663876-Automatically-redacting-credit-card-numbers-from-tickets-Professional-and-Enterprise-?ref=internalnote.com) to make sure no credit card numbers show up in your system. It's also best to train agents to make use of the [native redaction tools](Agent workspace redaction, train agents - https://support.zendesk.com/hc/en-us/articles/4408846470170) in the Agent Workspace so no sensitive or personal information remains in your tickets while they're being handled.

## Marketplace Apps
Zendesk has a big marketplace with thousands of apps that add features to your Zendesk instance. Similar to how I go through the apps I linked to my personal [Google](https://support.google.com/accounts/answer/13533235?hl=en&ref=internalnote.com) account once a year, it's best to go over your Marketplace apps from time to time too.
Go to *Admin Panel > Apps and Integrations > Zendesk Support Apps* to find a list of active and enabled apps. If any apps are unused or no longer relevant you can [disable or uninstall](https://support.zendesk.com/hc/en-us/articles/4409155972378-Managing-your-installed-apps?ref=internalnote.com) them. Whatever option you choose, they no longer get loaded when looking at tickets, reducing the risk of data getting send to tools you no longer need.
💡
Uninstalling an app removes all settings and you no longer need to pay for it.
Disabling the app keeps its settings, and you might still need to pay for it, depending on its subscription model.
Once you've cleaned your app list you can dive into each app and enable [group and role restrictions](https://support.zendesk.com/hc/en-us/articles/4409155972378-Managing-your-installed-apps?ref=internalnote.com#topic%5Fxyf%5Fwmw%5Fqfb) for each app. These settings allow you to configure the apps so that only a specific set of your agents can access them. For example, an app that shows invoice and payment information for your customers might be useful for your Finance team, but shouldn't be visible to the IT team. Similarly an app that shows employee information is useful for HR, but not for your Customer Care team.

## App Authorizations
Ever wondered with external platforms have access to your Zendesk instance? With the [App Authorizations](https://www.zendesk.com/marketplace/apps/support/1011454/app-authorizations/?queryID=cedea5867e8df134b2b74924e82ae412&ref=internalnote.com) app from Zendesk Partner Sweethawk you get a nice overview of all tools you ever added to your Zendesk, and a one click option to remove their access.

# Zendesk API
## API Access
Zendesk has an extensive and powerful API that can be reached via a few authentication methods, not all of which should be enabled for it to work as expected.
By default Zendesk allows for password access and also has a Token access. If you've enabled 2FA like mentioned in the earlier recommendations Password access will not work anymore. I recommend [disabling it](https://support.zendesk.com/hc/en-us/articles/4408889192858-Managing-access-to-the-Zendesk-API?ref=internalnote.com#topic%5Fzbv%5Fck1%5F2yb) by default and switching to API tokens with a unique Token per integration. This reduces the risk of leaking passwords, and if one gets leaked, you can rotate that one to a new one without affecting the other integrations.
Next, go through your list of API tokens and remove all Tokens that have never been used, or have not been used in the last 3 months. You can always generate new ones if you need them.
If you only have a single token active but know you have more than one integration, I highly recommend adding additional tokens per integration and migrating them each to a unique token.
💡
I really hope in a future update I can also add a recommendation to limit the scope of your tokens to the applicable API paths. But sadly Zendesk' tokens are global and have access to your entire Zendesk instance.
## Webhooks and Targets
💡
Zendesk Targets will be [deprecated](https://support.zendesk.com/hc/en-us/articles/6468124845210-Announcing-the-deprecation-of-URL-targets-and-branded-targets?ref=internalnote.com#:~:text=Zendesk%20is%20discontinuing%20support%20for,targets%20in%20favor%20of%20webhooks.) soon, but even so it's recommended to check both Webhooks and Targets for the time being.
Webhooks are used to send data out of Zendesk to external platforms. They can be added by Admins, or can be installed as part of Apps and Integrations you installed via the Marketplace.
Normally, once you uninstall a Marketplace app, its linked Webhooks will be removed too. But it's best practice to go over this list and check if there are any unknown or unwanted Webhooks in the list. You can open a Webhook and look at the Activity tab to see if they've been recently used, and what data got sent out.
You can use the Actions dropdown top right to disable or delete any unneeded webhooks.

# Admin Center
## Audit Log
If you're using Zendesk Enterprise you get access to the [Audit Log](https://support.zendesk.com/hc/en-us/articles/203663196?ref=internalnote.com). This log gives you insight in any Admin changes made in your instance, as well as any ticket or user deletions that might occur. So if you're ever in a scenario where something weird happened with your data, or you want to know who made a critical change in your instance, that would be the first place to start looking.
## Security Alerts
Zendesk allows you to subscribe to security alerts for your instance by entering a security contact via the admin panel > Account > Security > More Settings.

You can also subscribe to status updates about your instance via [https://status.zendesk.com](https://status.zendesk.com/?ref=internalnote.com).
# Advanced Data Privacy and Protection add-on
We can't wrap up this security checklist without a mention of Zendesk's newest add-on: the Advanced Data Privacy and Protection add-on.
This add-on adds an extra layer of security on top of the existing features:

| Access Log (EAP) | Expands the Audit Log with insights into what each agent looked at in your instance |
| -------------------------------------- | ----------------------------------------------------------------------------------- |
| Advanced Data Retention Policies (EAP) | This allows you to setup more complex ticket deletion rules |
| Advanced Redaction (Announced) | Automatic redaction of more than just credit cards |
| Data Masking (Announced) | Hide specific ticket and user fields for specific sets of agents |
| Advanced Encryption (EAP) | BYOK Encryption |
Since most of these are announced and not generally available, I'll write more about it once I can get my hands on all the features.
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Managing Storage Limits in Zendesk
URL: https://internalnote.com/storage-limits/
Last updated: 2025-07-06T17:52:47.000Z
Zendesk is a SAAS product, meaning you buy a license of the product and they provide you with hosting, storage, software, security and all other elements you expect of a good software application.
When looking at SAAS offerings we can broadly put them in three buckets:
- **Seat based licensing,** where you pay per active user of the tool. Zendesk falls under this bucket with its Agent based licensing. You per pay active agent in your environment
- **Usage based licensing**, where you pay on how much you use the product. Mailchimp is such a tool, where you pay for the amount of recipients in your email list. Sunshine Conversation is another, where you pay per active monthly user.
- **Storage based licensing**, where you pay for the amount of storage used. Think Amazon S3, Google Drive or other solutions.
Most SAAS tools offer a combination of these. For example, in Google Workspace, each user license comes with a set amount of storage, but you can buy additional storage if you need more.
Zendesk has always been Seat Based and didn't really have limits imposed. A ten agent environment could serve 100, 1000 or a million end-users and your bill would be the same regardless.
But this has now changed. [Announced](https://support.zendesk.com/hc/en-us/articles/6340068721434-Announcing-the-Storage-usage-dashboard-in-Admin-Center-and-increased-storage-limits?ref=internalnote.com) at the end of November, Zendesk will now enforce a more strict storage usage on its platform, and will bill customers with an overage upon their next renewal.
# Your available storage
There's two types of storage measured:
- **File Storage** is the most straightforward. It's the attachments linked to your tickets, e.g. PDF files, images, signatures,....
If you receive an email with three 5MB attachments, those would count as 15MB of File Storage used.
- **Data Storage** is all other data in your Zendesk: the ticket object, comments, metadata (ticket fields, attachment metadata, tags,..), users, custom objects (2kb per object). On average, a ticket with three comments counts as about 5kb of data storage if I compare the usage across multiple instances.
Zendesk calculates your available storage as follows:
> \[BASE STORAGE for your plan\] + (\[AMOUNT of agent\] \* \[ADDITIONAL storage\])
So if you have Suite Professional with 10 agents, you would have 11GB of Data Storage, and 60GB of File Storage available.

## Overage

If you go over your allotted usage, Zendesk will show a notice in the Admin Center. You can then either reduce your usage by removing data or by buy additional capacity.
This is done by buying Storage Units (500 MB Data + 25 GB File Storage) and it's bought on a per-unit, per-month basis. But they don't come cheap!
# Viewing Storage Limits
Zendesk has added a new [Dashboard](https://support.zendesk.com/hc/en-us/articles/4408835043994?ref=internalnote.com) to the Admin Center to view your Storage usage. It gives you a high level overview of your current usage, and a timeline on how the data usage evolved over time.
The screenshot below shows the basic overview of storage usage in an instance that went over its File Storage:

Instance with 50.000 tickets
And if you drill down into the details, you can see a curve on how the data grew over time.

Instance with 50.000 tickets
💡
Note that the steep rise in usage starting in May is caused by the lack of indexed older data. Zendesk only started indexing storage usage around mid May 2023.
Sadly, the dashboard doesn't give you any more details. You can't see which tickets cause the usage, or where the big attachments are.
## How to find your overusage
Since we can't pinpoint the exact perpetrator, we can only fix this issue in bulk and work with averages. This is not an exact science, but since the amount of tickets is so big, we can assume the average per ticket is correct.
Take the example above. We know we have 50.000 tickets, and our File Usage is 60GB. This means that, on average, we have 1.2MB of File Storage per ticket.

If we want to reduce our File usage to get under the storage limit, we need to delete at least 10GB, so let's delete 15GB to be safe. That would equal deleting 12.500 tickets in our instance. This also frees up 2.5GB of Data usage at the same time.
💡
The easiest way to find out the amount of tickets in your instance is to look at the most recent ticket ID in your instance. Or, if you ever deleted tickets, you can go to Explore and open the Default Support dashboard and set the Time to show **All History*. The **Created Tickets* value excludes deleted tickets.
You can calculate your own via [this](https://demo.internalnote.com/storagelimits?ref=internalnote.com) calculator:
# Deleting Data
‼️
This article shows you ways to delete data in your Zendesk instance. Always double check your actions and make sure you don't delete something you don't want to.This article offers guidance, but I'm not responsible for any accidental data loss in your instance!
There are a couple of approaches to delete data. You can either do a deletion of tickets or delete only attachments in tickets.
If we delete tickets, that will also include any attachments linked to these tickets so we win storage in both tiers.
The downside is that you will lose reporting data on those tickets, so it might be better to delete a specific set of tickets (e.g. all except those Finance), or only delete attachments.
## Bulk Delete Tickets
### Via the Admin Center
To delete those 12.500 tickets, we can look up ticket #12500 in our Zendesk environment and note down its creation data. If we delete all tickets older than that date, we'll free up the necessary storage! For our example, let's assume ticket #12500 was created on December 13th 2021, and is thus approx 2 years, or 730 days old.
Deleting the required tickets can be done via the new [Timed Ticket Deletion](https://support.zendesk.com/hc/en-us/articles/6062884435866?ref=internalnote.com) (EAP). Go to the Admin Panel > Objects and Rules > Settings and enable Timed Ticket Deletion, and set the value to the required amount of days.
This will start the automatic deletion of all tickets that are older in your instance, and will run continuously.

### Via the API
Or, if you prefer the API route, we can use the [Bulk Delete Tickets](https://developer.zendesk.com/api-reference/ticketing/tickets/tickets/?ref=internalnote.com#bulk-delete-tickets) endpoint, and delete our tickets per hundred via the following command:
```bash
curl https://{subdomain}.zendesk.com/api/v2/tickets/destroy_many.json?ids=12500,12449,12448 -v -u {email_address}:{password} -X DELETE
```
⚠️
Zendesk has strict [API limits](https://developer.zendesk.com/api-reference/introduction/rate-limits/?ref=internalnote.com) so bulk deleting thousands of tickets has to be done over a long period of time. Don't go deleting 12500 tickets all at once cause this will impact your other integrations too.
## A more granular approach
The above example works fine if you want to just get rid of the data, but it doesn't work if you need to retain some tickets for regulatory reasons, or if you want your reporting data to remain available.
One solution to get a more specific set of tickets is to do a search that returns all tickets that are, e.g., not in a specific group and delete those tickets.
### Via the Admin Center
💡
Zendesk has announced multiple Deletion schedules as part of the Advanced Data Privacy and Security add-on, which will allow you to delete tickets on a more granular basis, e.g. deleting all tickets in the Support group after three years, and those in Finance after seven.
For now, this feature is not yet available, not even in an EAP. So when this becomes available I will update this article.

### Via the Zendesk API
In the API call below, we search for all tickets that are not assigned to Finance group with ID `1234567890` and are older than 13th December 2021, since that's the date ticket #12500 in our example was created:
```bash
curl 'https://{subdomain}.zendesk.com/api/v2/search.json?query=type%3Aticket%20-group%3A1234567890%20created%3C2021-12-13' -v -u {email_address}:{password} -X
```
This returns a list of tickets from which you can then extract the IDs. We can then use the Bulk Delete endpoint to remove these tickets.

### Via a Marketplace App
#### GDPR Search and Destroy
However, instead of writing the code yourself, we can also use an app like [GDPR Search and Destroy](https://www.zendesk.com/marketplace/apps/support/206749/gdpr-search--destroy/?ref=internalnote.com) by Zendesk Partner [Sparkly](https://sparkly.dev/?ref=internalnote.com) to do this same search but without the additional coding work.
Their app allows you to Bulk Delete tickets based on search queries, and run these deletions once, or as a continuous script. It's the perfect app to fix these Data usage charges, or to keep compliant with GDPR and similar regulations.

After installing the app, you can add a Task. Choose Ticket Search as the type and search for tickets with the query `-group:360001292600 created<2021-12-13` . This returns a list of matching tickets excluding the group Finance, and created before Dec 13th. Once you validate your results, you can *Process* these tickets to clear your storage.

#### Zendesk Attachment Storage Offload
If you don't want to delete the data, but rather offload the data to somewhere else so you can still reference it, you can look at solutions like [Attachment Storage Offload](https://www.zendesk.com/in/marketplace/apps/support/1002546/attachment-storage-offload/?ref=internalnote.com) which takes attachments and moves them to a cloud storage managed by them or yourself.
[Zendesk Attachment Storage OffloadAttachment Storage Offload for Zendesk is a simple app to keep Zendesk attachments accessible while reducing storage costs.EH7P](https://zd-external-attachment-storage.eh7p.com/about?ref=internalnote.com)
# What about attachments?
Bulk deleting tickets will fix your storage issue, but leaves a big gap in your historical reporting. And more often than not, the issue is not the Data Storage (tickets), but the File Storage (attachments).
So a smarter way to approach this issue would be to only delete attachments of those 12.500 tickets. That way both storage tiers are in the green again, while retaining historical data.
The Zendesk API does not have an easy *get all attachments* endpoint, and neither is there a *delete attachments* option. We do however have a [Redaction](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket-attachments/?ref=internalnote.com#redact-comment-attachment) endpoint which allows us to remove the File Storage element of an attachment, and replace it with a 5kb reference file for the original attachment. When you redact attachments, what's left is your ticket with a reference of the attachments, and all other data intact.

## Via API
Let's assume we did the work and got a list of all IDs of the tickets for which we want to remove attachments. This can be all tickets up to ticket 12500, or a more granular list that excludes some tickets in specific groups.
For **each** of these tickets we can call:
```bash
curl https://{subdomain}.zendesk.com/api/v2/tickets/{ticket_id}/comments.json?include_inline_images=true -H "Content-Type: application/json" -v -u {email_address}:{password}
```
This returns the Comments of that ticket, and an array of attachments:
```json
{
"comments":[
{
"id":16065263235986,
"type":"Comment",
"attachments":[
{
"id":16065246996882,
"file_name":"Screenshot 2023-07-04 at 21.36.50.png",
...
},
{
"id":16065239646098,
"file_name":"Screenshot_2023-07-04_at_21.36.50_thumb.png",
...
}
],
...
},
...
],
"next_page":null
,"previous_page":null,
"count":2
}
```
For **each** of the attachments we can then run the following command to redact them:
```bash
curl --request PUT 'https://{subdomain}.zendesk.com/api/v2/tickets/{ticket_id}/comments/{comment_id}/attachments/{attachment_id}/redact' -v -u {email_address}:{password}
```
But as you can probably guess, this gets big fast. If we assume a ticket has three comments, and each comment has 2 attachments, then we need to make a lot of API calls.
> 12500 tickets x 3 comments x 2 attachments = 75000 API calls!
## Via Marketplace Apps
Luckily this is another scenario where we can resort to Marketplace apps like [GDPR Search and Destroy](https://www.zendesk.com/marketplace/apps/support/206749/gdpr-search--destroy/?ref=internalnote.com) to run this redaction without worrying about coding this loop for us!
The app does require you to upload a list of IDs, so we still need to export all comments for the 12.500 tickets and create a matching CSV file first.
We could do this via API, or use the [Exporter](https://www.zendesk.com/marketplace/apps/support/89495/exporter/?ref=internalnote.com) app (Enterprise license or trial required). This application has a Comments export feature we can use to generate a list of comments and their attachments. When exporting, select CSV (Semi-Colon) as the export type, and make sure you select the `ID`, `Ticket ID` and `Attachments URLs` fields.


Once we get our export of attachments, we can upload that file in the GDPR app and run the deletion. Mind, this deletion runs client-side in your browser, so depending on the amount of data, can take a while!



# Conclusion
So there we have it, a couple of approaches to handle ticket deletion in Zendesk via native features or by making use of marketplace apps.
With regards to the Data Policies I can understand a company changing its policy on how they handle data usage. Data is expensive, and most of the archived tickets in Zendesk instances are never looked at, so that's basically storage used for data that's never used.
But regardless of usage, starting to charge customers for data without offering proper tools to handle these changes is not that great. The bulk deletion options in Zendesk are either too broad or locked behind a paid add-on.
I really hope we'll see a more nuanced data-management feature in the future where we can delete tickets and attachments easily to keep us within our data limits. But until that day comes (if ever) I'm glad we've got third party options or API solutions to handle this issue when it arises!
💡
This article mentions [Sparkly](https://apps.sparkly.dev/?ref=internalnote.com) and the [GDPR Search and Destroy](https://www.zendesk.com/marketplace/apps/support/206749/gdpr-search--destroy/?ref=internalnote.com) app as a good way to resolve your storage usage. Even though I use their apps on a daily basis at my day job, this article is not sponsored by them in any way, and I show their app because I know it's a good tool to fix the issue.
### Zendesk Roundup for January 2024
URL: https://internalnote.com/roundup-2024-01/
Last updated: 2024-01-02T07:21:38.000Z
Happy New Year and welcome to 2024 🎆🎇!
I'm starting the year fresh with a new roundup of the last releases of 2023, clearing the slate for a new year of exciting Zendesk announcements and product updates!
2023 clearly was the year of **Zendesk AI** with major improvements in the Zendesk Bot and Agent Workspace enabling automation, insights, and better self-service across the board.
Last year was also the year of the new Agent Home and Omnichannel Routing, enabling a brand new way to interact with your assigned tickets.
Custom Objects and Layout Builder offered ways to customise Zendesk to fit your business needs, and the focus on privacy and security resulted in more granular admin permissions and a brand new automated ticket deletion feature and the new Privacy and Security Add-On.
So, what will 2024 bring? I'd love to see some kind of co-pilot capability for agents, offering agents a similar self-service experience as end-users get, surfacing internal processes, information, and context to agents. From a developer standpoint, I hope they bring more API endpoints to Zendesk for managing Answers, Bots, and Explore dashboards via API, enabling bulk actions on Custom Objects and a more granular permission approach for API tokens, with options for read-only, or scoped to a specific set of objects or actions.
But the year has only just started, and [Zendesk Relate](https://www.zendeskrelate.com/event/819e790c-37ac-4207-bfef-ab965999c0ef/summary?utm%5Fcampaign=2024%5FRelate&utm%5Fmedium=crosspromo&utm%5Fsource=LuminariesHub) is still 4 months away, so let's dive into last year's final announcements and get ready for 2024!
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🎉 New Releases
## 🤖 AI Powered Conversational Experiences
You can now [mention](https://support.zendesk.com/hc/en-us/articles/6297959490714-Announcing-Using-mentions-in-messaging-conversations?ref=internalnote.com) colleagues in messaging conversations. They'll be added as followers on the ticket and updates will appear in the Agent Home, as well as via notifications in the Agent Workspace.
## 👨🏻💻 Agent Workspace
The new [Agent Home](https://internalnote.com/tag/agent-home/) is now available for all Zendesk customers. It replaces the old dashboard view with a more actionable landing page for your agents. It shows agents all tickets assigned to them, including active conversations, gives quick links to followed or cc'd tickets, and provides a list of updates on tickets they worked on, or are mentioned in.

If you use Omnichannel Routing, or are an agent that used to work from a *My Tickets* view, I highly recommend setting Agent Home as your, well, Home Page, from now on!
## 🔎 Help Center and Self Service
It's now possible to pin both [internal](https://internalnote.com/zendesk-roundup-for-july-2023/) articles from your Help Center and [external](https://support.zendesk.com/hc/en-us/articles/6496294467738?ref=internalnote.com) articles indexed via Federated Search in the Knowledge Panel right next to tickets. Useful to point other agents to resources needed to resolve a specific ticket.
And if you use Content Blocks, they now support [tables](https://support.zendesk.com/hc/en-us/articles/6485855035674?ref=internalnote.com).
### Redesigning the editor experience.

In a series of articles, Zendesk announced a redesign of the article editor experience.
In a [first phase](https://support.zendesk.com/hc/en-us/articles/6486311589914?ref=internalnote.com), the editor will move publishing actions to the footer of the editor, similar to how Ticket Status currently works. This new footer will allow you to publish, draft, set review status, and preview the article.
This removes all publishing options from the sidebar, making the sidebar focused on organising your article in sections, setting permissions, and adding labels or promoted statuses. The sidebar is now only needed if you want to edit these settings and can be collapsed if you only want to focus on the content.
Later, the sidebar will be updated by moving all these options into different sections, making it more convenient and faster to update a specific setting of an article. And later in 2024, the articles themselves will also be expanded with additional HTML elements:
```html
abbr, address, cite, code, dd, del, dfn, div, dl, dt, em, figcaption, figure, hr, iframe, ins, kbd, pre, samp, small, source, span, sub, sup, track, var, video
```
## 🧱 Open and Flexible Platform
### Notion for Zendesk

I'm a big [Slite](https://refer.slite.com/cn8zn9oi7mha?ref=internalnote.com) fan myself, but for those of you who use Notion, there's a neat new integration available on the [Marketplace](https://www.zendesk.com/marketplace/apps/support/967901/notion/?queryID=e3b73edab1410e04ebee8d995051bceb&ref=internalnote.com).
## 🔐 Security and Privacy
Announced in October and finally available are the [advanced data retention policies](https://support.zendesk.com/hc/en-us/articles/6388095686682?ref=internalnote.com) which allow admins who purchased the Advanced Security Add-On to set up complex deletion policies for specific ticket types to comply with local privacy regulations, or to lower their Zendesk storage limits.
# 💡Insights
## Hybrid approach to Customer Support

Ultimate invited me to speak at their January 10th event about customer care, automation, and self-service. If you're interested, you can RSVP via [this link](https://www.ultimate.ai/webinars/scale-smarter-with-generative-ai-conversation-design?utm%5Fsource=internalnote).
# 🎥 Videos
Interesting end-of-year wrap-up interview with Zendesk CEO Tom Eggemeier.
> AI is a marathon, not a sprint.
You can watch it below on YouTube, or listen to the [Podcast](https://www.zendesk.com/blog/tom-eggemeier-podcast/?ref=internalnote.com).
# ⚠ Major Changes
Over a year ago, Zendesk released the new [Webhooks](https://internalnote.com/tag/webhooks/), which will replace the old URL Target functionality. They include more connection and security options, provide a better admin experience, and offer insight into their executions via a dashboard right within the Admin Panel.
Now, Zendesk has [announced](https://support.zendesk.com/hc/en-us/articles/6468124845210?ref=internalnote.com) the deprecation of these old URL Targets by October 28th, 2024, so take a look at your old Targets and move them over to Webhooks before it's too late!
# 📝 Articles this month
This month was a short month due to the Holidays:
- [Preview of the new Generative AI for Voice](https://internalnote.com/preview-of-the-new-generative-ai-for-voice/)
- [Dynamic Conversation Experiences in the Zendesk Bot](https://internalnote.com/dynamic-conversation-experiences/)
- [End of Year](https://internalnote.com/end-of-year)
# And Finally...
If you use liquid markup in your triggers and macros, you can use this bit of code to format your dates to a European show `DD-MM-YY` format.
```
{{ ticket.ticket_field_YourDateFieldID | date: "%e/%m/%Y" }}.
```
Or, if you work in Europe but want to convert the format to match your American customers;
```
{{ ticket.ticket_field_YourDateFieldID | date: "%m-%e-%Y" }}.
```
### End of Year
URL: https://internalnote.com/end-of-year/
Last updated: 2025-09-08T06:42:30.000Z
Welcome to my last newsletter of the year. This one will not contain any Zendesk news or updates, but will be a bit more of a meta, personal end-of-year update.
I'm writing this note from a couch with our Christmas tree in sight. End of year is about family, friends and tying up loose ends, but it's also about looking forward towards next year and how last year went.
The Internal Note project was started during the holiday break at the end of 2022 with three main motivations:
1. Keeping up to date with Zendesk releases is a big part of my 9 to 5 job, and this blog gives me a good way to test and validate the new features while also having a good logbook of my experiences with them.
2. Train different muscles was also a big part of the reason I wanted to blog. At work I scope Zendesk setups, offer consultancy for customers and develop integrations. But technical writing and maintaining a newsletter that forces me to write \~3k words a week is a whole new skill that I want to get better at.
3. I wanted to see if I could build a project that was self-sustaining and gets an audience.
My goal was to write an article a week and reach subscribers through organic growth. I'm not a fan of targeted ads via LinkedIn or Google, so I wanted to run this without that kind of advertising. Neither did I want to inject myself into active conversations on the Zendesk Community and link to this website in any relevant thread. The end result should be self-sustaining blog that exists because people like it and find it because it's useful.
The past year I published 57 newsletters while growing the audience for this blog from 1 to almost 500 subscribers, so for each of you who subscribed: a big thanks!
# My process
A few of you wrote in to ask how I managed to keep up with Zendesk's seemingly continuous stream of releases this last year. So, I thought it would be fun to use this final newsletter to give some insights in how I work, and what I plan to do different in 2024.
The best way to stay up to speed with anything Zendesk releases is to subscribe to the [Updates](https://support.zendesk.com/hc/en-us/sections/4405298833818-Announcements?ref=internalnote.com) category of the Zendesk Support website. This category contains all official releases, and includes a weekly [Releases Notes](https://support.zendesk.com/hc/en-us/sections/4405298847002?ref=internalnote.com) section. You can easily subscribe to them via the *Follow* button, or, just subscribe to this website to make your life easier 😇
However, that's just the tip of the iceberg since every release is accompanied by its own set of support documents. Often articles and features are added to Zendesk without an official announcement.
For example, Zendesk placeholders for Lookup Fields now support `{{ticket.ticket_field_<*field ID number*>.id}}`to capture the ID instead of the label, a feature was silently added and I only noticed because I follow updates to support.zendesk.com.
At the start of 2023 I subscribed to almost all sections, which resulted in hundreds of emails a week with updated articles. This was not scalable or maintainable, so halfway through the year I decided to approach this problem differently.
To make sure I got to see **every** change in Zendesk, I built a custom RSS feed to generate a list of updated or published articles, which I follow inside of an RSS reader.
It's powered by the [Help Center API](https://developer.zendesk.com/api-reference/help%5Fcenter/help-center-api/articles/?ref=internalnote.com) and refreshes on the hour. That way, every change gets logged somewhere, making it easy to stay up to date.

Another source of good information is the quarterly *What's new* presentation. They serve as are a reminder of everything announced in the past few months. Those are basically me screenshotting at 24fps and noting down the announcements to compare to what was already released And see what I missed.
I also subscribe to the [Upcoming Beta's ](https://support.zendesk.com/hc/en-us/articles/4408829663642-Current-and-upcoming-Zendesk-betas?ref=internalnote.com)page to request every EAP as soon as it becomes available. But getting the EAPs' quickly has been a bit of a hit and miss 😅
# What's next for 2024
> If it ain't broke, don't fix it
One thing I'm changing is the above mentioned RSS feed. Although it works, an RSS reader is not the best way to manage a large queue of data. I often move articles from my feed reader to a *read it later* list, just so I can remember to write about the topic later.
Similarly, you don't want to count the amount of times I accidentally marked *all as read* and had to scroll through pages of updates in order to check if I saw everything.
## Content Management
Last summer I read [Building a second brain](https://www.goodreads.com/book/show/59616977?ref=internalnote.com), a book about storing every snippet of info you need in one place to make it easily retrievable.
So with RSS feeds being too loose a format (read/unread is too limited), it was time to find another place to collect all Zendesk info and documentation.
These last few weeks I decided to start using [Slite](https://refer.slite.com/cn8zn9oi7mha?ref=internalnote.com) to manage my growing collection of Zendesk information. It's a knowledge management tool that works based on documents and articles, and offers powerful AI-powered search and summary tool, while also offering similar knowledge management features as Zendesk with verification, review and flagging features for articles.
[Slite - AI-powered knowledge baseDiscover Slite’s AI powered knowledge base for quick access to trusted company info. Simply ask Slite and get the answers you need. Start for free.Logo Bamboo HR](https://refer.slite.com/cn8zn9oi7mha?ref=internalnote.com)
### Unified Inbox
I updated my RSS feed script to push all Zendesk updates to Slite as unverified articles. This allows me to go over a view with all new articles and mark them as verified once I processed them. I can defer verification to a later date, or quickly copy over elements of documents into draft articles for the website.
Conveniently, updated articles in Zendesk will turn verified documents into unverified again, so detecting changes in documentation is quite easy now!

### Retrieving data
Since I want to use Slite as a reference for all my Zendesk related data I also imported all Internal Notes and the entire developer.zendesk.com website into Slite too.
So questions like "*What's Agent Home*", "*How to add lookup fields via API?*" or "*What did Zendesk release in October 2023*" are now very easy to answer.



I really hope that this new tool will make writing the roundups a lot more efficient this next year.
**But I promise: this blog will contain no AI written content.** 🤞
## Newsletter Structure
When I look at the newsletter, the content can be split into roundups, insights, previews and tutorials. Since a month has four weeks, and these are four kinds of content, you can expect one of each every month. With at least one of these exclusive to [Internal Note Plus](https://internalnote.com/plus) subscribers.
Thanks to, or due to, Zendesk efforts on Zendesk AI and the Zendesk Bot, the second half of 2023 was a little bit Chatbot heavy. For 2024 I want to have a better balance across all aspects of Zendesk.
- [Agent Efficiency](https://internalnote.com/tag/agent-efficiency/): Automations, Agent Workspace, Custom Objects,...
- [Bots and Messaging](https://internalnote.com/tag/bots-and-messaging/): Zendesk Bot, Autoreply, Sunshine Conversations,...
- [Knowledge Base](https://internalnote.com/tag/knowledge-base/): Self Service, Guide themes, Federated Search,...
- [Routing and Intelligence](https://internalnote.com/tag/routing-and-intelligence/): Omnichannel Routing, Zendesk AI, Custom statuses, SLA,...
## Zendesk Relate

In April Zendesk will hold their annual [Relate](https://www.zendeskrelate.com/?ref=internalnote.com) event, a big conference where they will hold product announcements, workshops and round tables with customers and experts alike.
My employer, [Premium Plus](https://premiumplus.io/?ref=internalnote.com), allowed a colleague of mine and me to join the conference in person this year, so that's already going to be a highlight of the year for me! I'll certainly write a same day round-up off all the announcements of the event, but will also try to give some impressions of the event itself.
And if I have to give myself one goal for the event it's to:
Write an article with answers, instead of an article with a lot of questions about the announcements.
# Wrap up
So, there we have it, a roundup of what I did in 2023, and a view of what's planned for 2024.
If you've made it this far in the article, can I ask you one favour?
🎁
Share this blog with at least one colleague or friend who's interested in Zendesk and ask them to subscribe as either a free or [Plus](https://internalnote.com/plus) member.
Enjoy the holidays and see you in 2024! 🎄
### Preview of the new Generative AI for Zendesk Voice
URL: https://internalnote.com/preview-of-the-new-generative-ai-for-voice/
Last updated: 2024-08-19T20:33:11.000Z
One of the latest releases in a line of Generative AI releases for Zendesk is the new [integration for Voice](https://support.zendesk.com/hc/en-us/articles/6115911331226-Zendesk-Generative-AI-EAP-capabilities-overview?ref=internalnote.com#topic%5Fw1n%5F32x%5Fvyb).
Phone channels are the oldest channels in a customer care team's tool belt, but it's often also the least efficient. An agent can only take 1 phone call at a time, which makes it difficult to scale. Historically, there hasn't really been a way to offer decent self-service or deflection, other than losing the customer in a labyrint of IVR choices, and if a call needs escalation of follow-up, it's not efficient to know what's already been discussed with the customer.
If an agent wants to escalate a conversation to another team or a team lead, they need to take notes on the conversation, which makes the wrap-up time for a call sometimes as long as the actual conversation itself. And getting the nuance of a conversation written down means the agent either takes notes during the call, which means less attention for the customer, or risks missing elements from the call.
# Generative AI for Voice
This is where the new AI features for Voice come in. By enabling this feature, Zendesk will automatically transcribe the entire conversation and add an additional summary at the end of the call.
Whenever a call wraps up and needs to be escalated, or if you want to revisit the ticket to check how a call's been handled, to check for similar issues or what have you, agents can now read the summary, instead of relistening to a minutes long recording of the call.
Even better, you can now delete the recordings (faster) to comply with local privacy laws, while still retaining the ticket information and conversation in a written way.
# Setup
Like most things Zendesk AI, enabling Generative AI for Voice is a matter of checking a box.
🤔
Am I the only one who is getting confused with how to enable all the AI features? Some are in the Bot options, some are their own Admin Section like Generative AI, and others are hidden under intelligent triage.
The settings are hidden in *Admin Panel > Channels > Talk > Settings* and consistof two options:
1. Enable transcribe and summarise
2. Disable transcripts

There's no other settings available, so it's a global on/off for all lines available in your instance.
[Announcing generative AI-powered call summarization for Zendesk Talk (EAP)Announced on Rollout starts Rollout ends November 29, 2023 November 29, 2023 December 20, 2023 We are excited to announce the launch of the EAP for call summarization using generative AI. Thi…Zendesk helpNova Dawn](https://support.zendesk.com/hc/en-us/articles/6330415782170-Announcing-generative-AI-powered-call-summarization-for-Zendesk-Talk-EAP-?ref=internalnote.com)
## Fine Tuning
For testing, I recommend enabling both the transcript and the summary initially. This way, you can validate the feature (it's currently an EAP so it might have some quirks).
Later, you can disable the full transcripts if you want just the summary, but don't want to store the entire transcript for efficiency reasons.
# Testing
No better way to test a Voice AI feature than to give it the world's most annoying Customer Care interaction!
So, how did Zendesk AI do?
## Transcribing the conversation
First, let's look at the call transcript:

#### Customer Transcript
00:00 Hello. Do you wish for technical assistance?
00:16 Oh God, I hate these.
00:18 Sorry?
00:20 What?
00:22 How dare you speak to me like that?
00:26 Sorry. Can I have technical assistance, please?
00:30 Cutting you through.
00:32 Coward.
00:36 Hiya.
00:37 Hello.
00:38 Can I have assistance?
00:41 What?
00:42 Can I have assistance?
00:45 I've got one of your laptops. It won't get past the loading screen.
00:50 Can you put it on again?
00:53 Yes. Look, is there someone else I can talk to?
00:55 There is no less valuable.
00:57 Oh, right.
00:58 With a model device.
01:00 What model do I have?
01:02 Yes.
01:03 It's a Zubion, I think.
01:05 Oh, Zubion, you're too serious.
01:07 Do you not think of me as a Zubion?
01:09 Can you put it on again?
01:11 I didn't get that.
01:13 Can you press the little wheel?
01:17 No, that would be worse somehow.
01:19 Can?
01:21 Can?
01:22 Yes. Can you press?
01:24 Delete?
01:25 Delete. Can I press delete?
01:27 Shh.
01:28 Shh.
01:29 Shh.
01:30 Shh.
01:31 Shh.
01:32 Shh.
01:33 Shh.
01:34 Shh.
01:35 Shh.
01:36 Shh.
01:37 While, while.
01:38 Yes.
01:39 Shh.
01:40 Shh.
01:41 Hello?
01:42 Hello?
As you can see, we get a pretty good summary of the conversation, but reading this after the call to assist the agent with this ticket is almost impossible due to the nature of phone calls. Half sentences, repeated words, some of the transcription (obviously) went wrong,...
## Summarising the call
The main feature of this new AI option is a summary of the call. Once my call wrapped up, the transcript above appeared after \~10 seconds, with the summary appearing a few moments later.
And well, you can judge the results yourselves, but I find this pretty accurate!

#### ****Call summary**
- The customer is requesting technical assistance for a laptop that won't get past the loading screen.
- They mention having a Zubion laptop model.
- The customer is frustrated and requests to speak to someone else.
- There is a mention of pressing the Delete key, but it is unclear if the customer was able to do so.
- The conversation ends abruptly and it's unclear if the issue was resolved.
# What's next?
If you use Zendesk Talk and are thinking about buying the Advanced AI add-on, this feature seems like a no-brainer. The amount of time that can be saved this way for agents is pretty obvious, let alone the gains on reporting and insights.
That being said, one major feature is missing currently for me, and that is the lack of integration with the other Zendesk AI and Intelligent triage features.


If you have a summary of the call, why doesn't this also feed the Summary option in the Intelligence Panel? And why can't we see the Intent or Sentiment of the call? All the data is obviously there. And if I copy the conversation transcript into a new ticket, I get the results on the right.
But, taking into account that feature is in an EAP, I'm sure this will all be nicely integrated once the feature work wraps up and the internal data gets hooked up.
### Dynamic Conversation Experiences in the Zendesk Bot
URL: https://internalnote.com/dynamic-conversation-experiences/
Last updated: 2025-09-08T06:41:39.000Z
Last year I wrote an article about using a combination of *Ask for Details* and *API Calls* in Zendesk Bot Builder to built a little Movie Bot based on the Open IMDB API.
[Flow Builder - Ask for detailsThe new Ask For Details option in Flow Builder allows you to pull in contextual information via API into your Zendesk Chat Bot.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-ask-for-details/)
That bot turned out great, but it was always limited by the features available in Bot Builder. Or more specifically, the lack of support for arrays and variables inside of the API calls made it impossible to chain API commands. So once a user picked a movie, I couldn‘t do anything based on that choice with another API call.
Now, almost a year later, Zendesk announced [Dynamic Conversation Experiences](https://support.zendesk.com/hc/en-us/articles/6405324545050-Announcing-dynamic-conversation-experience-with-Zendesk-bots?ref=internalnote.com) for the bot, which greatly expand the features available in API calls with the addition of three new options:
- Support for Arrays in the API call so that we can more easily iterate over a bunch of results
- The Carousel step can now handle variables and arrays
- We can use variables inside of API calls
So let's dive in and build a better version of the Movie Bot!
# What we're building

We're going to build a Zendesk Bot that will first ask the customer for a movie title.
We’ll then use IMDB to retrieve a list of movies that match. When the user selects their movie, we'll show the genre, director and a short summary of the movie, and ask if this resolved their question.
Under all this we make use of a couple of Zendesk Bot [step types](https://support.zendesk.com/hc/en-us/articles/4408836323738-Understanding-answer-step-types?ref=internalnote.com):
- We use *Ask for Details* to ask for a movie title and store it in a custom field
- We use the *API call* step to make two API calls to search and get details from IMDB
- We use a *Carousel* step to show a list of search results, and use variables to set images, buttons and content
- We use *Send Message* with its image and button support to show the movie details and guide the customer
- We use *Ask if question resolved* to wrap up the Answer flow.
# Preparing your setup
We assume you already have a working Zendesk Bot setup for this tutorial.
## Ask for Details
This Answer Flow requires one custom ticket field to get started. So create a text field called "Movie", that's editable for end-users. We'll use this field to store the search query of the customer. E.g. `Alien`.
Bot Builder has a nice visual editor, so we don't need to store or remember the Field ID this time!

## The API Calls
This bot will make use of [Open IMDB](https://www.omdbapi.com/?ref=internalnote.com) to search and query IMDB and retrieve movie info. You can retrieve a free API key from their website.
We're going to make two API calls to first search for a movie based on the input in our custom field, and then get the details for that movie.
### Search for a movie
A `GET` to `https://www.omdbapi.com/?s=star%20wars&apikey=abcd1234` with `s=star%20wars` as your search query and `abcd1234` as your OMDB API Key.
The API call returns an array of results. With the new Dynamic Conversation release this array can now be stored as a variable, and we can show a list of all results!
```json
{
"Search": [
{
"Title": "Star Wars: Episode IV - A New Hope",
"Year": "1977",
"imdbID": "tt0076759",
"Poster": "https://m.media-amazon.com/images/M/MV5BOTA5NjhiOTAtZWM0ZC00MWNhLThiMzEtZDFkOTk2OTU1ZDJkXkEyXkFqcGdeQXVyMTA4NDI1NTQx._V1_SX300.jpg"
},
{
"Title": "Star Wars: Episode V - The Empire Strikes Back",
"Year": "1980",
"imdbID": "tt0080684",
"Poster": "https://m.media-amazon.com/images/M/MV5BYmU1NDRjNDgtMzhiMi00NjZmLTg5NGItZDNiZjU5NTU4OTE0XkEyXkFqcGdeQXVyNzkwMjQ5NzM@._V1_SX300.jpg"
},
...
]
}
```
### Get movie details
A `GET` to `https://www.omdbapi.com/?i=tt123456&apikey=abcd1234` with `tt123456` being the `IMDB ID` of the movie we found in the first step, and `abcd1234` your OMDB API Key.
Similar, we can now use the `imdbID` of whatever the user choose in the carousel from the search results in our API call, something new that's only become possible since this new release.
The API call returns movie details:
```json
{
"Title": "Star Wars: Episode IV - A New Hope",
"Genre": "Action, Adventure, Fantasy",
"Director": "George Lucas",
"Plot": "Luke Skywalker joins forces with a Jedi Knight, a cocky pilot, a Wookiee and two droids to save the galaxy from the Empire's world-destroying battle station, while also attempting to rescue Princess Leia from the mysterious Darth ...",
...
}
```
# Setting up the bot
Now that we've got the basics figured out, it's time to setup the bot.
## Starting
To get started, create a new Answer in your Zendesk Bot.
After the welcome greeting, add an *Ask for Details* step and select your *Movie* Ticket Field we created earlier.

## Searching for movies
Next, add a *Make an API call* step that has the following endpoint URL: `https://www.omdbapi.com/?s=&apikey=abcd1234`. Next, put your cursor right after `s=` and click the {+} button to select your `Movie` custom field.
You can then use the Make API Call button to test the API call. If successful, you'll get a list of variables. Save the `Search` Array and give it a name like results. This variable will contain a list of results, and can be one, two or (any) length.
Once you created the array, you can set a specific name for each internal element of the array via the *Name - Value* fields. You can define as many items as needed, but we'll use these 4 in the next step: `title`, `year`, `id` and `poster`.

## Displaying the results
Before the new Dynamic features we could not show or handle an array of data, especially when that array had an unknown length. Like shown in my original [Ask For Details](https://internalnote.com/flow-builder-ask-for-details/) article, we could only store e.g. `results[0].title` as a variable, but couldn't account for `results[i]`.
Now we can by making use of the support for variables and arrays in the *Show Carousel* step:
When you add a Carousel, you can now choose to populate the data with a Dynamic message based on API Data. Select *Use array variable*, and select your `results` variable. You can then access all elements in the array to fill out your carousel, by clicking the {+} button in each field.
- Title: `results.title` will create a carousel element for each movie in our results and set the title to the, well, title.
- Description: `results.year` to display the release year
- Image: this is a big one, cause we never were able to use variables in images before either: `search.poster`, containing the URL of the movie poster.
To complete the carousel we'll also add two buttons:
- *See on IMDB* will concat `https://www.imdb.com/title/` and `search.id` to show how we can combine variables and regular text to create dynamic links
- *View Details* will **save** the option chosen by the customer in a new variable `chosen_movie` which we'll use in the next step. You can do this by choosing *Save Response* in the Button action dropdown, and setting the name and value of the new variabel to `chosen_movie` and `search.id` via the {+} respectively.
The result is a carousel of movie posters, with the title and two buttons below it.

## Getting movie details
Once the customer has chosen an option in our carousel by clicking on the *View Details* button, we can use the new `chosen_movie` variable to make a second API call and pull in more movie details.
Use [https://www.omdbapi.com/?i=&apikey=abcd1234](https://www.omdbapi.com/?s=&apikey=abcd1234&ref=internalnote.com) as the endpoint and use the {+} button to add `chosen_movie` as a parameter after the `?I=` part of the URL. This will make our API request dynamic by referencing the earlier customer choice.
💡
One thing to note here is that the second API call will fail during setup since we can not pass a variable for chosen\_movie in the setup flow. So it's best to setup this API call with a known movie ID like tt0083658 and make a sample call. Once you stored the required variables, you can then replace the placeholder with the actual variable via the {+} button.
Once you make a sample API call, we can store the variables we need to show them to the customer. Note that this API call does not return an array but a single movie, so we can store variables directly but can't define an array this time.
I stored the `genre`, `director`, `title` and `plot` as variables to use.

## Showing the details
Finally we come to the end of the bot flow. We can use the *Show Message* step twice to show the customer information about our movie, including its plot in a second message.

## The result
The end result is a more complex Zendesk Bot flow that can account for variable sets of returned data, and interact with customer choices to make new API calls.
This demo makes use of the new features to show movies, but you can use this flow to get a list of orders for your customer, and allow them to then chose an order and cancel, refund, or get delivery statuses for that order.
Or you can search your webshop for matching products, and show a carousel of products. When a customer clicks on one in the carousel you can then link them to the buying page, show more information, or offer a way to contact your Support team.
You can test the full flow via the proactive message that should have appeared bottom right, or by choosing the *Movie Bot* 🍿 in the suggested answers list of the widget.

# Conclusion
I've build a lot of bots on this blog and for customers these last few years, and where the Zendesk Bot used to be a very limited hardcoded flow, the additions of metadata, authentication, carousels and API calls gradually made the Zendesk Bot a lot more powerful.
This last new addition brings yet another set of API features that were sorely missing to interact with external APIs.
Is there stuff missing? Sure. I would love to be able to filter what's shown in a carousel, or to transform returned data (capitalise text, replace strings, ...) or map data to other values before showing it to the customer. Or writing a customers' choice in a carousel to a custom field so it's visible to agents and actionable in triggers upon escalation.
But I'm sure we'll see some of these remaining requests being fulfilled sooner rather than later, given the current speed of innovation in the Zendesk Bot.
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Zendesk Roundup for November 2023
URL: https://internalnote.com/zendesk-roundup-for-november-2023/
Last updated: 2023-12-05T07:30:55.000Z
Black Friday has passed, it's getting colder, and this is the final Roundup for 2023 with the Zendesk releases and announcements for November.
Earlier this month Zendesk held their [What's new for Q4 2023](https://www.zendesk.com/whats-new/?ref=internalnote.com) with a nice recap of all the new announcements from this last quarter, most of which I already covered in earlier [Roundups](https://internalnote.com/tag/zendesk-roundup/) this year. That being said, the focus of Zendesk of iterating and releasing new stuff this last year has been relentless.
Even this last month has seen the release of 2 new Zendesk AI EAPs for Guide and Voice (announced in October), a nice new GDPR feature and a big expansion of the API capabilities for the Zendesk Bot.
🎄
Last roundup for the year so I want to thank all my readers and subscribers for an awesome year. 2023 was the first full year of me writing on this blog, and the response exceeded my expactions! So thanks! 🥳
Since December is a month of festivities, I've still got articles planned for the 5th, 12th and 19th of December but will be taking a break the week of Christmas, so there will be no Internal Note for the week of December 26th.
The next article (a Zendesk roundup) will be on January 2nd.
Happy holidays!
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🎉 New Releases
## 🤖 AI Powered Conversational Experiences
The Zendesk Bot got three nice additions this month.
First off, it's now possible to set [a custom Avatar](https://support.zendesk.com/hc/en-us/articles/6360125630618-Announcing-custom-bot-avatars?ref=internalnote.com) for your Zendesk Bot, replacing the Zendesk eyes with a more *on brand* image. (Side-note: I noticed it works best with a non-transparant icon with at least a 5 px padding to account for the corner radius).

Secondly, Zendesk made[ two new Zendesk AI intents available](https://support.zendesk.com/hc/en-us/articles/6437858147482-Announcing-employee-experience-intents-and-other-intent-updates-for-intelligent-triage-and-advanced-bots?ref=internalnote.com) for Employee Experience, as announced at the [AI drop event](https://internalnote.com/zendesk-ai-drop-keynote/): HR and IT, while also updating the models for all other available industries. So if you're using Zendesk AI, you now should see better results.

And finally, the Zendesk Bot Builder got a major upgrading by enabling [Dynamic Conversation Experiences](https://support.zendesk.com/hc/en-us/articles/6405324545050-Announcing-dynamic-conversation-experience-with-Zendesk-bots?ref=internalnote.com). This allows you to better interact with API endpoints and show carousels of data or use API results in other steps in your flow. I've got an entire tutorial written that will go live next week, so [subscribe](https://internalnote.com/plus) to the blog if you're interested in learning more!
## 👨🏻💻 Agent Workspace
The biggest release for this month is the availability of [Layout Builder](https://support.zendesk.com/hc/en-us/articles/6380051925018?ref=internalnote.com) for all Suite Enterprise customers. This new feature allows you to customize the Agent Workspace by adding or removing apps, fields or views, and rearrange the order in which all elements are shown on screen.

It's a shame this feature is only available to Enterprise users. I think it's warranted to say that Suite Professional users should at least get access to **one** Layout to customize, while leaving the ability to have multiple an Enterprise only feature. Zendesk customers have been asking for more flexibility for years now, so to lock this behind the most expensive plan only feels like a missed opportunity to me.
With the arrival of Layout Builder, side conversations also got an upgrade. The feature has moved from the top of the ticket view to its own dedicated context panel. This move has been enabled for all environments, but annoyingly requires admins to [confirm the setting in the admin center](https://support.zendesk.com/hc/en-us/articles/4408828503450?ref=internalnote.com#topic%5Fwzc%5Frjq%5Fw5b) first before it's usable, even if the feature has already moved.

## Zendesk AI for Agents
There's two AI features that are now available to enable in your Zendesk environment:
Macro Suggestions for Admins, the feature that shows possible macros for Admins to create, is no longer an EAP but is now available to all Zendesk AI customers with the added ability to filter the suggestions and see more related tickets on which the suggestion was based.

And for customers who requested the [Zendesk Talk AI EAP](https://support.zendesk.com/hc/en-us/articles/6330415782170-Announcing-generative-AI-powered-call-summarization-for-Zendesk-Talk-EAP-?ref=internalnote.com): that feature is now available to test. I played around with it earlier this week and it works like a charm: each phone call gets a fully written transcript, that, moments after the call wraps up, turns into a call summary with the flow of the conversation nicely summed up. Currently this summary lives outside of the Intelligence panel and doesn't interact with the Intent, Summary and Sentiment features shown there, but that's apparently planned to be integrated sooner rather than later.
### IVR Tagging
Speaking of Zendesk Talk, it got another release this month: [you can now tag IVR choices made by your customers](https://support.zendesk.com/hc/en-us/search/click?data=BAh7DjoHaWRsKwiaGNg7zAU6D2FjY291bnRfaWRpA9kYoToJdHlwZUkiDGFydGljbGUGOgZFVDoIdXJsSSIBg2h0dHBzOi8vc3VwcG9ydC56ZW5kZXNrLmNvbS9oYy9lbi11cy9hcnRpY2xlcy82Mzc0NzM1NDg1MDgyLUFubm91bmNpbmctSVZSLWtleXByZXNzLXRhZ2dpbmctaW4tWmVuZGVzay1UYWxrLWZvci1vbW5pY2hhbm5lbC1yb3V0aW5nBjsIVDoOc2VhcmNoX2lkSSIpZjc3NjAxZjMtMDE2Zi00MzM0LTgwYmItNTQxMGYyNTM3ODNkBjsIRjoJcmFua2kGOgtsb2NhbGVJIgplbi11cwY7CFQ6CnF1ZXJ5SSIMSVZSIHRhZwY7CFQ6EnJlc3VsdHNfY291bnRpUA%3D%3D--2477ca45c312c09a18706651c8a08e54f4a3906e&ref=internalnote.com). This request is another long missing feature that will make more complex routing based on IVR choices possible.
Each keypress made by a customer can be tagged, so that instead of routing a call to a specific group, you can now also use the tags to route to agents or groups with specific skills or responsibilities.

## 🔎 Help Center and Self Service
Zendesk Guide got dealt the short stick this month and only received a single update this month, making improvements in the way copying and pasting attachments from external editors like Google Docs or Word are handled. You no longer need to add them to the media library in order to use them in your article. They'll be uploaded automatically.
[Announcing improved integration with third party editors for Guide media libraryAnnounced on Rollout starts Rollout ends November 16, 2023 November 16, 2023 November 16, 2023 We are excited to announce improved integration with third party editors such as Google docs and…Zendesk helpKatarzyna Karpinska](https://support.zendesk.com/hc/en-us/articles/6382274865306?ref=internalnote.com)
## 🧱 Open and Flexible Platform
Last month saw the release of [Custom Objects](https://internalnote.com/announcing-the-custom-objects-series/), and already this got expanded with a new EAP this month.
The new Custom Objects Triggers EAP allows you to react to changes in a record and update tickets, notify users, or alert agents when a change happens.
For example: if you have a Custom Object that stores Support Contracts, you can now automatically notify a customer or account manager when that contract is about to expire. Or if you store repairs in object, you can update the ticket whenever the status of a repair has changed from 'in progress' to 'repaired'
[Creating and using object triggers (EAP)What’s my plan? Note: Object triggers for custom objects are currently in an Early Access Program (EAP). You can sign up for the EAP here. In addition to using custom objects related to tickets i…Zendesk helpJacquelyn Brewer](https://support.zendesk.com/hc/en-us/articles/6294230624410?ref=internalnote.com)
Additionally, Zendesk has [expanded](https://support.zendesk.com/hc/en-us/articles/6340850168346-Announcing-new-conditions-for-group-SLAs?ref=internalnote.com) the conditions available for group SLA policies to include all the existing conditions for SLA policies. Previously you could only filter by group, but now we can use any set of parameters to define these SLA policies.
## 🔐 Trust and security
Slowly but surely Zendesk is shifting from a platform that handled only Customer Support to one that can take care of both your customers and employees. The release of the HR and IT intents is one part of that strategy, the focus on Slack and Teams integrations another.
But by turning a customer experience platform into one that also offers employee experiences Zendesk does run into its own design from time to time. One example is the fact that originally customers always lived outside of Zendesk, and Support Agents work within Zendesk.
But in an employee support environment you run into the scenario where an employee who works in IT does their job in Zendesk, while also being outside of Zendesk if they need to contact IT. You want to prevent, for example, employees with access to the Agent Workspace getting insight in the way HR discusses their ticket internally. To handle this scenario Zendesk has now updated the way agent initiated tickets for which they are the requester, by allowing admins to choose between three visibly levels:
> \- Show all internal notes
> \- Hide internal notes on tickets assigned to private groups
> \- Hide all internal notes
## Timed Ticket Deletion
Zendesk releases a beta of the new [automated ticket deletion feature](https://support.zendesk.com/hc/en-us/articles/6062884435866?ref=internalnote.com) announced as part of their new Advanced Security and Privacy add-on.
It's a pretty basic feature available to everyone: you enable the feature and pick an amount of days, from which Zendesk will delete every closed and unmodified ticket older than that date. It's a very basic way to comply with GDPR or other privacy laws, but if you want more nuance, you're better of with [Sparkly's GDPR App](https://www.zendesk.com/marketplace/apps/support/206749/gdpr-search--destroy/?ref=internalnote.com), or move to the new Security add-on.

# 💡Insights
## Zendesk Engineering
Did you know Zendesk has an entire blog where their engineering team writes about how they build Zendesk?
[Moving from DynamoDB to tiered storage with MySQL+S3Originally we implemented a feature to persist an event-stream into DynamoDB to allow customers to retrieve them. This proved effective…Zendesk EngineeringShane Hender](https://zendesk.engineering/moving-from-dynamodb-to-tiered-storage-with-mysql-s3-cb3dc9bf813a?ref=internalnote.com)
This last one dives deep into handling large data streams and querying them.
I wonder if this new infrastructure was build for the new [Access Log API's](https://support.zendesk.com/hc/en-us/articles/6066010357530-Monitoring-agent-activity-with-the-Access-Log-API?ref=internalnote.com) as part of the new Advanced Data Security and Privacy add-on? 🤔
## Moving from Gorgias to Zendesk
This article has a nice overview of the steps requires to move from one CX platform to another. It comes with a nice spreadsheet that shows all the steps required.
[From Gorgias To Zendesk: Ben Segal’s 5-Week Transition GuideFrom Gorgias To Zendesk: Ben Segal’s 5-Week Transition Guide. Discover how Ben Segal, VP at Thesis, strategically transitioned from Gorgias to Zendesk, enhancing customer experience and operational efficiency in just five weeks. . | By Ben SegalLang.ai logo](https://www.lang.ai/blog/from-gorgias-to-zendesk-ben-segals-5-week-transition-guide?ref=internalnote.com)
# 🎥 Videos
# ⚠ Major Changes
## New Storage Limits

These coming weeks Zendesk will enable a new Storage Usage dashboard inside of the Admin Center that gives you insight in how you use the allotted storage in your Zendesk instance.
This dashboard might seem innocuous at first, but there's more at play here. Starting this year Zendesk will start charging customers for data-over-usage, and from what I've heard, the fees are not low.
So when you get access to the dashboard, take a look, and check where you can optimise your data-usage. Maybe that Data Deletion features announced this month can come in handy!
I'll surely write an article about this topic early next year to teach you how to reduce storage in your instance. Subscribe to learn more!
[Announcing the Storage usage dashboard in Admin Center and increased storage limitsAnnounced on Rollout starts\* Rollout ends November 28, 2023 November 28, 2023 December 7, 2023 \*Dashboard rollout for self-service customers occurs at a later date. See below for details.…Zendesk helpSean Newton](https://support.zendesk.com/hc/en-us/articles/6340068721434-Announcing-the-Storage-usage-dashboard-in-Admin-Center-and-increased-storage-limits?ref=internalnote.com)
# 📝 Articles this month
[Customer Service Trends 2024 - Zendesk ScorecardUltimate has released their Customer Service Trends Report 2024 today. Let’s see how close Zendesk aligns with their trends.Internal NoteThomas Verschoren](https://internalnote.com/ultimate-trends-2024/)
[Preview of the new Customisable CSAT EAP for ZendeskThe new Customisable CSAT EAP for Zendesk has arrived, finally allowing you to change your rating scale, choose emoji, numbers or labels, and customize your follow-up questions. This article contains an initial overview of the new feature, and shows how it works with existing API integrations.Internal NoteThomas Verschoren](https://internalnote.com/preview-of-the-new-customisable-csat-for-zendesk/)
[Preview of the new Generative AI for the Zendesk Help CenterThis article previews the new Generative AI for Help Center content that’s been made available in EAP by Zendesk.Internal NoteThomas Verschoren](https://internalnote.com/preview-of-the-new-generative-ai-for-knowledge-in-zendesk/)
[Announcing the Custom Objects series for ZendeskIntroducing is a four-part series on Zendesk’s new Custom Objects feature. These articles cover setup, data import, using Custom Objects in forms and with agents, expanding user profiles, and displaying Custom Objects in Help Center forms.Internal NoteThomas Verschoren](https://internalnote.com/announcing-the-custom-objects-series/)
✏️
I updated the [Return to sender](https://internalnote.com/return-to-sender/) article to make use of the new Lookup Field Placeholders by ID feature.
# And Finally
Good to know:
> Inbound emails are [limited to 64kB](https://developer.zendesk.com/api-reference/ticketing/tickets/ticket%5Fcomments/?ref=internalnote.com#:~:text=in%20Agent%20Workspace.-,Body%20size%20limits,-Ticket%20comment%20bodies). For any email tickets that contain a table, spreadsheet, or text where the total size of the comment is greater than 64KB, the comment will be cut off to the point it reaches 64KB.
[Why am I unable to see the full body of an inbound email?Question Sometimes spreadsheets pasted in an email appear to be cut off. Why am I unable to see the full body of an inbound email in a ticket? Answer Inbound emails are limited to 64kB. For any ema…Zendesk helpJulio H](https://support.zendesk.com/hc/en-us/articles/6365792641946?ref=internalnote.com)
### Customer Service Trends 2024 - Zendesk Scorecard
URL: https://internalnote.com/ultimate-trends-2024/
Last updated: 2026-03-25T13:56:15.000Z
[Ultimate](https://ultimate.ai/?utm%5Fsource=internalnote&utm%5Fcampaign=trendsreport) is a customer support automation platform powered by AI known for its powerful bot and ticket automation capabilities. They have released their Customer Service Trends Report 2024 today highlighting trends in CX for the coming year.
Similar to [Zendesk's trend report](https://premiumplus.io/2023/02/02/leveraging-the-zendesk-cx-trends-2023-report/?ref=internalnote.com) last year, this report serves as a guide on how you can start building your CX experience vision for next year, and see where your company is up to speed, or lagging behind.
[Customer Service Trends 2024Double-down on efficiency, refocus on retention, stay ahead of the competition, and unlock revenue with Ultimate’s 2024 customer service trends guide.Ultimate.](https://www.ultimate.ai/guides/customer-service-trends-2024?ref=internalnote.com)
I always find these reports interesting to read since they help place feature releases into a bigger picture and help frame technology as solutions instead of just gimmicks.
Even though most of these kind of reports are build on actual data, they still serve as a marketing tool that directly helps the vendor that releases the insights. There's no better way to promote yourself to potential customers by combining problem, solution and justification in one document. And justifiably so.
So instead of looking at Ultimate's report through the eyes of Ultimate, I thought it would be a fun exercise to take their 7 trends, and see how they compare to Zendesk's current offering. Where can Zendesk assist in following the trends, where does it run short, or where is it a clear winner?
# Seven trends for 2024
The report starts with some preamble about how AI and especially Generative AI has shaken up the CX industry in these last twelve months, and then lists the seven trends according to Ultimate, their customers and a panel of CX Experts that could provide input for the report.
1. Customer service becomes the brand
2. Try before you buy
3. Agent experience takes center stage
4. Hybrid reigns supreme
5. KB management is key
6. Don’t automate at all costs
7. AI innovation hits inflection point
Let's see how Zendesk scores for each of these.
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# Customer service becomes the voice and vision of your brand
> By using AI to provide instant support and self-serve tools. By creating seamless experiences across channels. And by ensuring a human is always on hand to provide empathetic care. Support conversations are a crucial touchpoint — and an opportunity to let your brand identity shine. When agents deliver CX that embodies your values, you’ll win first place in customers’ hearts.
This first trend is all about making sure customers get the right experience and support from your company. A good customer experience can make someone an ambassador, a bad experience a detractor. People share the good and the bad with friends, and a trusted brand is a brand where you return too, time and time again.
I think Zendesk is a perfect fit for this trend. The help center, asynchronous conversations, a hybrid model of bots, autoreply and actual human agents make sure customers can both easily self serve their issues, as well as get escalations to the right agent via skill based routing.
And by using both custom Help Center themes, a branded both, and availability of your support on your website, social channels and traditional email or phone, your support can be wherever customers interact with your brand.
**My score: A+**
# Generative AI lowers the barrier to entry for trialing automation tools
> Generative AI-powered chatbots work straight out of the box, and more providers are offering businesses free trials so they can test the benefits before committing. And CX leaders are taking them up on it.
If you would have asked me six months ago if Zendesk AI was up to the challenge I would probably have set no. But with the latest [AI Drop](https://internalnote.com/zendesk-ai-drop-keynote/) Zendesk is quickly catching up with the existing big AI Chatbot players.
One of the biggest risks with using any Generative AI model inside of your chatbot is the risk of the model pulling in data and replying with bad or wrong data. I keep going back to this [quote](https://www.youtube.com/watch?v=9aCg7jH4S1w&ref=internalnote.com) from Zuckerberg:
> Yeah, so our view is that there’s actually going to be a lot of these that people talk to you for different things. \[...\] let’s say you’re a small business and you want to have an AI that can help you interface with customers to do sales and support. You want to be pretty confident that your AI isn’t going to be promoting your competitor’s products, right?"
One thing that Zendesk does well is that it purposefully limits the bot to your Help Center and only your Help Center. This gives you two benefits:
1. The bot works out of the bot with your data. No training, no content management, if you did your homework with your traditional FAQ, the bot can use that content to answer
2. Enabling Generative AI is 2 checkboxes: enabling it + choosing a persona.
There's some limiting factors still at play though: Zendesk's intent models are fixed for an industry and copied across customers with no option for real customisation or training on your actual data. from my testing the models work well if you're in one of the supported industries, but custom models will still give you better results, especially for unique or complex industries.
**My score: B+**
# Agent experience takes center stage as providers build with them in mind
> These include generating on-brand replies, analysing message sentiment to help agents adjust the tone of their response, or creating summaries of long message threads \[...\] More importantly, gen AI makes support teams’ roles more rewarding too. Automating repetitive tasks frees agents to focus on complex cases that require their talents
I think this trend is one where Zendesk is at home, and every Bot company is playing catch up, if we can even consider them playing in the same league.
Zendesk has always been an agent-first platform with the Agent Workspace. They have an omnichannel approach where every channel is turned into a ticket handled in the same interface with context around it.
Now with Zendesk AI you get summary, intelligent triage, suggested tickets and macros, expand and tone shift. These are all items an agent traditionally would need to do manually: categorise, write a summary for team leaders upon escalation, search for related content to resolve an issue, it's all busy work that needed to be done per ticket. When using Zendesk AI I've already seen agent being freed up to only spend time on actually resolving issues, leaving the busy work to the system.
For me, ticket deflection with self service and bots, and agent automation with context and intelligent triage are really two sides of the same coin. When the easy stuff gets solved by the system, you also need to enable your agents to handle the complex stuff. Both in training and resources, as well as making sure they have and get the time to dive deep into these tickets, without wasting time on stuff that AI can automate.
**My score: A+**
# The hybrid approach to support automation unlocks its full potential
> Generative AI has taken the world by storm — but that doesn't mean conversation design is out in the cold. The real magic happens when you combine the ease and flexibility of gen AI with the precision and control of conversation design.
I have to admit, I had to read this section of the report twice before I got it. When I glanced over the report the first time I assumed hybrid was about human vs bot. But no, it's about the choice between 100% bot driven, vs human curated flows.
If you rewind a year Zendesk's (and every other bot) approach to flow building was basically this: someone needed to build a flow that, step by step, guided the customer through a fixed path until they reached either a resolution, or got escalated to an agent. We all know these bots: they start with a set of options, and once you ask your question you go down the rabid hole of questions and answers until you get stuck and frustrated. Or, if the intent mapping is done well, and the company has the insights to know where customers get stuck, you get bots with good flows that follow customer logic.
During the AI Drop event last month, Zendesk talked about how the best approach to building a bot is not "go build a hundred flows to tackle each scenario". That doesn't scale and isn't always worth the effort. A better approach is to leverage your existing knowledge base content and generative AI.
Your customers ask any type of question to the bot. The bot uses AI to map the question to an intent, and cross checks with your FAQ content to pull the right information from your articles. It then uses Generative AI to reply with an answer.
Next, you look at your reporting to see what intents are triggered, and where customers clearly are helped or satisfied with the offered bot answers. These flows are ideal for manually crafted flows: you can offer nuance, you can pull in external API date (e.g. Where's my order actually returns a delivery date instead of an article) and prevent issues.
This combination of bot and manual flows is scalable. You can quickly write an article to respond to a question, and moments later the bot will start serving that response to customers. Or you can spend the time to build a full flow for the bigger scenarios.
Zendesk AI has this approach build in with the [Intent Suggestions](https://support.zendesk.com/hc/en-us/articles/5537827011994-Using-AI-powered-intents-with-conversation-bots?ref=internalnote.com#:~:text=Understanding%20intent%20suggestions,bot%20the%20questions%20came%20through.), so they're clearly on the right path here. But since they only offer a fixed set of intents, and you can't add your own, you might be blindsided in your reporting for the stuff Zendesk can't map.
**My score: B+**
# #1 new support skill: Knowledge base management and optimisation
> Knowledge base management empowers CS agents to offer better, more streamlined support while also enabling customers to help themselves when and wherever it suits them. And in the age of generative AI, it is absolutely essential your knowledge base is in top form.
For a while now I've made the difference of talking about Knowledge Base when talking about managing content and articles, and Help Center when talking about the website where customers can read content.
Within Zendesk your articles feed your Help Center, are available to Agents in the Context Panel, are offered via email with autoreply to your customers, and are also used to offer a list of articles, or generated replies in your web widget and Zendesk Bot.
So detecting gaps in your knowledge, being able to translate problems into steps to resolve, and keeping the data up to date are foundational skills needed to offer good support to both your customers and agents.
Or to paraphrase a terrible CGI creation from a galaxy far far away:
> No content, no articles, no self-serve.

Zendesk Guide has long been a cornerstone of Zendesk's offering, even before Zendesk Suite was a thing, and with content cues and the additional review and publishing features in Suite Enterprise, you've got the basis to manage your content right within our CX toolkit.
My approach to this has been to create a report that pulls in search queries, ticket escalations (so self service failed) and categorised tickets. Then create a weekly report that shows the top 10 and bottom 10 of these there datapoints. And then sure your Help Center captures both the top and bottom ten for each of those datapoints:
- Top 10: the Frequent in FAQ.
- Bottom 10: make sure unique cases are also served so you show your expertise.
**My score: A-**
# Ticket automation becomes a differentiator for the most human CX teams
> AI can free your agents from their most repetitive, mundane tasks so they have more capacity to provide better, empathetic support to your customers. \[...\] the area in greatest need of improvement is eliminating manual tasks like routing and tagging tickets.
I kinda pointed to it in an earlier trend already, but agents should spend time helping customers, and shouldn't lost time doing repeated tasks.
If your platform removed repeated questions from agent queues, makes sure the agents get tickets aligned to their skills (reducing the need for rerouting) and offer full context with intent, sentiment, related tickets and things like purchase history, customer profile e.a., then the agent job is basically solving the issue, and not so much doing a lot of bookkeeping and filling in fields.
Zendesk's omnichannel routing, intelligent triage, Agent Home, triggers and automations are all pieces of the puzzle that forms Agent Workspace.
**My score: A+**
# AI innovation hits inflection point, fast-tracking global business growth
> The AI market is rapidly maturing. And the pace of change means we’ve hit a tipping point. Today, the effort-to-reward ratio has dramatically shifted — with AI-powered automation making it easier than ever for brands to scale.
This last one for me is where trends meets marketing. Naturally, every report this year will point out how every tech company threw out their roadmap and realigned their development to include OpenAI's platform into their product.
So it's only natural that the expected trend is that those companies get a return on their work and investment by now pushing customers to start using these AI powered tools. Even when not all of them have proven to actually work, provide good results or what the impact will be in 1, 5 or 10 years of the choses made today.
Criticism aside, I do see the same results and short-term impact that these new AI technologies have made possible, so its an obvious thing to put in a trends report cause it's true, no?
Zendesk itself also jumped on the bandwagon with their two-part Zendesk AI release this year, it remains to be seen how the platform will evolve and integrate more AI tools across their product suite.
# Conclusion
I joked (kinda) at the start of this article that most of these trends reports are self-serving to the publisher. But I have to give points to Ultimate for including this one:
> **Shop around for the right provider** \- Take a few generative bots for a test ride before committing. Choose an established automation partner that can handle complex use cases, has experience with your industry, and has the flexibility to grow with your company.
It's indeed true that not every provider is the same, and that a single platform can't solve all needs.
When looking at the trends Ultimate proposed my end-score for Zendesk is a solid A-, with the biggest weaknesses in the product the fact that Zendesk only offered prebuilt AI models scoped to a small set of predefined industries: Retail, Tech, Finance, HR, IT and Travel (announced).
These models are based on Zendesk's billions of tickets, but lack the ability to align with the actual intents of a company. Imagine you run public transport company that kinda does retail (tickets, subscriptions), but is also kinda travel (destinations, itineraries)? If that's the case, Zendesk AI's approach isn't a really good fit since the intents kinda align, but don't fully overlap with your actual ticket categories. So that's where purpose-build bot builders with custom intent models currently take a lead.
But when it comes to the other side of the coin, handling escalations to real agents and making their work easier and more rewarding, that's where Zendesk has a clear lead over other platforms.
However you take it, it's nice to see how Zendesk and the market overall seem to be running in the same direction. It gives me confidence in the route the platform has taken.
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Zendesk Custom Objects - Part 4: End-User and Forms
URL: https://internalnote.com/custom-objects-part-4-end-user-and-forms/
Last updated: 2025-09-08T06:41:44.000Z
In this four part series we'll explore the new Custom Objects from an admin, agent and end-user standpoint.
#### Custom Object Series
1. [Introduction to Custom Objects](https://internalnote.com/custom-objects-part-1-introduction/)
2. [Custom Objects and Tickets](https://internalnote.com/custom-objects-part2-tickets/)
3. [Custom Objects and Users](https://internalnote.com/custom-objects-part-3-users/)
4. [Making Custom Objects available to End-Users](https://internalnote.com/custom-objects-part-4-end-user-and-forms)
The first two articles showed you how to set up custom objects and how agent can interact with them. The previous expanded user profiles with Custom Objects and showed how you can use them to trigger different priorities based on linked records.
This article will wrap up the series by solving a missing feature in Zendesk: Showing Custom Objects in Help Center forms and make the selected record available to agents.
[End-User access for Custom Objects and Lookup Fields (EAP Preview)Zendesk’s Custom Objects, released last year, enable you to expand platform data, like linking assets or contracts to tickets. Initially, end-users couldn’t interact with custom objects, but a recent update allows you to add Lookup Fields in forms.Internal NoteThomas Verschoren](https://internalnote.com/end-user-access-for-custom-objects/)
Zendesk has released a native solution for this feature. The steps in this article still work, but I recommend migrating to the native solution!
# Custom Objects for End-users
The previous Legacy version of Custom Objects [allowed us](https://developer.zendesk.com/api-reference/custom-data/custom-objects-api/permissions/?ref=internalnote.com) to set permissions for both agents, admins and end-users. This way you could make the objects available as read-only elements for (anonymous) end-users and use the API to inject custom objects on your Help Center.

This new version of Custom Objects manages the permissions entire via the Admin Panel. We've previously used the permissions to give our agents edit rights to link Pokémon to a specific end-user in the previous article.
Sadly, with the migration to this new version, the ability to give end-users access to the objects has been lost. This is partially due to an inherit security risk with the ability for Custom Objects to link users and organisation via Lookup Fields. If not done carefully, this might make your entire customer list available in e.g. a Lookup Field on a form. For this reason, the end-user is currently not available out of the box.
There are scenario's where it would be useful to have these objects available though. Maybe you want your customer to select a specific device when filling out a form. Or you want to show a list of retail locations to handle a return, based on a Location Object in your Zendesk instance.
This article will show you a workaround to fix this limitation.
# What we're building
In this article we'll build the following flow:
1. A user opens a specific Help Center form on the Help Center
2. We load a dropdown of all Pokémon for them to select
3. Once they choose a Pokémon we pass the ID to a hidden intermediate ticket field
4. When the ticket is submitted we use that field to set our Pokémon Lookup Field
5. The agent sees the linked object in the Agent Workspace and can view it's data next to the ticket.
# Getting the data to the Help Center
The easiest way to fix the end-user limitation is to use an external service as a proxy to (securely) load the API.
This proxy would be reachable from your Help Center, gather the records via API remotely, and return the JSON data back to the Help Center to use in your code.
## Securing the connection
Since we are proxying the data from our Zendesk instance to a public Help Center it's important to consider the security implications of this.
### Only allow your website
Zendesk recently introduced [Help Center JWTs](https://developer.zendesk.com/api-reference/help%5Fcenter/help-center-api/help%5Fcenter%5Fjwts/?ref=internalnote.com) to secure outgoing connections to external services. They wrote a clear example [in this article](https://developer.zendesk.com/documentation/help%5Fcenter/help-center-api/secured-requests/?ref=internalnote.com#making-third-party-api-requests-with-help-center-jwts) on how to use it.
🔐
In our example we'll pass the JWT token, but since handling JWT validation is an entire exercise on its own, we'll use `Access-Control-Allow-Origin` to lock the API to just our environment. This article focusses on leveraging the API after all and your deployment might not necessarily use the same Cloudflare environment as me.
### Scope the API
My proxy only supports the `/api/v2/custom_objects/pokemon` endpoint, and only allows for `GET` requests. This way the exposed data is limited to known data I don't mind being public.
It's going to be public by design once I add it to my webforms anyhow.
## The Proxy Code
I added a sample worker to this repository in the `/worker/index.js` folder.
[GitHub - verschoren/pokedexContribute to verschoren/pokedex development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/pokedex?ref=internalnote.com)
This worker takes the incoming URL and uses the path and parameters to create request that goes to Zendesk.
If I make a request to `https://myworker.workers.dev/api/v2/custom_objects/pokemon/records.json` the worker will take the URL and turn that into `https://subdomain.zendesk.com/api/v2/custom_objects/pokemon/records.json` and add the necessary authentication tokens.
We'll also filter the incoming request to only support `GET` requests and filter the pathname to only allow for `custom_objects/pokemon` .

Do deploy this code you can go to [https://workers.new](https://workers.new/?ref=internalnote.com) and create a new Cloudflare Worker. Copy-Paste the code from the repository in the editor.
You'll need to change the following four parameters:
```javascript
const zendesk = 'https://internalnote.zendesk.com'; //your zendesk domain
const custom_domain = 'https://support.internalnote.com'; //your help center custom domain
const authentication = '' //base64 encoded username/token:api_token
const object_name = 'pokemon' //name of your custom_object
```
💡
I really hope we can get access to an end-user permissions options again to make this step redundant.
Once you've deployed you'll need to copy the URL of the worker. That will be similar to [https://customobjectsproxy.verschoren.workers.dev](https://customobjectsproxy.verschoren.workers.dev/api/v2/custom%5Fobjects/pokemon/records.json?per%5Fpage=100&ref=internalnote.com).
# Setting up the flow
Setting up the rest of the flow is done entirely in Zendesk. We assume that you've already read the previous articles in this series. This means you have a form for your Pokémon inquiries, and have created a Lookup field that links to a Pokémon Custom Object.
## Create an intermediate field
Zendesk does not allow us to create Lookup Fields for end-users, which is the reason we need to build this in custom code.
To be able to pass the chosen Pokémon from the webform to the agents, we'll need to use an intermediate text-field that will (invisibly) store the ID of the chosen Pokémon.
To do this create a new Ticket Field of Type text. Call it `Intermediate Pokémon` and copy down the `ticket id`.
Make sure customers can edit the field, and add it to the your Webform.


## Setup a webhook
The end result of this flow should be the a filled in Lookup Field that shows the agents which Pokémon the end-user is talking about.
Since end-users can't fill in Lookup Fields, we want them to fill in the Intermediate Field and we'll use a webhook and trigger to fill in the Lookup field for them.
First off we need an 'Update Ticket Webhook'.
Go to the *Admin Panel > Apps and Integrations > Webhooks* and create a new Trigger based webhook
- Name: Update Ticket
- Endpoint URL: [https://d3v-verschoren.zendesk.com/api/v2/{{ticket.id}}.json](https://d3v-verschoren.zendesk.com/api/v2/%7B%7Bticket.id%7D%7D.json?ref=internalnote.com)
- Request Method: `PUT`
- Authentication: Basic Authentication: `admin@domain.com/token:zendesk_token`



## Setup a trigger
And to wrap up the Admin setup of this flow, we'll need a trigger that reacts whenever a ticket is created and puts the value of the Intermediate Field into our Lookup Field.

Create a trigger with the following conditions: we want to only run this when a ticket is created in our Pokémon Form, and we want a value to be present in the intermediate field (meaning a Pokémon has been chosen)

Once these conditions are met, we want to execute a *Webhook* that calls the Update Ticket webhook via *Notify > Active Webhook.*
Add the following payload to the webhook. Note that `id` should be the ID of your `Lookup Field`, and value should be the `id` of your `intermediate field`.
```json
{
"ticket": {
"custom_fields": [
{
"id": 14502103878802,
"value": "{{ticket.ticket_field_14512152430226}}"
}
]
}
}
```
# The Help Center
We've now got two out of three pieces setup. We have a way to get the Custom Object records for end-users, and we have a way for the object the end-user has chosen to be added to our Lookup Field.
We do miss one piece of the puzzle: we need to show a list of Pokémon to our end-users, and set the chosen option to our Intermediate Field so our trigger can use it.
The way we'll do this is by replacing the `intermediate field` with a custom dropdown of our own. Whenever the customer chooses an option in the dropdown, we'll fill in its value in the intermediate field so our trigger can use it.
The code below should be added to the `new_requests_page.hbs` of your Help Center theme.

## Setup
We start by checking which form is displayed so we're sure we only change our Pokémon form. This also keeps the code sorted per form if we modify multiple forms.
```javascript
$( document ).ready(async function() {
const urlParams = new URLSearchParams(window.location.search);
const ticket_form_id = urlParams.get('ticket_form_id')
if (ticket_form_id == '10992076994578'){
....
}
});
```
Next we'll hide our Intermediate Field and add an empty dropdown which we'll later fill with the Custom Object Records.
```javascript
const intermediate = '14512152430226' //ID of our ticket field
$('#request_custom_fields_'+intermediate).hide(); //hide custom fields
$('#request_custom_fields_'+intermediate).after(`
--
`);
```
Since we might want to use the new Zendesk Guide JWT option we also need to generate a JWT token
```javascript
const jwt = await getJwt();
async function getJwt(){
fetch("/api/v2/help_center/integration/token.json")
.then(response => {
var json = response.json();
return json.token;
})
}
```
We need to load the data from our Worker to get access to the records.
```javascript
const base = 'https://customobjectsproxy.verschoren.workers.dev';
var api_url = "/api/v2/custom_objects/pokemon/records.json?per_page=100&sort=id"; //the sort value makes sure we sort by the external_id
await getRecords(api_url);
async function getRecords(path) {
var url = base + path;
$.ajax({
url: url,
dataType: 'json',
headers: {
"Authorization": `Bearer ${jwt}`,
"Content-Type": "application/json"
},
success: function(response) {
//handle response
}
});
}
```
```json
//returned response
{
"custom_object_records": [
{
"id": "01HD0W1CWVCW3JYQFM91MWM1GY",
"name": "Charmander",
"external_id": "4"
...
},
...
]
}
```
Once we've captured the data by fetching the `api_url` we'll loop through the records to append them to our dropdown.
```javascript
//add to dropdown
$.each(response.custom_object_records, function (i, record) {
$('#select_pokemon').append(`
${record.name}
`);
});
```
Since it's possible we have more than a 100 records, we can use the `meta.has_more` key to check if there are more records, and if there are, we'll run our code again.
Since we proxy the requests to our worker we need to change the `links.next` url to use our worker `base` URL instead of the Zendesk URL.
```javascript
//check if more than 100
if (response.meta.has_more == true) {
var next = response.links.next.replaceAll(/https:\/\/(\w+\.)*zendesk\.com/g,'');
getRecords(next);
}
```
And finally (finally!) we need to react to changes in our dropdown to set the intermediate field:
```javascript
$('body').on('change', '#select_pokemon', function(){
$('#request_custom_fields_'+intermediate).val(this.value);
});
```
# The Result
Now that we've done the work, let's see how this all combines into one flow for our customers.
In the screenshots below you'll see a trainer go to our form, select his Pokémon type from the dropdown, fill in all other fields and submit the form.



On the Agents' site, they see a filled in Lookup Field linked to a Custom Object. The sidebar app we build in a previous article shows the Pokémon's information, and the native Record Preview also shows our record information.



## Where we take it from here
This flow is a bit long and complex, but in the end allows you to present custom objects to end-users and have a native and automated experience for your agents.
You can expand the Proxy Worker to allow for more types of objects, and then clone the trigger to allow for more intermediate-to-lookup field mapping. Off course, this also requires you to update the Help Center code to get the right objects and fill in the right intermediate field.
Like I mentioned earlier, I **really** hope we get native lookup fields sooner rather than later so I can delete this fourth article and replace it with a native flow. But until then, this offers a working solution.
# Wrap up
This article wraps up the Custom Object series. In the series we started with an introduction to Custom Objects and showed how to create object types and import records.
We then moved to how Agents interact with records and added a custom app that displays the data more nicely.
The series then moved to showing how we can augment user profiles with record data, and allow for priority changes based on the linked records.
And finally we allowed customers to interact with objects and choose values in ticket forms.
So now, I pass the control to. Which types of custom objects will you add to your Zendesk instance? Leave a comment to the article or send me an email with your results!
And if this series was useful, please consider sharing it with your colleagues and partners!
### Overview of the new Customizable CSAT for Zendesk
URL: https://internalnote.com/preview-of-the-new-customisable-csat-for-zendesk/
Last updated: 2024-10-14T18:21:44.000Z
At the closure of every ticket, Zendesk has always offered you the ability to send out a CSAT survey to your customers. This survey allowed customers to give a "Good, I'm satisfied", or "Bad, I'm unsatisfied" rating, accompanied with a comment field, and an optional list of predefined reasons why they're unhappy.
I've seen plenty of Zendesk customers who used [placeholders](https://support.zendesk.com/hc/en-us/articles/4408886858138-Zendesk-Support-placeholders-reference?ref=internalnote.com#topic%5Fnnz%5Fopl%5Frc) to turn these two options into images, emojis or other designs, like so:
```html
🥳 I'm happy .
😔 I'm sad .
```
But the real thing most Zendesk users actually wanted was the ability to customize the CSAT feedback. More options, different scales, a different set of reasons,... you name it.
So, this is where the new Customisable CSAT feature comes in.
# What's Customisable CSAT?
In short, this new feature allows you to customise your entire CSAT survey:
- You can choose between a rating scale with 2, 3 or 5 options.
- You can choose between numbers, emoji or plain text to differentiate between options.
- You can add custom labels to each option.

Once a customer has rated your ticket, they can then add additional feedback via the comment field, or give a reason why they gave bad feedback:

If they've given feedback, they have 48 hours to come back and change their feedback if they want to. All feedback changes are logged in the tickets' event timeline.


## Setup
Setting up the new CSAT features is pretty straightforward. Instead of being hidden under *Admin Panel > End Users > Settings*, they now get a nice new section in the *Objects and Rules* part of the Admin Panel.
Enabling the customisable CSAT is done with a simple toggle, which shows the setup wizard with three configuration sections:
1. CSAT survey, where you can set the Survey question, scale and type, and change labels.
2. a Follow-up dropdown to capture the reason for negative feedback.
3. Configure a comment field.

### Survey Questions
When setting up your CSAT survey you can choose the question asked (How would you rate our service?) and choose a scale and type.
One curious thing is that for each scale Zendesk predefines the amount of positive and negative options you get.
You get a satisfied/unsatisfied when going for the classic 2 option CSAT, you get 2 negative ones when going for 3 buttons, and get 2 positive options when going for the maximum of 5 options.
🤔
I find it a bit curious how negative options are more represented than positive feedback, but I assume that most customers leave negative feedback anyhow when they fill in such a questionnaire?
Once you choose your scale, you can pick a type of layout. You can go for the aforementioned numeric scale, you can pick a custom emoji for each option, or go for plain text buttons.
One thing to note here is that, even though customers might give a 2,3 or 5 rating, in the end it all gets converted into **the same good/bad binary** **options** from before. So you won't see any difference in your reporting, it's just the customer facing labels that differ.



### Follow-up questions
Once you've setup your CSAT type, you can edit the two Follow-Up questions:
- For negative feedback you can add up to 9 reasons for why, together with a guiding headline.
- For all feedback types you can add an open ended comment field.
You can delete these questions if you want, and can always add them again, but you can only add one of each. So if you were hoping of adding a complex survey after each ticket, you're out of luck. You still get the same basic *question-why-comment* structure as before, but now in a more customisable way.


## Translations
One issue I encountered when testing this new EAP is Dynamic Content and translations. For now, when you add a Dynamic Content placeholder like `{{dc.good}}` as a label, it gets translated, but somehow still displays the curly braces instead of only the translated string



## API
From an API standpoint this new customisable CSAT is identical to the old CSAT format, so you can safely switch to this new version without needed to change any code if you would, e.g., export your CSAT into an external platform:
```json
{
"ticket": {
"satisfaction_rating": {
"score": "bad",
"id": 15264032482706,
"comment": "sad",
"reason": "The issue was not resolved",
"reason_id": 15264002643474
},
...
}
}
```
And similar, when checking the `reason_id` via API, it still resolves the same way as before:
`https://yourdomain.zendesk.com/api/v2/satisfaction_reasons/15264002643474`
```json
{
"satisfaction_reason": {
"url": "https://d3v-verschoren.zendesk.com/api/v2/satisfaction_reasons/15264002643474.json",
"id": 15264002643474,
"reason_code": 1001,
"value": "The issue was not resolved",
"raw_value": "The issue was not resolved",
"active": false,
"created_at": "2023-11-22T20:42:16Z",
"updated_at": "2023-11-22T20:42:16Z",
"deleted_at": null
}
}
```
## Conclusion
All in all, this is a nice update to the existing CSAT surveys that allows for some nice customisability, without actually breaking any existing features.
One thing I would love to see is some agent visibility into what the customer actually chose. The agent currently only sees a bad/good result, but can't see if the customer choose option 1, 2 or 3 in a 5 step rating:

Similar, sometimes you also want to measure why someone gave a good rating in a similar dropdown as the bad rating. But for now, that is also not possible.
So this feature seems to be exactly what's promised on the label: Zendesk CSAT, but customisable.
I like it.
### Zendesk Custom Objects - Part 3: Users
URL: https://internalnote.com/custom-objects-part-3-users/
Last updated: 2025-09-08T06:41:50.000Z
In this four part series we'll explore the new Custom Objects from an admin, agent and end-user standpoint.
#### Custom Object Series
1. [Introduction to Custom Objects](https://internalnote.com/custom-objects-part-1-introduction/)
2. [Custom Objects and Tickets](https://internalnote.com/custom-objects-part2-tickets/)
3. [Custom Objects and Users](https://internalnote.com/custom-objects-part-3-users/)
4. ➕ [Making Custom Objects available to End-Users](https://internalnote.com/custom-objects-part-4-end-user-and-forms)
The first two articles showed you how to set up custom objects and how agent can interact with them.
This third article will dive into expanding user profiles with Custom Objects and how you can use them to trigger different priorities based on linked records and how to create custom record tied to a specific user.


# Map records to user profile
So far we've covered creating records and linking them to tickets. But we can also use Custom Objects to expand User Profiles in Zendesk.
Traditionally whenever we wanted to expand a customer profile we'd resort to user fields or tags. We tag a customer with `VIP` or set the Customer Type field to `prospect`. With Custom objects we can link rich objects to customers and provide more information than a regular field can.

Going back to our Pokémon example, in that world trainers can earn badges which gives them certain privileges. In our demo we'll use them to do the following:
1. Make it clear what badge a trainer has earned
2. Increase the priority of a trainers' ticket based on their badge
3. Add the Gym Owner in cc to the ticket.
## Creating the Custom Record
As always, whenever you create a record it's best to first map out the required data.
In our case we need the following fields:
- Name: name of the badge
- Gym Owner: Lookup Field linked to a specific `user` in our Zendesk environment
- Gym Type: Lookup Field linked to the Custom Object `Pokémon Type`
- Information: text field with info about the badge.


Looking at the previous articles you should already know how to setup most of these fields, but let's dive into one new type: a lookup field that links to a user.
We've setup a few Light Agents in Zendesk tagged with `gym_owner` . These people are responsible for giving second line support on their customers.
Now, in the Custom Object we're creating, add a new field of type *Lookup Relationship* and named Gym Owner.
Select `User` as the related object. Opposed to all prior steps, this time we do want to setup a filter. We only want to show or link users that are tagged with `gym_owner` since these are the only people we want to be linked to badges.



## Creating the badges
Now that we've created the record type, we can start adding records to our object. We'll create a Cascade Badge, of type Water linked to the Gym Owner *Misty.*

## Linking a custom record to a user
Lookup fields work in two directions. In our case we have a badge with a Lookup field that links a gym owner. This is **one record** that reference the badge and includes metadata like type, owner,...
Each badge can only have one gym owner linked.
We can also add a lookup field to a user profile in Zendesk that links a badge to a user. Each **user** in Zendesk can have **one badge linked**. But the same badge can be linked to multiple users.
To link badges to users we need to add a *User Field* via the *Admin Panel > People > Configuration > User Fields*. Create a new field of type Lookup Relationship. Give it a name like "Current Badge" and set the related object to the Badge object we just created.


Now, when we open a user profile in Zendesk, a new user field will appear on the left side. Click on the Badge dropdown and select the Cascade Badge we just created.

Two things will happen. When we look at a customers' essentials card it will show their current badge. And when we look at the badge in the Object Viewer we'll see Badge listed as one of the current owners.
When we click on the badge name in their profile or in the Essentials Card it'll open the detail view of the Badge and we can view its owner, type and other information stored in the record.


# Interacting with custom objects via triggers
Just being able to view data next to tickets is nice, but it we can also interact with that data to automate processes.
## Set ticket priority based on the current badge
We can use a trigger to give all tickets created by badge holders a higher priority in our instance. This will benefit badge owners because a higher priority often means a faster SLA, thus a quicker assist to their issues.
You can see this trigger in action in the screenshot all the way at the start of this article 😇
Setting this up is done by a trigger with the following conditions:
- Ticket > Ticket is `Created`
- AND Requester > Current Badge is `Present`
Choose the following action:
- Ticket > Priority to `High`


# Make assets unique per user
So far in this tutorial we've linked predefined objects to users and tickets. But there are use cases we're objects have a specific type, and exist multiple times. Think multiple copies of a specific laptop, or versions of a software license, or in our cases: the different between a Pokémon species and a specific captured specimen.
So let's expand our Pokémon object to make a difference between Pikachu as a species, and the specific Pikachu captured by Ash, our requester used in the demo's.
## Setting up object
Just as before, let's first define our object. We have a `Captured Pokémon` owned by a `trainer`. That Pokémon is of a specific `pokemon` species.
Let's set this up. We first create a new Object Type named `captured_pokemon`. We add the following fields:
- Name: Captured Pokémon
- Lookup Field: Pokémon Species, that links to the `pokemon` object we created in the first article of this series
- Lookup Field: Trainer, that links to Users. We do not need a filter since anyone can be a trainer.


Since we want our agents to be able to modify these Pokémon, or even create new ones we didn't know of, we'll change the permissions to give all our agents add, edit and delete rights. (Some Pokémon might escape after all).

## Creating a new Captured Pokémon
Go the the Object Viewer via the navbar and choose the *Captured* *Pokémon* object. Click add and create a new Pokémon. Give them a name, choose a species and select their trainer.
Once added, the Pokémon will show up when looking at the Captured Pokémon object, and will also show up on the Trainers profile in Zendesk in the Related tab.



Naturally, this is only part of the story. Now that we have a specific Pokémon to refer to, we might want update our Ticket Forms to refer to that Pokémon instead of the generic `Pokémon` type.
This is done similar to how we did it earlier for the regular object. Create a new Custom Ticket Field of type *Lookup Relationship*, and select the `Captured Pokemon` as a related object.
Now your agents can link tickets to a specific Pokémon, instead of the generic species.
💡
Or similarly, you can link a ticket to a specific laptop with a specific serial owner by a colleague, instead of the generic laptop type to create a more detailed report on actions taken on that laptop.
## Update to the sidebar app
In the previous article we build a sidebar app that showed a nicer overview of the Pokémon data. If we want to use these Captured Pokémon we need to make an extra API call to show the data.
First we need to get the value of the `Captured Pokémon` ticket field:
```javascript
var captured_pokemon_id = await client.get('ticket.customField:custom_field_14504649143442');
```
We then use that value to retrieve the data of the `Captured Pokémon` record, and more specifically its linked species. This way we capture the `Record ID` of the Pokémon we need.
```javascript
var linked_pokemon = await client.request({
url: '/api/v2/custom_objects/pokemon_captured/records/'+captured_pokemon_id+'.json',
type: 'GET',
dataType: 'json'
}).then(async function(pokemon){
return pokemon.custom_object_record.custom_object_fields.pokemon_species;
});
```
And now we can use that `Record ID` to get the data of the actual species:
```javascript
return await client.request({
url: '/api/v2/custom_objects/pokemon/records/'+linked_pokemon+'.json',
type: 'GET',
dataType: 'json'
});
```
The application in the repository we used in the last article is updated to include this functionality. Just make sure to set the "Use Captured Pokémon" setting in the apps' configuration to true when installing.
[GitHub - verschoren/pokedexContribute to verschoren/pokedex development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/pokedex?ref=internalnote.com)
## Notify trainer
Similar to how we used triggers to set the priority of tickets based to linked records, we can also use other data in a record to update our tickets.
Imagine a scenario where our Captured Pokémon have a linked Gym Owner which is the specialist for this Pokémon.



We can now create a trigger that adds the Gym Owner as a follower whenever the tag `specialist_needed` is added to a ticket. This is done by leveraging the nested data in a Custom Object.
In the action step choose *Add Follower* as a step and select your *Captured Pokémon* ticket field > *Specialist* as the value.



Whenever we now add the tag `specialist_needed` to the ticket (e.g via a macro) we'll add the Specialist linked to that specific Pokémon as a Follower to the ticket.


💡
This flow is useful to have e.g. a responsible for a product, a vendor, a third party supplier or manager pulled into the conversation based not the linked record type. It works for all Lookup Fields linked against tickets.
Sadly, it does not yet work for objects linked against the ticket requester.
# What's next?
So, we've now learned how to create custom objects at the start of this series. We then used the objects to give agents additional context in tickets to help them solve tickets faster. And this article showed how to add additional information to end-user profiles and use that information to change priority or escalate conversations to agents.
To wrap up the series we'll solve a missing feature in Zendesk [in the next article](https://internalnote.com/custom-objects-part-4-end-user-and-forms). We'll show Custom Object data in Help Center forms and make it possible for customers to choose object instead of requiring agents to do so.
### Zendesk Custom Objects - Part 2: Tickets
URL: https://internalnote.com/custom-objects-part2-tickets/
Last updated: 2025-09-08T06:45:11.000Z
In this four part series we'll explore the new Custom Objects from an admin, agent and end-user standpoint.
#### Custom Object Series
1. [Introduction to Custom Objects](https://internalnote.com/custom-objects-part-1-introduction/)
2. [Custom Objects and Tickets](https://internalnote.com/custom-objects-part2-tickets/)
3. [Custom Objects and Users](https://internalnote.com/custom-objects-part-3-users/)
4. ➕ [Making Custom Objects available to End-Users](https://internalnote.com/custom-objects-part-4-end-user-and-forms)
The [first article](https://internalnote.com/custom-objects-part-1-introduction/) showed you how to set up custom objects, how to structure and link the data, and how to import data into Zendesk.
This article will show you how to use Custom Objects in forms, how to show the data to Agents, and will include a custom sidebar app that will show the records in a more visual way.
# Custom Objects for Agents
Agents interact with customers via tickets in the Agent Workspace. The Agent Workspace offers a unified inbox off all active conversations, and provides context with the Intelligence Panel and Custom Fields in Forms.
With Custom objects we can expand those traditional forms and fields with more rich objects. Instead of a customer referencing a specific product or asset in a field, we can have that field be linked to an actual Custom Object record and show the agent all related data like it's vendor, location, purchase date e.a.
Similar to how an agent can see a customers' profile via the [Essentials Card](https://internalnote.com/essentials-card/), we can use the new Record Preview Feature to get a *preview* of a linked record right next to a ticket. Or, if a record needs to be modified we can give agents edit rights to records to they can update a phone number, name or description.
In this article we'll expand our Pokédex Object and allow agents to link Tickets to specific Pokémon, and check their stats.
# Showing custom objects in a form
The first step to link Custom Objects to Tickets is by creating so called Lookup Fields. We've already used them in the previous article to link `types` to `pokemon` but this time we'll use them to link `tickets` to `pokemon`.
Lookup fields in forms work similar to drop downs. They offer agents list of options to choose and they are stored in the ticket metadata for future retrieval and/or reporting.
## Adding a Lookup field
To create a Lookup field go to A*dmin panel > Objects and rules > Tickets > Fields* and add a new Custom Field. Choose *Lookup Relationship* as its type.
Give the object a clear name, e.g. "Choose a Pokémon" and link it to the `Pokémon` object we created in the previous article. You can ignore the filter for now.
Once saved, go to A*dmin panel > Objects and rules > Tickets > Forms* and add the Lookup field to a new or existing form. For this demo I created a Pokécenter Form which includes the Lookup Field, a dropdown with a few options and the default Priority and Type fields.



## Viewing Objects when interacting with Tickets.
Now that we have added our Lookup Field to the form, we can have agents interact with that field.
Take a look at the flow below. A customer has asked a question about a Pokémon. Our agent first uses the Lookup Field to search for the Pokémon in question and adds him to the ticket.


You'll notice that once they add the Pokémon, a new icon appears next to the ticket field. Clicking that icon will open the new *Record Preview*. Since the customers' question is related to the `Pokémon type`, the agent can click on the linked `type` and check out its data easily and provide an answer to the customer.



## Viewing linked objects
It might be useful in some flows to not only be able to see what Pokémon is linked to a ticket, but to find all tickets linked to a specific Pokémon.
This can be done by going to the Object Inspector in the navbar, selecting the Pokemon object and searching for a specific one. When you open its record, you'll find the record data on the left, and the right side of the view shows all linked objects. In our case: all the tickets that refer to our Pikachu.

## Permissions
You'll notice that it was the **agent** who added the Pokémon to the ticket, and not the customer filling a form. This is due to a currently limitation in Custom Objects where we can only make custom objects visible, editable or deletable for Agent in your Zendesk environment.
The fourth article in this series will show a work around for this, but out of the box it's the agents doing the work here.
🔐
The reason for this is the potential of leaking company data. Lookup fields can list users, organisations, objects. Imagine creating a lookup fields that contains all your customers and sharing that with your end-users. All of the sudden the names of all your customers are publicly visible. Until Zendesk finds a way to make this risk visible/manageable when setting up Lookup Fields, they have purposefully restricted public access to the objects.
Setting end-users aside, we do need to validate the correct permissions for our other agents before they can interact with the custom objects. This is done by managing the object in the Admin Panel and navigating to the [*Permissions Tab*](https://support.zendesk.com/hc/en-us/articles/6034260247066?ref=internalnote.com). Here you can set View, Edit, Delete or Add rights to the Object.
Your situation will vary, but I've setup this Object with View rights for all users, and only admins have the ability to add, edit or delete records.
Note that you **do not need** edit rights to be able to link tickets and object records! Edit records only apply to changing data within a record. For example: changing Pikachu to a Grass type.



# Create a custom sidebar app
So far we've covered linking records to tickets and seeing the data in the Agent interface. As you noticed in the flow above, the agent can link a Pokémon, view its data in the Record Preview. By clicking the Type in the preview we can then see a Pokémon's type and discover its strength and weaknesses.
But even though this built-in interface is nice, there are things that could be better. Our object has an `image` field that contains a link to an image of the Pokémon. And our agents need to click a few times to discover a Pokémon's strength and weaknesses.
These items aren't showstoppers, but it would be nice to create a more visual representation of the data for our agents.

As you can see, this Agent Workspace contains a custom sidebar app that shows a photo of the linked Pokémon, clearly shows its type in a visual way, and even shows its strength and weakness in one overview.
You can find a full code sample of the app in the repository below.
[GitHub - verschoren/pokedexContribute to verschoren/pokedex development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/pokedex?ref=internalnote.com)
## Getting a linked object
This app lives next to a ticket and makes use of the ZAT Client to read the ticket data of the current ticket.
We first use `client.get('ticket.customField:custom_field_123457890')` to retrieve the value of the Lookup Field. Note that `1234567890` is the ID of the Ticket Field, which can be found via the Admin Panel.
If a Pokémon was linked, this will return the `Record ID` of the linked Custom Object. We then use the Zendesk API to retrieve the entire record of the linked Pokémon via `/api/v2/custom_objects/pokemon/records/{{record_id}}.json`
```javascript
let pokemon = await getPokemon();
async function getPokemon(){
var linked_pokemon = await client.get('ticket.customField:custom_field_14502103878802').then(async function(custom_field){
return custom_field['ticket.customField:custom_field_14502103878802'];
})
if (linked_pokemon == null){
return null;
} else {
return await client.request({
url: '/api/v2/custom_objects/pokemon/records/'+linked_pokemon+'.json',
type: 'GET',
dataType: 'json'
});
}
}
```
```json
//returned data
{
"custom_object_record":
{
"id": "01HD0W1D30KCRZ8PTVZKT86M5P",
"name": "Pikachu",
"custom_object_key": "pokemon",
"custom_object_fields": {
"image": "https://pokedex.verschoren.dev/images/25.png",
"type": "01HD0T5GE1QDVPB97XWTJV5WT2"
},
"external_id": "25",
...
}
}
}
```
Once we have our `pokemon` we also need to load the data of the linked `type` object. Since Zendesk does not (yet) allow to side load linked records, we'll need to make a second API call to retrieve the `pokemon_type` data.
```javascript
let pokemon_type = await getType(pokemon.custom_object_record.custom_object_fields.type);
async function getType(type_id){
return await client.request({
url: '/api/v2/custom_objects/pokemon_type/records/'+type_id+'.json',
type: 'GET',
dataType: 'json'
});
}
```
```json
//returned data
{
"id": "01HD0T5GE1QDVPB97XWTJV5WT2",
"name": "Electric",
"custom_object_key": "pokemon_type",
"custom_object_fields": {
"color": "yellow",
"strength": "01HD0T5GCHTCSFFS3G3AMGVMRH",
"weakness": "01HD0T5GDZ95H63AKDXK7FFQY9"
},
...
}
```
And finally, since we also need the `strength` and `weakness` we can use `getType()` again to load the data for the two linked `pokemon_types`.
```javascript
let weakness = await getType(pokemon_type.custom_object_record.custom_object_fields.weakness);
let strength = await getType(pokemon_type.custom_object_record.custom_object_fields.strength);
```
## Showing the data
As you can see, interacting with Custom Objects via API is not that complex. The same IDs are uses across custom fields and records, making it easy to retrieve records and their data.
Now that we have gathered all data for our linked record, we can use that data to render a nice preview of the record for our agents that include both strengths and weaknesses and a nice photo of the Pokémon.

## Wrapping it up
There's a few final niceties we can add to our app to wrap it up.
First off, we add a link to the Object Inspector so we can view our Pokémon record in the native full screen viewer.
```javascript
$('#view').attr('href',`https://yourdomain.zendesk.com/agent/custom-objects/pokemon/records/${pokemon.custom_object_record.id}`);
```
Secondly, we want our app to update whenever a Pokémon has been added to the ticket, removing the need of a manual refresh by the agent:
```javascript
client.on('ticket.custom_field_14502103878802.changed', function(e) {
init();
});
```
💡
As noted, you can find the entire app in the [GitHub](https://github.com/verschoren/pokedex?ref=internalnote.com) repository. You'll notice that the app already includes a few other features like showing a requesters' Gym Badge and the option to show Pokémon captured by the requester. These are items we'll explain in the next article of this series!
# What's next?
We've now seen how we can have Agents interact with Custom Objects in the Agent Workspace, and how we can use the build in Record Preview or a custom sidebar app to show rich context to agents while working with tickets and Custom Objects.
The [next article](https://internalnote.com/custom-objects-part-3-users/) in this series will dive into expanding user profiles with Custom Objects. We'll explain how you can use them to trigger different priorities based on linked records, and how to show linked objects to users next to their profile and tickets.
## Sign up for Internal Note Plus
The next articles of these series are Internal Note Plus articles. Subscribe today (or make use of our trial!) to keep learning about Custom Objects!
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Preview of the new Generative AI for the Zendesk Help Center
URL: https://internalnote.com/preview-of-the-new-generative-ai-for-knowledge-in-zendesk/
Last updated: 2024-08-19T20:34:24.000Z
Zendesk's [AI Drop Event](https://internalnote.com/zendesk-ai-drop-keynote/) last month included tons of new Zendesk AI features. Their new Generative AI Bot got all the attention and headlines, but in parallel they also announced their new Generative AI for Help Center content.
This new feature allows Content Managers to write short summaries of articles, and use Generative AI to expand the summary or bullet points into long-form support articles. It's powered by [OpenAI](https://support.zendesk.com/hc/en-us/articles/6059285322522-Overview-of-OpenAI-within-Zendesk-Services?ref=internalnote.com), and positioned as a way to create content faster and more efficient by having your writers focus on the essence of an article, and have AI worry about turning it into an actual article.
[Using generative AI to expand help center content (EAP)What’s my plan? Note: The text expansion feature is currently available in an early access program (EAP). You can sign up for the EAP here. The AI-powered text expansion feature helps you to quic…Zendesk helpElizabeth Williams](https://support.zendesk.com/hc/en-us/articles/6267360002714?ref=internalnote.com)
❌
I was planning on writing about today's [Zendesk What's New](https://www.zendesk.com/whats-new/?ref=internalnote.com), but in the end it wouldn't be a very useful article.
Although the presentation was packed with announcements, almost all of them were already known or released in the last few months: Layout Builder, [Agent Home](https://internalnote.com/agent-home-beta/), Omnichannel Routing, [Generative AI Bot](https://internalnote.com/quick-look-at-the-new-generative-ai-bot-for-zendesk/), [Custom Objects](https://internalnote.com/custom-objects-part-1-introduction/) and most of the stuff covered at the AI Drop Event.
The few items that were actually new, like the 360 Employee View app, will be covered in the Zendesk Roundup later this month.
# Let's put it to the test




I gave my [test article](https://support.internalnote.com/hc/en-us/articles/14904161389202?ref=internalnote.com) the following input:
#### Input
Steps to make coffee
1\. Preheat machine
2\. Weigh beans - 18g
3\. Grind Beans
4\. Add to portafilter
5\. Tamp the ground beans
6\. Insert into machine
7\. Pre-infuse
8\. Pull Coffee (30sec -27g)
9\. Enjoy
And clicking the *magic wand* tool in the article editor turned it into this longer article:
#### Expanded Result
Here is a step-by-step guide on how to make coffee: Preheat the coffee machine to ensure that the water reaches the optimal temperature for brewing. Weigh out 18g of coffee beans. This will ensure that you have the right amount of coffee for a balanced flavor. Grind the coffee beans to the desired consistency. The grind size will depend on the brewing method you are using. For example, a fine grind is typically used for espresso. Add the ground coffee to the portafilter, which is the part of the coffee machine where the coffee is placed for brewing. Tamp the ground coffee evenly and firmly using a tamper. This will help to create a level surface and ensure even extraction of flavors during brewing. Insert the portafilter into the coffee machine. Make sure it is securely in place. Pre-infuse the coffee by allowing a small amount of water to saturate the coffee grounds before the full extraction process begins. This helps to release the flavors and aromas of the coffee. Pull the coffee shot by starting the extraction process. The ideal extraction time is around 30 seconds, and you should aim to extract around 27g of coffee. Once the coffee shot is ready, remove the portafilter from the machine and discard the used coffee grounds. Enjoy your freshly brewed coffee! You can drink it as is or add milk, sugar, or any other desired flavorings.
What's evident is that this article is (A) longer and (B) contains a lot more nuance than my, admittedly, very short series of steps. It even included information on the effect of grind size, and explains why a proper tamping of the coffee puck is important. It offers extra nuance to my notes, things that make the article more informative, and trustworthy, but that's all detail that would have taken me time to look up and write.
The generated article also did not deviate from my summary. It contains my steps, and even took over my mistake, namely that a 18g doze of coffee should measure 36-40g coffee when going for a 1:2 or 1:3 ratio. So even though we count on AI to generate an expanded version of the article, I still stayed in control of the actual (wrong) content.
What's also clear is that this article is not at all usable as is. It's one giant block off text, has no line breaks and omits any sense of steps when reading the article. **(Update: fixed, see below)**
But a quick round of editing later turned my summary into this nice article:
#### Final Article
Here is a step-by-step guide on how to make coffee:
1. Preheat the coffee machine to ensure that the water reaches the optimal temperature for brewing.
2. Weigh out 18g of coffee beans. This will ensure that you have the right amount of coffee for a balanced flavor.
3. Grind the coffee beans to the desired consistency. The grind size will depend on the brewing method you are using. For example, a fine grind is typically used for espresso.
4. Add the ground coffee to the portafilter, which is the part of the coffee machine where the coffee is placed for brewing.
5. Tamp the ground coffee evenly and firmly using a tamper. This will help to create a level surface and ensure even extraction of flavors during brewing.
6. Insert the portafilter into the coffee machine. Make sure it is securely in place.
7. Pre-infuse the coffee by allowing a small amount of water to saturate the coffee grounds before the full extraction process begins. This helps to release the flavors and aromas of the coffee.
8. Pull the coffee shot by starting the extraction process. The ideal extraction time is around 30 seconds, and you should aim to extract around 27g of coffee.
9. Once the coffee shot is ready, remove the portafilter from the machine and discard the used coffee grounds.
Enjoy your freshly brewed coffee! You can drink it as is or add milk, sugar, or any other desired flavorings.
# Expand/Tone-Shift

Aside from just expanding text, Zendesk also added[ a tone-shift feature](https://support.zendesk.com/hc/en-us/articles/6353506096410-Announcing-the-addition-of-tone-shift-to-the-Generative-AI-for-Knowledge-EAP?ref=internalnote.com) into the editor, turning text into a more serious, or more playful tone.
By using this feature, similar to the one already available to agents, you can turn this dry closing sentence:
> Enjoy your freshly brewed coffee! You can drink it as is or add milk, sugar, or any other desired flavorings.
Into this more friendly, slightly longer, paragraph.
> Savor the delightful taste of your freshly brewed coffee! Feel free to enjoy it as it is or enhance the experience by adding a splash of milk, a sprinkle of sugar, or any other delicious flavorings that tickle your taste buds.
# My take
I've written before on the absurdity of some of the AI flows. When combining all the AI features we basically now have someone writing a shot summary of an article, that AI expands to a full article on one side.
And on the flip side we have customers asking questions to the Zendesk Bot, where AI turns long articles into a [summarised answer](https://internalnote.com/quick-look-at-the-new-generative-ai-bot-for-zendesk/). The main nuance lies in the fact that the Customer Answer is generated with their intent en context in mind, but surely somewhere in this game of Chinese whispers, something will or can get lost in translation.
That being said, it is a useful feature to have, cause it turns technical summaries into readable articles with nuances and more colourful text, and in times of crisis (when things go offline, when orders are lost) not spending time on writing detailed article for the sake of it, makes time available to actually help customers or dive into the issue.
## A few missing items
While playing around with the EAP I noticed that it handled all input as plaintext. URLS, lists, bold or italic text were all turned into plain text, and even titles and line breaks were gone once AI did its thing. **(Update: fixed, see below)**
I tested both lists of steps like the example above, as well as feeding the AI paragraphs of text (thanks Wikipedia!) but in both scenarios some of the existing structure or markup got lost.
Especially in the case of lists and URLs I hope these feature will get added by the time this EAP turns final release.
# Update (Nov 9th)
The Product Manager of this EAP reached out to me and let me know that the HTML stripping issue is now resolved and articles should now respect lists, urls and other markup when being processed via OpenAI.
It's an EAP for a reason, so pretty cool to see how fast feedback gets implemented and the tool improves.

### Zendesk Custom Objects - Part 1: Introduction
URL: https://internalnote.com/custom-objects-part-1-introduction/
Last updated: 2025-09-08T06:41:54.000Z
A few years ago Zendesk introduced Custom Objects to break out of the classic pattern of ticket - user - organisation.
With custom objects companies could expand the Zendesk CRM with their own assets: printers, orders, contact information, SLA contract,... it promised a lot, but sadly, the APIs and stability didn't really deliver. The Legacy custom objects – as they're now called – always felt like they lived next to Zendesk, as opposed to integrated with the platform.
This all changes with the new Custom Objects. This new release is a completely reworked approach to Custom Objects, that deeply integrates with the Agent Workspace. It has a UI to create object types, a build-in record viewer, and records can be linked to users, organisations, tickets and other records via the [Lookup Fields](https://internalnote.com/lookup-fields-and-ticket-escalation/) Zendesk introduced last year.

# Custom Objects Series
Showing how the New Custom Objects work in a single article would not do them service since they offer so much capabilities right out of the box. So instead of writing one article, I'm doing a series!
In this four part series we'll explore the new Custom Objects from an admin, agent and end-user standpoint.
#### Custom Object Series
1. [Introduction to Custom Objects](https://internalnote.com/custom-objects-part-1-introduction)
2. [Custom Objects and Tickets](https://internalnote.com/custom-objects-part2-tickets/)
3. [Custom Objects and Users](https://internalnote.com/custom-objects-part-3-users/)
4. ➕ [Making Custom Objects available to End-Users](https://internalnote.com/custom-objects-part-4-end-user-and-forms)
This first article will show you how to set up custom objects, how to structure and link the data, and how to import data into Zendesk.
The second article will show you how to use Custom Objects in forms, how to show the data to Agents, and will include a custom sidebar app that will show the records in a more visual way.
The third article will dive into expanding user profiles with Custom Objects and how you can use them to trigger different priorities based on linked records.
The last article will solve a missing feature in Zendesk by showing Custom Objects in Help Center forms and make the selected record available to agents.
# Pokédex
Last spring shortly after the Relate event, I build a quick proof of concept of a Pokédex in Custom Objects. This series will use that concept to explain all the elements related to Custom Objects in Zendesk
[Preview: Creating a Pokédex with Zendesk Custom ObjectsThe awesome people at Zendesk just made the Custom Objects v2 EAP available.So why not build a Pokédex inside Zendesk to get to know the APIs 😉Internal NoteThomas Verschoren](https://internalnote.com/creating-a-pokedex-with-zendesk-custom-objects/)
Why a Pokédex? When building on top of new technology I tend to use a data set or environment I know, so I can focus on exploring the tech, and not worry about thinking of complex data structures, or generate sample data on my own.
Being a father of a 3 and 6 year old, the world of Pokémon was readily available, and there are a lot of online tables, lists and assets ready to copy and use. But even if the world where this article series lives in is not at all related to your business, the concepts in this series can easily be applied to your own business needs.
# Creating Custom Objects
Before starting with Custom Objects it's important to first write down the structure of your data so you can see how the data is organised.
In our case we're building a Pokédex, so we need at least:
- Index, or the number of the Pokémon in the list
- Name
- Image, to make the data a bit more visual
- Type, which element is linked to the Pokémon

Custom Objects have an `external_id` and `name` as default fields. Those nicely map to our `index` and `name` fields.
Since Custom Objects does not support attachments or binary data, we can't just upload an `image`. So we'll use a text field for this value and store the URL of a hosted image.
And finally, we have `Type`. `Type` is a text value, e.g. Electric or Fire, but is a known list of values. There's around 12 different types our Pokémon can have. We might be tempted to use a Dropdown field for this element. This way we can choose one of the preset values, and can filter on those values.
But, `Type` is more complex than just a string of text. In the lore of the games Fire types are weak against water, and strong against grass. So it might be cool if we can somehow store that information too in our Objects.
So instead of creating a dropdown, we'll first create a separate Object for `Types` which contains that related data. We'll then link those two together.
💡
Similarly, if you store products you might have a `Vendor` field attach to them. That vender has an address, name, contact email,... so instead of storing just the name of the Vendor, you could create a `Vendor` object and link it to your `Products` object.
So that's the basic structure we'll need. Two object types, each containing around three fields.
# Creating the Type Object
## Setting up the object
To create an object, go to the *Admin Panel > Objects and Rules > Custom Objects > Objects* and click on *Create Object.*
Give the object a name 'Pokémon Type' and a plural name 'Pokémon Types'. This last one is used whenever we show multiple records of this type. The object key is used whenever we interact via the API. Give it a short name like `pokemon_type`.


💡
I give my object types similar Object Keys whenever they are related. So for this setup all objects will start with `pokemon_` as a prefix so I can more easily find them when using the API.
Next up, we need to add the fields. We already get `name` so we can use that to store e.g. Water. We then add three fields: two lookup fields, and a dropdown.
The dropdown contains a list of colours which we can use in custom apps to improve the way the object looks. Or, we can use the value to reference the colour the Pokémon type has in the game.


Lookup Fields are used to link multiple objects together. In our case we want to add a `strength` and `weakness` field that stores the types the customer is strong or weak. Since these values are `pokemon_types` too, we can add lookup fields that link to `pokemon_types` to reference them. This way we can jump between the elements when looking at them later in the Custom Object inspector.
When adding a Lookup Field you have to select the Related Object, in our case the `Pokémon Type` . You can filter the returned records, but that's something we'll use in a future article. You can ignore it for now.


## Adding records
Now that we have our object type created, we can start adding data. This is done via the Custom Objects Inspector in the Agent Workspace. You can find it via the nabber by clicking on the *Stacked Blocks* icon.

Select the Pokémon Type object and click *Add* to add a new type. You'll notice that you probably need to first create all elements, and then go back to add their Strength and Weakness since most of those referenced types will not yet exist.
[Custom Objects - Pokémon - typesCustom Objects - Pokémon - types.csv1 KBdownload-circle](https://internalnote.com/content/files/2023/10/Custom-Objects---Pok-mon---types.csv "Download")


# Creating the Pokémon Object
Now that we have our Types setup, we can create our main object, the `Pokémon` object record type.
Similar to how we created our `pokemon_type` object, we'll start by creating a new object type and give it a logical name, plural name and key. (I chose `pokemon` for all)


Next, add the fields. Like we discovered in our mapping exercise we can use the existing `name` and `external_id` fields.
We'll rename the External ID though. Pokédex ID has a nicer ring to it. We'll also add one Text Field for our `Image URL` by clicking the *Add Field* button and choosing a text field type. And finally we'll add a Lookup field that references the `Pokémon Type` we created earlier.




## Adding the Pokémon Records.
Last time I looked, the starter Pokédex for Pokémon contained 151 creatures. In total there are over a 1000 of those. Similarly, if you want to use Custom Objects for your own data you probably don't want to enter all records manually like we did with our dozen Pokémon Types earlier.
To solve this Zendesk has added a Data Importer feature that allows you to import CSV files with Object Records into Zendesk.
I've prepared a file for the first 151 Pokémon here:
[Custom Objects - Pokémon - pokemonCustom Objects - Pokémon - pokemon.csv14 KBdownload-circle](https://internalnote.com/content/files/2023/10/Custom-Objects---Pok-mon---pokemon.csv "Download")

The basic import structure is simple. The column names should match the Field Keys off the Fields you created earlier, and obviously the contents should match its type. (So adding a date to a date field, a number to an integer field and so on)
One special case is the *Lookup Field* column. Here Zendesk expects the ID of the element as stored in Zendesk. This ID is generated by Zendesk whenever an object is created and can be found in the URL of the object when looking at it in Agent Workspace.

For my import file I created a separate Sheet in my spreadsheet with list of Types and their corresponding ID and used a `VLOOKUP` to match the type Name with its ID. The resulting CSV file has two columns, `Type_Name` and `Type` where the latter matches the Field Identifier used in my Pokémon type.
💡
Browsing to `https://yourdomain.zendesk.com/api/v2/custom_objects/pokemon_type/records.json` will also show you a list of all records and their IDs.
Once you prepared the import file, you can go to the *Admin Center > Objects and Rules > Tools > Data Importer* to start the Import process. Select a Target Destination (the Pokémon type) and upload your CSV.


The system will validate the file and show the matches column. You can inspect some sample data to see if it all matches. You'll notice that the importer ignored the `type_name` column but nicely mapped my `types` to their correct linked record in the Pokémon Types object.
Press next to import. You'll see a status bar that shows the progress, and once completed you'll see your Pokémon appear in the Object Inspector!


# Viewing Records
Not that we have created our Pokémon object and imported the data, we can use the Inspector to explore our records.
Click the *stacked blocks* icon in the navbar and select the Pokémon object. You'll see a list of records sorted by Creation Date. You can paginate through them, or search via the search bar on top to filter. You can search for both the `name` field (e.g. Mew) or the `External ID` (e.g 151).


When you click on a record you'll see an inspector that shows the field data of the record on the left. The right side of the screen shows all objects that reference this record. We'll explore this in depth in the next article, but when looking at e.g. a Pokémon Type, you'll see all Types that have it as a Strength or Weakness.


# What's Next?
Now that we have our record types and records setup, it's time to integrate them with the Agent Workspace and make them available to agents.
The [next article](https://internalnote.com/custom-objects-part2-tickets/) in this series will show you how to use Custom Objects in Forms, how agents can interact with them, and we'll build a custom sidebar app that makes use of the API to show the data in a nicer way!
[Subscribe now to receive all articles in this series](https://internalnote.com/olus)
### Announcing the Custom Objects series for Zendesk
URL: https://internalnote.com/announcing-the-custom-objects-series/
Last updated: 2025-07-06T17:58:50.000Z
Zendesk Custom Objects have launched last month. It allows you to expand the traditional *ticket - user - organisation* dataset in Zendesk with your own custom data to give agents and end-users more context, automate flows and provide a richer customer experience.
[New updates to Zendesk platform enable businesses to act on customer data in one central workspaceZendesk today announced no-code tools to help businesses bring custom data into its platform and create differentiated customer experiences (CX). Admins can now leverage the in integrated triggers to easily create tailored, efficient workflows. Additionally, agents can leverage end-to-end context to…](https://zendesk.smh.re/Uz2?ref=internalnote.com)
Showing the new Custom Objects in a single article would not do them service since they offer so much capabilities right out of the box. So instead of writing one article, I'm doing a series!
In this four part series we'll explore the new Custom Objects from an admin, agent and end-user standpoint.
# Custom Objects Series
#### Custom Object Series
1. [Introduction to Custom Objects](https://internalnote.com/custom-objects-part-1-introduction/)
2. [Custom Objects and Tickets](https://internalnote.com/custom-objects-part2-tickets/)
3. [Custom Objects and Users](https://internalnote.com/custom-objects-part-3-users/)
4. ➕ [Making Custom Objects available to End-Users](https://internalnote.com/custom-objects-part-4-end-user-and-forms)
This [first article](https://internalnote.com/custom-objects-part-1-introduction/) will show you how to set up custom objects, how to structure and link the data, and how to import data into Zendesk.
The [second article](https://internalnote.com/custom-objects-part2-tickets/) will show you how to use Custom Objects in forms, how to show the data to Agents, and will include a custom sidebar app that will show the records in a more visual way.
The[ third article](https://internalnote.com/custom-objects-part-3-users/) will dive into expanding user profiles with Custom Objects and how you can use them to trigger different priorities based on linked records.
The [last article](https://internalnote.com/custom-objects-part-4-end-user-and-forms) will solve a missing feature in Zendesk by showing Custom Objects in Help Center forms and make the selected record available to agents.
## Subscribe now
Want to follow along and discover how Custom Objects work? Subscribe today and receive the articles right in your inbox. One article each week!
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Zendesk Roundup for October 2023
URL: https://internalnote.com/roundup-for-october-2023/
Last updated: 2023-10-31T06:56:46.000Z
It's only been a few weeks since Zendesk's AI Drop event, and I'm still discovering new features from that release. From a new Zendesk Bot that generates replies, to the new feature that turn a summary into a full article, and improvements for the summary, related tickets and expand feature, the event was packed with awesome new releases for Zendesk Advanced AI
If you want to discover all announcements, as well as read about the new Advanced Security Add-on, take a look at the overview I published right after the event!
[Zendesk AI Keynote - A full overview of the new releasesDiscover all the new Zendesk releases from the AI Drop event on October 5th: Generative AI Bots, Intent management, new privacy and security tools and new AI features to increase agent efficiency.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-ai-drop-keynote/)
The ink on that article wasn't even dry and Zendesk already announced a [What’s New at Zendesk](https://event.zendesk.com/whatsnewatzendesk2023q4emea/loginpromo?partner%5Fcontact=0036[%E2%80%A6]er%5Femail&utm%5Fsource=Premium%20Plus&utm%5Fcampaign=WhatsnewQ423%20!) for November 9th. The event will probably review the recent Custom Objects and Zendesk AI improvements, but I really hope they'll also announce general availability of the new Layout Builder and Agent Home. As usual, if anything new is announced, I'll write an overview right after the event.

Speaking of Custom Objects, in November I'm publishing a four part series on the new Custom Objects. Make sure to subscribe to not miss any article!
#### Custom Object Series
1. Introduction to Custom Objects
2. Custom Objects and Tickets
3. Custom Objects and Users
4. ➕ Making Custom Objects available to End-Users [(Internal Note Plus)](https://internalnote.com/plus)
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🎉 New Releases
## 🤖 AI Powered Conversational Experiences
All releases for AI and Messaging have been listed in the aforementioned AI Drop overview, but if you want the summary:
- Generative AI bot that turns articles into summaries based on the customer question
- The ability to edit intent names and assign intents to custom answers
- Assign a persona to your bot and have the answer feel professional, playful or neutral
- Show related tickets in the intelligence panel
- New HR, IT and Financial intent models
Most of these are in EAP, but you can request access and try out Advanced AI via [this link](https://support.zendesk.com/hc/en-us/articles/5608712782362-Using-generative-AI-to-summarize-and-enhance-ticket-comments-EAP-?ref=internalnote.com).
[Preview of the new Generative AI Bot for ZendeskDiscover the all new Generative Zendesk Bot powered by OpenAI in this article!Internal NoteThomas Verschoren](https://internalnote.com/quick-look-at-the-new-generative-ai-bot-for-zendesk/)
## 🔎 Help Center and Self Service
- The Zendesk Knowledge Base [gained](https://support.zendesk.com/hc/en-us/articles/6144535338778?ref=internalnote.com) the ability to generate articles based on a summary via EAP.
- Content Blocks are [now](https://support.zendesk.com/hc/en-us/articles/6012860666906-Announcing-content-blocks-enabled-by-default-in-all-articles?ref=internalnote.com) enabled by default, meaning you can embed reusable blocks of text in articles during creation, without the need to save the article first and manually enable this option.
- The Guide Media Gallery got the ability to (bulk) [delete images](https://support.zendesk.com/hc/en-us/articles/6245286580634-Announcing-bulk-deleting-of-media-in-Guide-media-library?ref=internalnote.com) and [rename images](https://support.zendesk.com/hc/en-us/articles/6281115689626-Announcing-renaming-media-in-Guide-media-library?ref=internalnote.com). This is especially useful for customers with big knowledge bases who migrated from the old 'images are stored within the article' option that existed before. You can now clean up duplicates, and give your assets clear and recognisable names.
## 🧱 Open and Flexible Platform
### Pinned Apps Shortcuts
This is a tiny change, but one that I really like. Agents can [now](https://support.zendesk.com/hc/en-us/articles/6208359261722-Announcing-app-shortcuts-to-help-agents-work-with-tickets?ref=internalnote.com) pin apps in the right sidebar of the Agent Workspace and make them available with the click of a button.
Instead of a long list of apps to scroll through, you can now have your most used apps availably with a colourful icon in the same menu as the intelligence panel, knowledge tab or user essentials view!
I only hope they'll allow Admins to preset these pins via Contextual Workspaces or the new Layout Builder too someday.


Speaking of [Contextual workspaces](https://support.zendesk.com/hc/en-us/articles/6257322050202-Announcing-Knowledge-search-settings-in-contextual-workspaces-?ref=internalnote.com), you can now set a default filter for the Knowledge tab. You can, for example filter the content shown to your support team to the General FAQ section, but give your Finance team a preset view on only the "Payment and Refunds" section of your Help Center. Or, if you have a Spanish and Italian group, you can create a workspace for each and show the content in their respective countries' locales.
### Talk Partner Ticket Events
Zendesk Talk is Zendesk's native solution for integrating calls into your Zendesk environment. Aside from this built-in option, you an also use third party solutions like Aircall, Ring central or Twilio to integrate your existing phone solution into Zendesk.
These solutions already had to option for a nice popup to handle call acceptance, decline and transfer and the integrations could log their metadata into internal notes in tickets.
Now, with these new functionalities, these platforms can show their data in a much richer way with an expandable view that contains duration, recordings and other data.
[Announcing new Talk Partner Edition functionalitiesAnnounced on Rollout starts Rollout ends August 25, 2023 September 19, 2023 September 19, 2023 Talk Partner Edition (TPE) is a collection of APIs that enables developers to connect Computer…Zendesk helpWidson Reis](https://support.zendesk.com/hc/en-us/articles/5968074861466?ref=internalnote.com)
## Webhooks
The new Webhooks features already allows for [user](https://internalnote.com/zendesk-user-events/), [article](https://internalnote.com/webhooks-for-guide/), groups, organisations and community posts alerts, as well as being notified via triggers or automations.
Zendesk has been gradually expanding the availably channels, and added [agent availability Events](https://support.zendesk.com/hc/en-us/articles/4408839108378?ref=internalnote.com) and [Custom Object Triggers](https://support.zendesk.com/hc/en-us/community/posts/6294555096602?ref=internalnote.com) to the list.
> **Why is Zendesk adding Agent Availability Webhooks?**
> Currently, many Zendesk customers and partners use the [Agent Availability APIs ](https://developer.zendesk.com/api-reference/agent-availability/introduction/?ref=internalnote.com)to monitor real-time agent information across Zendesk channels. Being able to subscribe webhooks to agent availability events eliminates the need for that constant manual monitoring, creating a pathway to more efficient and effective event-based applications and integrations. This new functionality also enables you to bypass API rate limits, making it more scalable for larger businesses.
Custom Object Triggers on the other hand allow you to update data in (external) systems based on interactions with Custom Objects in Zendesk by notifying them via a webhook. Whenever you solve a ticket from a customer with a Support Contract stored in Custom Objects, you could for example update their billing in Freshbooks. Or, like you'll read in my [Custom Objects](https://internalnote.com/plus) series, set ticket priority based on linking Custom Objects to user profiles and triggers.
## 🔐 Trust and security
The biggest announcement this month was the new [Advanced Data Privacy and Protection](https://www.zendesk.com/customer-data-privacy-protection/?ref=internalnote.com) add-on. This new addition to the Zendesk line-up expand on existing security platforms.
- The Audit Log that now shows configuration changes, gets expanded with a new **Access Log** that shows all agent interactions with users and tickets.
- **Ticket redaction** of credit cards, can now be expanded to redact dates, SSNs and any other type of metadata (powered by AI)
- Metadata can be **masked** from specific agents so not everyone can see email addresses, birth dates or other PII.
- Advanced **data retention** will allow you to setup complex rules to automatically delete tickets and users to comply with regional privacy legislation.
The Data Retention feature will also be made available in a more basic version to (all) Zendesk Suite users at a later date, but no specifics are available yet. Maybe in next week's What's New?
### Macro Suggestion Permissions
Enterprise customers who have access to custom roles can now make [macro suggestions](https://support.zendesk.com/hc/en-us/articles/6272150912410-Announcing-a-permissions-update-for-macro-suggestions-for-admins-Enterprise-only-?ref=internalnote.com) available to some or all administrators in their instance.
# 💡Insights
Two great support articles from Zendesk this time.
The first one offers an insight to all available JWT types in Zendesk, used to authenticate your end-users on [Messaging](https://internalnote.com/jwt-messaging/) or Guide.
[What are the different types of JWT proposed by Zendesk?Question I’m having trouble understanding all the JWT options proposed by Zendesk. What is each option used for? Answer Zendesk offers three different types of JWT, that each have a distinct purpos…Zendesk helpRemi](https://support.zendesk.com/hc/en-us/articles/6219127152794?ref=internalnote.com)
On the flip side, a less technical article that shows the operational differences between tickets, chat and messaging:
[Conversational styles in messagingMessaging, unlike live chat, allows you to have persistent conversations with your customers. One of the main benefits of this is that these conversations may adopt different conversational styles,…Zendesk helpRob Stack](https://support.zendesk.com/hc/en-us/articles/6088892450586?ref=internalnote.com)
# 🎥 Videos
#
# ⚠ Major Changes
## Twitter
Byebye birdie... here's the X Corp.
> Zendesk, therefore, is aligning with Twitter's rebrand from Twitter to X Corp. We understand the importance of staying in alignment with our partners' branding guidelines, and this update is a reflection of our dedication to excellence.
## Automatic activation of custom statuses
[Custom Statuses](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/), announced last year, will now be [enabled](https://support.zendesk.com/hc/en-us/articles/6203843149210-Announcing-automatic-activation-of-custom-ticket-statuses?ref=internalnote.com) by default for all users. This means your existing statuses will be converted to Status Categories, and you'll get the option to create variants for new, open, pending, on hold and solved.

If you don't use Custom Statuses, **you won't notice a change**. Zendesk will automatically update your triggers and reporting, and everything will keep working as before, but if you want, you can start adding custom statuses now, or after the feature gets auto-enabled.
# 📝 Articles this month
[Preview of the new Generative AI Bot for ZendeskDiscover the all new Generative Zendesk Bot powered by OpenAI in this article!Internal NoteThomas Verschoren](https://internalnote.com/quick-look-at-the-new-generative-ai-bot-for-zendesk/)
[➕ Automatically link incidents and problems in ZendeskWhen a crisis hits agents should focus on resolving problems and informing customers, not waste time on assigning and categorising incident tickets. This article shows you how to automate this flow!Internal NoteThomas Verschoren](https://internalnote.com/automatically-link-incidents-and-problems-in-zendesk/)
[Zendesk AI Keynote - A full overview of the new releasesDiscover all the new Zendesk releases from the AI Drop event on October 5th: Generative AI Bots, Intent management, new privacy and security tools and new AI features to increase agent efficiency.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-ai-drop-keynote/)
[➕How to build a VIP Alert app in Zendesk from scratchThis article contains a full tutorial on how to build a small Zendesk Support app that alerts your agents whenever they’re looking at a VIP ticket.Internal NoteThomas Verschoren](https://internalnote.com/vip-alert-app/)
# And finally...
Who says working with Zendesk can't be fun? If you want to find a good excuse to test the Zendesk Bot and Messaging on Mobile, you can now download a fun demo game built with the Unity SDK that can be linked to your Zendesk instance to test Bots and Messaging right on your phone!
[Zendesk SDK for Unity now has a demo gameAnnounced on Rollout starts October 17, 2023 October 17, 2023 We are excited to announce a demo game for you to see the Zendesk SDK for Unity in a real-life game and to be able to test your ow…Zendesk helpGofran Shakair](https://support.zendesk.com/hc/en-us/articles/6249260905754?ref=internalnote.com)

If you want to test it out yourself:
1. Install the app on your iPhone or Android Phone
2. Go to the Admin Panel > Channels > Messaging and add a new Channel
3. Choose the Android SDK and give it a useful name, like Unity or Demo Game
4. Go to the Installation Tab and copy the Channel ID key.
5. Paste the key in the configuration screen of the Demo App.
6. Play the game and/or test out your Bot.
### How to build a VIP Alert app in Zendesk from scratch
URL: https://internalnote.com/vip-alert-app/
Last updated: 2025-08-01T12:06:30.000Z
This article was inspired by a Community Post where a Zendesk customer asked about the best way to alert agents when a ticket requester is a VIP user.
People suggested tweaking the organisation name with an alert (🚨🚨🚨 Acme.Inc), change the subject to start with the word VIP via a trigger, dedicated views,.. there were many suggested solutions.
[Identifying a VIP Organization On The TicketWe have a need that I can’t imagine is unique to us: We need our agents to be able to quickly identify that an incoming ticket is from a VIP customer. Tagging the VIP orgnizations is an easy thing…Zendesk helpJay McCormack](https://support.zendesk.com/hc/en-us/community/posts/6137207769498/comments/6181921058074?ref=internalnote.com)
My suggestion was to leverage SLA by giving VIP users a higher priority or use the new [Essentials Card](https://internalnote.com/essentials-card/) ti highlight the VIP tag. A more advanced solution was building a dedicated app in Zendesk for this:
> ... and finally I would write a simple Zendesk app that looks at the current user and if they contain the tag VIP we show a popup top right.
>
> I wrote a quick version of the app, available here as a private app. You can find the latest version in the TMP folder.
> [https://github.com/verschoren/vip\_alerts](https://github.com/verschoren/vip%5Falerts?ref=internalnote.com)
My comment linked directly to the app, this article will explain how to build it.

You can download the application via this GitHub repository, or you can keep reading and build your own! (I would live to publish these apps directly on the marketplace as free apps, but my current employer contract limits this for understandable reasons)
[GitHub - verschoren/vip\_alertsContribute to verschoren/vip\_alerts development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/vip%5Falerts?ref=internalnote.com)
➕
This article is exclusive to [Internal Note Plus](https://internalnote.com/plus) subscribers.
# Requirements
Zendesk apps are written in HTML and Javascript and can be build and packaged via the ZCLI. To get started, you [need to install ZCLI](https://developer.zendesk.com/documentation/apps/getting-started/using-zcli/?ref=internalnote.com).
Once done, create a new folder for this project on your computer and open the folder in your terminal and run:
```bash
zcli apps:new
```
The script will ask for some information:

# The Code
After running the script you'll end up with these files:

## manifest.json
Our app can only be installed if we have a valid Manifest file in the bundle.
There's a few things we need to add to the default `manifest.json` file.
### Autohide
We need to add an `"autoHide": true` parameter to hide our app from agents and run it in the background.
```json
"location": {
"support": {
"ticket_sidebar": {
"url": "assets/iframe.html",
"flexible": true,
"autoHide": true
}
}
}
```
Second we need to add a few settings via a parameter array. We'll use these later in the apps' logic.
```json
"parameters": [
{
"name": "vip_tag",
"type": "text",
"required": true,
"default": "vip"
},
{
"name": "message",
"type": "text",
"required": true,
"default": "This user is a VIP!"
},
{
"name": "sticky",
"type": "checkbox"
}
]
```
## assets/iframe.html
As defined in the `manifest.json` file our will be a background app and won't be visible for agents, except for notifications, so the UI of the app will be non-existent and this file will be mostly empty.
Replace the content of `iframe.html` with the code below. Note that we link to `js/main.js` to store our logic.
```html
```
## js/main.js
Create a new file to store the apps' logic.
Anytime we need to use Zendesk information like the ticket requester, assignee or other, we need to ask this information in our code. This is done by making use of the [ZAF Framework](https://developer.zendesk.com/api-reference/apps/introduction/?ref=internalnote.com) and its `ZAF Client`.
The initial code looks like the snippet below. Since most `ZAF` functions run async, it's easiest to wrap the entire app in an async function itself.
```javascript
var client = ZAFClient.init();
init();
async function init() {
...
}
```
### Get the metadata
Our app has three settings stored in the manifest file:
- A `vip_tag` field that stores the tag used to recognise your vip users.
- A `message` field that stores the message shown to your agents.
- A `sticky` toggle that decides if the alert disappears (default) or not.
We can access these app settings by calling `client.metadata()` and then storing the three settings as variables. Note that we store a default value, in case the app settings are not configured correctly by the end-user.
```javascript
//Add the following inside the init() function:
var metadata = await client.metadata();
var vip_tag = metadata.settings.vip_tag != '' ? metadata.settings.vip_tag : 'vip';
var message = metadata.settings.message != '' ? metadata.settings.message : 'This user is a VIP';
var sticky = metadata.settings.sticky != '' ? metadata.settings.sticky : false;
```
Once we have our settings, we need the `tags` of the ticket requester. We can do this by calling `client.get` and retrieving the `ticket.requester` object.
Add the following to the init() function:
```javascript
// Add to the init() function:
var requester = await client.get('ticket.requester');
var tags = requester['ticket.requester'].tags;
```
Finally we can check if the requesters' tags include our `vip_tag`, and if so, we show an alert via `client.invoke()`. Note that we set the `sticky` parameter and `message` we stored in our settings.
```javascript
//Append to the init() function:
var isVIP = tags.includes(vip_tag);
if (isVIP){
client.invoke('notify', message, {sticky: persistent});
}
```
# Additional Files
## en.json
Zendesk apps can be translated. Ours currently only works in one default language but you can add others if you want.
To make the install experience nicer, we should also add our parameters to the `translations/en.json` file. This makes sure that the apps' settings during installation have a nice label and description.
```json
"parameters": {
"vip_tag": {
"label": "Tag used for VIP user",
"helpText": "Defaults to vip, can not be blank"
},
"message": {
"label": "Message to display",
"helpText": "Defaults to 'This user is a VIP!', can not be blank"
},
"sticky": {
"label": "Persistent alert",
"helpText": "Defaults to false"
}
}
```
## Assets
And finally, we need icons for our app. You can use mine below, or build your own. See requirements [here](https://developer.zendesk.com/documentation/apps/app-developer-guide/styling/?ref=internalnote.com).



logo.png, logo-small.png, logo.svg
# Installation process
To install the app we need to do a few things:
1. We need to run `zcli apps:package` to create a bundled version of the app. This created a zip file stored in a `tmp` folder inside your apps' main folder.
2. You can then upload this .zip file via the *Admin Panel > Apps and Integrations > Zendesk Support apps > Upload private app*
3. Once uploaded you can configure the app to your liking by setting the tag, message and persistence settings.
💡
Bonus Tip: if you want multiple alerts you can install this app more than once. Each app has its own settings, so you could create alerts for vip users, users with a tag member, or users with the tag "blocked".



# Agent Experience
To conclude, this is how our little app shows up for agents.
If they look at a ticket of a user with a VIP tag (or a checkbox VIP with an attached tag `vip`, an alert will appear top right!


### Preview of the new Generative AI Bot for Zendesk
URL: https://internalnote.com/quick-look-at-the-new-generative-ai-bot-for-zendesk/
Last updated: 2024-08-19T20:34:00.000Z
Zendesk AI was announced last April at [Relate 2023](https://internalnote.com/relate-2023/) and introduced us to Intents, Intelligent Triage and Generative AI for Agents. Powerful tools that made classification and routing of tickets to the right agent easy and automated. And the Generative AI options for agents allowed them to rephrase or tone shift their comments and get summaries of complex tickets at the click of a button.
Last week at the [AI Drop event](https://internalnote.com/zendesk-ai-drop-keynote/) Zendesk introduced a customer focusing expansion to Zendesk AI with their new Generative AI Bot. This new feature follows in the footsteps of existing players like [Ultimate](https://www.ultimate.ai/?utm%5Fsource=internalnote) and uses OpenAI to reply to customers with custom comments based on Knowledge Base articles, instead of *just* returning a carousel of links for the customer to click and read.
The feature is currently in [Early Access](https://support.zendesk.com/hc/en-us/articles/6138268212634-Using-Generative-replies-Generative-AI-EAP-?ref=internalnote.com#topic%5Fg53%5Fmlp%5Fzyb), but if you use Zendesk AI you can sign up and test it out now. And that's exactly what I did. So let's dive in for an overview of the new Generative Zendesk Bot features!
# Overview
The classic Zendesk Answer Bot, and now Zendesk Bot has always had the ability to search the Help Center and return three matching articles to the end-user as a way to offer quick solutions to a customers question.
With Zendesk AI the bot now doesn't only rely on Search to return the articles, but will parse the customers' question and turn it into an intent that gets mapped against either custom flows you build in the Zendesk Bot, or returns three Knowledge Base articles that best match the inquiry and intent.
Like *Lisa Kant* mentioned during the Zendesk AI Drop, the **best** way to handle a question might still be a custom flow with your own nuances and process tightly linked to the customer experiences. But since it is impossible to create a custom flow for every intent, the fallback is returning matching Knowledge Base articles to the customer. This has the benefit that you leverage your existing Knowledge Base content, while making it scalable to handle all intents and inquiries, instead of just replying with the ones you build in a custom flow.

However, asking the customer to read an entire article to get an answer might not be the best experience. Good technical articles offer not only a how, but also include a why and might cover a broader topic than the exact issue the customer has. This means their solution is often buried in paragraph 4, or might even be pieced together from multiple pieces of an article.
In the classic approach the customer needs to read one or more proposed articles and might even glance over the solution or give up all together, resulting in a bit of frustration on their end, and agents replying with the solution, often quoting the offered articles verbatim.
This is where the new Generative AI option comes in. Instead of replying with a link to articles, the Zendesk Bot will take your existing Knowledge Base, and return a custom reply to the customer based on the contents of that article. That reply might be pieced together from multiple sentences in the article, or might even be a fully restructured reply. The customer is given a custom reply that fits their intent and context, without the effort of needing to read the entire article themselves.
I can only assume this will lead to better and faster self service resolutions.

## How does it work
### Data Source
One of the main caveats when using tools like OpenAI to generate replies to your customers is the trustworthiness of the replies and the sources it uses to generate those replies.
To refer back to a quote from Mark Zuckerberg:
> Yeah, so our view is that there’s actually going to be a lot of these that people talk to you for different things. \[...\] let’s say you’re a small business and you want to have an AI that can help you interface with customers to do sales and support. You want to be pretty confident that your AI isn’t going to be promoting your competitor’s products, right?"
The Generative Bot uses your existing Knowledge Base as a data source, and combines this with the Zendesk AI models generated based on the wealth of customer care data inside the Zendesk platform. This means you get the benefit of a model that knows how to talk CX, knows your industry and understands customer inquiries, while only leveraging your own Knowledge Base to respond to customers.
Naturally this means that if your Knowledge Base is sparse, you won't get a lot of benefit out of this solution. But the same applies for your Help Center or the classic Zendesk Bot or Auto Reply, they all need a good Knowledge Base to function.
💡
I use Knowledge Base and Help Center as two distinct elements inside of Zendesk. The Knowledge Base is your database of articles, where the Help Center is one of your customer channels, namely the website where your users can search, browse or read the articles you've written.
Auto Reply and the Zendesk Bot are two other interfaces your users might use to interact with your knowledge base, the former via email replies that link to specific articles, the latter by offering articles or summaries of articles to customers.
## Enabling the feature

By default Zendesk will always try to match the customer intent with a custom flow you built yourself. If the bot cannot match a flow, it will fall back to searching your Help Center.
When articles are found, you can use *Admin Center > Channels > Bots and Automations > \[Your Bot\] > Edit* to select *Generate a Reply* instead of *Recommend Articles.* This will trigger the generate response instead of just listing article links.

There are however other scenario's where the generative feature also applies:
- Starting a conversation
- Replying with more than one possible flow to pick
- Replying when no custom flows or articles are found
In each of these scenario's you still write your own response "e.g. I'm sorry I wasn't able to find a solution, could you rephrase your question?" but you can opt to have Zendesk generate variations of that sentence based on customer context. This way the responses feel more personal, and less like the same error message each time.
## Persona

Hidden under the Settings option of your Bot you can find the bot persona feature under the list of linked channels. This feature allows you to tweak the tone of voice of your bot from being professional, just friendly, or very playful. Useful to adapt the bot to your type of company and to fit your branding.
I've chosen a Friendly version for mine, but to each their own!
# Intent optimalisation

Like we've seen above the bot will first try to reply with a custom flow, and if no matches are found, will generate a reply based on articles. But in that description on how it works I ignored one major feature: the new Intent Mapping dashboard.
This dashboard shows a list of all intents matched to user conversations. You can filter this to the last x days, or filter by Category or Answer Type.
For each intent you can decide between:
- Select a specific custom flow to use
- Generate a reply
- Don't generate a reply (use the default behaviour of replying with articles)
This allows you to tweak the way the bot interacts on an ongoing basis. Badly matched intents can be tweaked to link to the right flow, or you can decide to leave specific intents to be handled by agents and never to be touched by the AI.
💡
This same dashboard is also useful to detect intents customers trigger a lot, but are not covered by either your Help Center or your custom flows. I recommend combining this dashboard with Explore to do a weekly/monthly check of the top ten (and bottom ten) to optimise your flows and detect gaps in your Knowledge Base.
# Let's test this out!
Enough theory, let's try this thing out.
My Demo Help Center contains an article about [Evacuation Jurassic Park](https://support.internalnote.com/hc/en-us/articles/10794003307282?ref=internalnote.com), as part of my full tutorial on Building a Zendesk Bot.
[Learn how to build a full-featured Flow Builder Bot for Zendesk.In this article we will build a full-featured Flow Builder Bot for Zendesk. We’ll use every step type, use API calls and variables and show you how to create a bot yourself in a full length video tutorial.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-dinosaurs/)
Let's see if we can trigger this article by talking to our bot, after enabling the Generative AI features.
When a customer goes to [our website](https://proactive.internalnote.com/product.html?utm%5Fcampaign=trex&ref=internalnote.com) we load the Zendesk widget and use the proactive features to load the Jurassic Park intent. This already is a best case scenario cause we drop the customer immediately in an intent.
However, I don't want to navigate a bot and click buttons, so I just write my question in the comment field:
> What do I do during an evacuation?

The Bot replies with three dancing dots, and a few moments later (took a bit too long for my taste) it replied with a short overview of what I need to do, taken from the article.

So yeah, that works, out of the box, without training or complex setups 😅 Easy!
# Conclusion
So, here we are, six months after the introduction of Zendesk AI, and a year after OpenAI took the world with ChatGPT.
Zendesk leveraged their experience and data to build a CX platform that leverages AI to improve not only the Agents experience, but offer, in my opinion, a better experience for customers too.
The Zendesk Bot offers quality information written by the company you're contacting in a digestible form that reads easily, and removes the effort of reading an entire article myself. I like it.
What's missing? I'd love to be able to leverage [Federated Search](https://internalnote.com/federated-search/) to also included content indexed from other sources like the website or webshop. Or to have a Generative AI step inside of Flow Builder so I can use the generated replies in the "Show Articles step" instead of linking to articles in a carousel.
From a setup standpoint, it feels the Zendesk Bot UI is becoming a bit cluttered with both an Edit and Settings menu, and all settings split over Setup, Intents and Answers tabs with multiple collapsable elements within each tab. I'd rather have one interface that groups all bot settings in one tabbed interface instead of spreading the elements across multiple tabs and pages.
🗒️
The information in this article is based on the EAP as available today. Features and experiences might change before the tool goes live. I've asked permission from Zendesk to write about the EAP publicly.
### Automatically link incidents and problems in Zendesk
URL: https://internalnote.com/automatically-link-incidents-and-problems-in-zendesk/
Last updated: 2025-09-08T06:42:12.000Z
Customer Service desk experience two types of tickets: some are one offs, unique tickets that can be handled on a 1:1 basis. The other type are a wave of similar tickets created because something broke, changed or got disrupted.
Both scenario's can and should be handled by a good self service flow. A customer who forgot their password should easily find the article explaining the password reset procedure, and your bot should offer this article in return to any inquiry about loss passwords.
But sometimes something bigger breaks. A ship blocks a canal and all your deliveries are delayed. Your authentication platform experiences downtime and no customers can login. These kind of events often trigger a long list of tickets related to the issue, and since these issues are structural, they can't easily be solved at once.
This is where the Problem and Incident feature of Zendesk comes to the rescue. The Problem tickets option allows you to create a single parent ticket (e.g. "Authentication issues") and link all tickets from customers reporting the issue as incidents under that one main ticket.
Any update you do to the main ticket (e.g. "we expect to resolve this issue within the next hour) will get send to all customers, and you can get a clear insight in how many customers reported the issue, and more important, are still experiencing issues after the main event has been resolved.
➕
This article is available to both regular and [Plus](https://internalnote.com/plus) subscribers
# Classic Approach
In any normal Zendesk setup your approach might be similar to this:
1. You notice a lot of tickets about the same issue
2. An agent creates a Problem Ticket and starts linking Incidents to it
3. You create a Help Center article that explains the issue in order to start deflecting tickets
4. You keep linking new tickets to the problem
5. You update the article with the latest information
6. You keep linking new tickets to the problem
7. You resolve the issue
8. You keep linking new tickets to the problem
9. You solve all tickets by sending out a final reply
10. You update the article with a post mortem.
This is a pretty good approach to deflect, monitor and report on these kind of events, but you notice that there is one step that gets repeated a lot: linking tickets to the problem ticket.
A manual step that is repeated throughout the event, takes time away from agents and should be automated so that agents only spend time on either updating the problem ticket, or all tickets not related to the event.
Every time an agent manually handles the incidents tickets is a waste of time that should be spend on other things.
# How do we fix this?
As you'd probably guesses, this article defines a problem, and will offer a solution. The next steps will explain you how to automatically link incidents to a specific problem without agent intervention and by leveraging your end-users.
The approach shown in the movie above automates the entire incident-problem assignment.
End-users are presented with a dropdown in the webform that asks them what the issue is about. The movie above shows a traditional webform, but naturally this also works in the Messaging Widget via an *ask for details* step that presents the same field.
Once the ticket is created we have a trigger that reads the chosen problem and uses that to update the ticket by setting the chosen problem as the problem\_id linked to that ticket. We also turn the ticket into a Ticket Type *incident*.
The magic step is that our dropdown of problems is structured as follows:
| Value | Tag | Comment |
| -------------- | ------------ | ---------------------- |
| Shipment Delay | 100 | ID of a problem ticket |
| Login Issue | 101 | ID of a problem ticket |
| Other issue | other\_issue | Fallback |
So without any agent intervention, by making the end-users select a predefined list of active problems, we automatically sort all incoming tickets to the right problem.
# The Setup
## A Problem Ticket
To test and validate this flow it's easiest if you create a problem ticket in Zendesk. While doing so, it's the perfect moment to also test out the new pinned articles feature that will hardline related articles to a specific ticket so they always appear in the knowledge panel.
Note down the `id` of your problem ticket.


## The Custom Field
Create a dropdown field in Zendesk. Make sure end-users can edit the field, and create an initial set of dropdown options.
Set the `tag` of the Field value to the `id` of the problem ticket you created above.
To make this field usable in other scenario's too, it's best to add an *Other* option, or predefine a set list of issues you see a lot, so this field works for both one-off issues and real problem scenarios.
Add the ticket to your Ticket Form and note down it's `id`


## A webhook
If you've already build an update ticket [webhook](https://support.zendesk.com/hc/en-us/articles/4408839108378-Creating-webhooks?ref=internalnote.com) you can re-use that one.
[Webhooks for User and Organisation eventsZendesk recently launched an expansion on their webhooks functionality that allows you to subscribe to changes in Users and Organizations and act upon those actions. In this article we’ll show how you can auto-complete agent profiles with a signature, alias and profile image upon creation.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-user-events/)
- Name: Update Ticket
- Endpoint: `https://subdomain.zendesk.com/api/v2/tickets/{{ticket.id}}.json`
- Request Method: PUT
- Request Format: JSON
- Authentication: Basic Authentication
- Username: `admin@domain.com/token`
- Password: a Zendesk API token

# The trigger
This trigger is the core of the entire process.
Create a new trigger with the following setup:
- **Meet ALL of the following conditions:**
- *Ticket > type* is not *incident* (this make sure the trigger only runs once)
- *Ticket > problem list* is *present*
- *Ticket > problem list* is not *other* (we only want to update tickets that are actual problems)
- **Actions**
- Notify By > Active Webhook > Update Ticket
and set the following payload (update the IDs to match your custom field)
```javascript
{
"ticket": {
"problem_id": {{ticket.ticket_field_13900870154002}},
"type": "incident"
}
}
```
💡
Since we use value of the dropdown in the JSON payload of the webhook we can assign to **any* ticket without the need to update this trigger once it's set. And no matter if the dropdown has 1, 10 or a 100 values we only need a single trigger to make this flow work, making our setup a lot easier to maintain.


# Let's put this in practice.
With the above in place we can update the 10 steps at the start of the article as follows:
1. You notice a lot of tickets about the same issue
2. An admin or team lead creates a Problem Ticket and adds its ID to the *Problem list* custom field
3. You create a Help Center article that explains the issue in order to start deflecting tickets
4. You update the article with the latest information
5. You resolve the issue
6. You solve all tickets by sending out a final reply
7. You update the article with a post mortem.
As you see we remove the need for manually updating and linking incidents, greatly speeding up the process.



# To conclude...

#### Problem Viewer Pro
Did you know I build an app to give more insights in Problems together with my team at Premium Plus?
[View on the Zendesk Marketplace](https://www.zendesk.com/marketplace/apps/support/946380/problem-viewer-pro/?ref=internalnote.com)
### Zendesk AI Keynote - A full overview of the new releases
URL: https://internalnote.com/zendesk-ai-drop-keynote/
Last updated: 2023-10-09T11:03:42.000Z
Zendesk held a product launch event today. Streamed live from New York, they announced a lot of exiting new features under the title *The Next Big Zendesk AI Drop.*
I didn't really know [what to expect](https://internalnote.com/zendesk-roundup-for-september-2023) from this event. Calling it the next BIG thing, made me think they had to have a card up their sleeve that was more than just more intents, agent tools or additional insights based on OpenAI.
And well, it seems my gut feeling was right cause they did announce a major new feature: A fully Generative AI-driven Zendesk Bot that takes your existing Help Center content and turns it into a conversation. 🤯
---
A few days ago I listened to an interview with [Mark Zuckerberg on The Verge](https://www.youtube.com/watch?v=9aCg7jH4S1w&ref=internalnote.com) where halfway through the conversation he said something quite interesting:
> Yeah, so our view is that there’s actually going to be a lot of these that people talk to you for different things. \[...\] let’s say you’re a small business and you want to have an AI that can help you interface with customers to do sales and support. You want to be pretty confident that your AI isn’t going to be promoting your competitor’s products, right?"
And that last sentence is exactly what Zendesk delivers here. Customers can converse with your bot, the data it uses is solely pulled from your Help Center content, but it's powered by OpenAI and the powerful AI models Zendesk trained on their 8 billion tickets.
Can't wait to get my hands on this one, especially since it comes with tone of voice built-in!
Let's dive in!

#### Internal Note Plus
Want to receive this and more Zendesk content in your inbox? Subscribe for free, or choose the Plus plan for even more insights!
[Subscribe today](https://internalnote.com/plus/)

## Introduction
Tom Eggemeier
# Welcome session
*Good Morning!* With an intro that had very strong Tim Cook vibes, CEO Tom Eggemeier started off the keynote and set the scene for the rest of the event.
He focussed on how AI makes us rethink how to approach CX, and the impact of Zendesk AI on their customers. Liberty London saw a 73% decrease in first reply time, and shared a story of an *unnamed* entertainment company that saw a 10% reduction on incoming tickets on day one of turning on Zendesk AI.
Not bad 🥳
After focussing on a few core concepts like the way Zendesk makes it easy to make your entire business better by offering solutions for customers and employees alike, he passed the stage to the product announcements.

## Zendesk AI
The biggest chapter of this keynote was the new Generative AI announcements, as shared by Lisa Kant together with Candace Marshall, both from the Product Solutions and Marketing team.
They gave context to the new releases by focussing on three big topics: Lend agents an extra hand, upgrading the Zendesk Bot experience and offering new customisation options for bots and intents for both customers and employees.
[Zendesk Generative AI EAP capabilities overviewNote: The capabilities described in this article are part of an early access program, and are free of charge to approved users during the program. When the EAP ends, there may be additional add-on…Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/6115911331226-Zendesk-Generative-AI-capabilities-overview?ref=internalnote.com)

## Agent Productivity
Level up agents to resolve requests faster and more consistently
The Agent Productivity section of the new announcements felt a bit like a rehash of the previews we got at [Relate 2023](https://internalnote.com/relate-2023/) with a few additional niceties thrown in the mix but with a focus on the fact that this improves the quality of life for your agents, improves agent retention rates and a hard focus on the fact that the role of agents will ***not*** go away*.*
Zendesk isn't reinventing their product with the new Zendesk AI for Agents releases. It's the same Agent Workspace we already know, but with some ✨ *magic fairy dust* 🪄 sprinkled here and there to surface additional context to agents, or make their life easier. It's subtle, but the added features do offer a lot of small benefits that, combined, do save agents a lot of time per ticket in the aggregate.

## Generative AI for Agents (EAP)
We already got a preview of this one at Relate last April, but it's still a rock solid, addition to your agents' toolkit.
The Generative AI features allows agents to Expand or Tone Shift their comments before sending it to the customer. Or in other words, it takes an existing comment and rewrites it with additional context from the conversation, or changes the tone to be more serious or friendly with the click of a button.
> I've been using this one for a while now, and it literally changes how I reply to the easy questions:
>
> 1\. Use a macro that says "*Hey, thanks for your email, to get your issue sorted...*" and puts the ticket on pending/solved
> 2\. Open the Knowledge Panel via `ctrl+alt+k`
> 3\. Select the right article and paste the URL into the comment
> 4\. Select a useful paragraph and append it to the comment via the ... dropdown
> 5\. Press Expand in the Enhance Writing menu in the comment field
>
> And boom, my badly copy-pasted job of a reply turns into a nicely formatted email with context and the right sentiment. Time to reply: seconds. (It also works nicely to turn my terrible French replies into good ones 😇)
[Using AI to summarize and enhance ticket comments (EAP)Note: The summarization and enhancing features are currently available in an early access program (EAP). You can sign up for the EAP here. You must have Agent Workspace activated to…Zendesk helpErin O’Callaghan](https://support.zendesk.com/hc/en-us/articles/5608712782362-Using-AI-to-summarize-and-enhance-ticket-comments-EAP-?ref=internalnote.com)
## Similar Tickets (EAP)
The next release is a new feature for the Intelligence panel. We already got contextual information like sentiment, intent, language. The summary block offers anyone who looks at the ticket a short overview of the conversation. And the suggested macros offer the right macros for the ticket.
💡
Zendesk change the summary format from a paragraph of text to a bulletlist of short items. I really like this small change, it reads a lot easier at a glance.
New this time is an additional tab that surfaces Similar Tickets to the agents. It reminds me of the [Related Tickets](https://www.zendesk.com/marketplace/apps/support/5131/show-related-tickets/?ref=internalnote.com) app of old, but this new feature is powered by the new Intent engine and doesn't only rely on keywords or matched phrases like the old one does.
So whenever an agent gets a ticket routed to them, the Intelligence Panel will now surface related solved or closed tickets for them. They can check out how the issue was resolved there, maybe copy over some troubleshooting steps, and get to a resolution quicker.
This combined with the Macro Suggestions for Admins will make solving and surfacing recurring issues a lot easier!
[Viewing similar tickets in Intelligence (EAP)Attention: The similar tickets feature is currently in an early access program (EAP). To participate, you must: Sign up for the EAP. Have the Advanced AI add-on. Turn on the inte…Zendesk helpErin O’Callaghan](https://support.zendesk.com/hc/en-us/articles/6154115110170?ref=internalnote.com)

## Generative AI for Voice
To conclude the Agent section of the announcement, Zendesk Voice (Talk?) also got some love. Scheduled for November, Zendesk will generate a transcript and summary and intent/sentiment analysis of every phone call (if you've got recordings enabled)
I assume this is powered by [Whisper](https://openai.com/research/whisper?ref=internalnote.com), and will make it a lot easier to escalate incoming conversations to second line, or to capture the nuances of a phone conversation in a ticket.
Kinda makes me wish for a Zendesk Voicemail that turns voicemails messages into written tickets and drops the entire *Talk to* someone *in real time* part of a phone call 😅.

## Bots and Automation
Scale self-service with less effort and create more natural conversations
The core of Zendesk's self-service and ticket deflection strategy has always been your Help Center articles . Even before Zendesk AI it powered your Help Center, they got included in Answer Bot as articles offered to the customer in response to a email or chat conversation, and they show up in the Knowledge Panel right next to tickets in the Agent workspace.
So the logical next step is to use that treasure trove of knowledge and apply it to your bot conversations. Instead of *just* offering the customer a list of articles based on their inquiry, Zendesk will now leverage your content to have an actual bot converse with your customers and offer them replies, just like your agents would.
## Generative Replies for Bots (EAP)
To refer back to the Zuckerberg quote at the top of this article: the main difference between this bot and eg ChatGPT is that this bot generates answers based on **your** Help Center content, and no external resources.
The new generated answers are available whenever you have no custom build Zendesk Bot flow, or when you map specific intents to the Generate Answers flow. So whenever the customer asks a question that you don't handle explicitly in a real flow, the bot will step in and offer an article summary in response. This way you don't need to build a custom flow for every intent, but can still give special attention to your most important flows.

By using generative AI, the Zendesk Bot now allows for a more human like conversation experience with the additional benefit that it can quote *that* specific paragraph of information to your customers, instead of just returning a long article.
The replies of the bot are usually a short (\~100 words) long summary of the article with a link to the entire article. The answer is always followed up by a '*was this helpful - yes/no* step.
[Using Generative replies (Generative AI EAP)Note: The capabilities described in this article are part of an early access program, and are free of charge to approved users during the program. When the EAP ends, there m…Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/6138268212634?ref=internalnote.com)
## Bot Persona (EAP)

Alongside the new Generative Bot answers, Zendesk also introduced Bot persona. This feature allows you to tweak the tone of voice of your bot to align with your company. You can have a professional, friendly or casual voice for the generated replies. This not only allows you to make sure the bot sounds like your company, but is also consistently applied to all automated messages generated by Zendesk within the bot.
## Intent Suggestions for Bots
And finally, the last big Zendesk Bot related release is a new dashboard in the Admin Center that shows you an overview of the Intents triggered by customers. For each intent you can see the parent category, the frequency its been triggers, and the ability to map each intent to a specific custom build Answer, o the new Generated Answers via Zendesk AI.

Since this new screen is available for a few days now I've already explored it a bit and this seems like a very useful tool to use for a weekly or monthly review. Just open this view, filter to only see Intents that have been triggers a lot without an assigned answer, and then make sure to either map to the right answer or create a new one. And then also go over the top 20 intents and make sure they are all still mapped correctly. In other words, this offers an easy way to keep your intents and answers up to date, and make sure the most popular requests get mapped and routed correctly.
💡
I'm a big proponent of the "check your Help Center stats weekly and make sure the top 10 unanswered ****and** answered intents and their related articles are reviewed" approach of maintaining a good self service offering.

## Zendesk AI for Admins
Drive intelligent workflows based on your business needs
Although Zendesk reorganised their product in to "Meaningful connections", "Scalable service offerings", "Flexible change" as the three main pillars, I always like to think of the product as customer-agent-company. Customer is omnichannel, proactive bots, self service,... Agent is the Agent workspace, providing context, make work easier, and Company means insights, processes and integrations.
It might be an old way of thinking but for me it structures the way I build a Zendesk instance and "see" a ticket move from customer all the way to reporting.
So where the first two parts of the announcement where focussed on Customers and Agents, this third one is focussed on the backend: admins and team leaders.
## AI for the Knowledge base
The Zendesk Help Center got a big upgrade already this summer with the introduction of [Semantic Search](https://support.zendesk.com/hc/en-us/articles/5633225532826-About-semantic-search-and-how-it-works?ref=internalnote.com), replacing the old search engine with a more modern (and better working) version.
Today's update doesn't focus on the end-user experience however, but introduces Zendesk AI into the article editor.
Similar to how agents can expand and tone-shift their comments, Zendesk Guide got that same fairy dust 🪄 and you can now select articles or paragraphs and rewrite them with AI. Or you can turn a bullet list of topics into a cohesive and well written article.
I'm still waiting for the next penny to drop however: take the content agent write and turn them into full Help Center article suggestions, similar to how the Macro suggestions now work. Not today, but maybe the next AI drop?
## Custom Intents


And finally, to conclude the Zendesk AI section of the presentation, Zendesk announced some powerful new additions to the Intelligent Triage and intents feature with an upcoming ability to edit or translate the predefined list of intents to better match the language and terms used in your company.
Zendesk also previewed the availability of custom intents and custom intent models in the future, so there's more to come in the future.
### Zendesk AI for HR and IT
Zendesk isn't just for customers. With the new Intents for HR and IT companies can leverage Zendesk AI to make sure employee questions are routed to the right team. This can be combined with existing features like Private Groups to make sure that sensitive tickets are one visible to a select group of people.

## Advanced Data Privacy & Protection
Safe. Secure. Responsible
> Leading the way with new AI trust and privacy standards
At Relate 2023 Zendesk had this awesome quote on their slides. And now, half a year later, that concept is turned into a new SKU in their line-up: the Zendesk Advanced Data Privacy & Protection Add-On.
This add-ons makes a lot of security features available to companies that every company *should* have, but not every company needs.
It offers solutions for four elements: Automate what data you show and keep, identify and prevent risks, choose how you encrypt data, responsible AI.
### **Access log**
Existing Zendesk Enterprise users already have access to an Audit log that keeps track of changes in their instance. This new Access Log feature expands that idea with a list of which agent viewed which data in the instance.
### Data retention policies
Soon every Zendesk customer will get access to an automated deletion feature for unused data. The default version will have a few parameters to tweak the deletion behaviour. Users who buy the add-on will get a very granular way of managing their deletion and retention policies.
💡
If you're really interested in managing deletions, take a look at the [GDPR Marketplace app](https://www.zendesk.com/marketplace/apps/support/206749/gdpr-search--destroy/https://sparkly.dev?utm%5Fsource=internalnote&utm%5Fcampaign=aidrop) from [Sparkly](https://sparkly.dev/?utm%5Fsource=internalnote&utm%5Fcampaign=aidrop).
### Advanced redaction
Easily remove personally identifiable information (PII) like email, name, and bank number from customer conversations automatically and in bulk, expanding the existing credit card-only redaction feature available in Zendesk Suite Growth or higher.
### Data Masking
Filter sensitive data in Zendesk by hiding it from (specific) agents. For example: not every employee needs to see a customers' data of birth or email address to resolve inquiries.
### Advanced Encryption
This is a big one. Some companies require, for policy or regulatory reasons the ability to encrypt their Zendesk instance with a key that **only they** control. If you fall into this category: this add-on is for you!

## Conclusion
This was quite the event, and I really hope I can one day visit one in person. Was I there only one who had very strong Apple Keynote vibes from this event?
In April I was a bit skeptical about paying 50$ per agent per month for Advanced AI. The features released were cool, especially on the Agent Workspace side with the expand and intent triage options, but the self service side felt a bit lean to me since it *only* added automated intent mapping.
Now, half a year later, this event feels like an Act II that adds a lot of missing pieces and makes the entire idea of an AI add-on worth while. The automated intent mapping combined with Generative AI makes it possible to empower an entire new Zendesk Bot experience that will change the way customers interact with your Self Service offerings.
As always, there's still stuff I'd like to have seen like automated replies via email, an API endpoint for developers or custom intents, but that's for a next time!
From a production standpoint, I really like these new Zendesk events. They're fast paced, high production quality and interesting to watch.
Zendesk itself has really picked up the pace in adding new features to their product. This blog, if you allow for some self promotion, is a testament of that. My Monthly Roundups are often quite long articles, and the Zendesk release notes often give inspiration for weeks of content.
So, what's next? For me it's getting access to the new features and EAPs and start testing them out.
See you at Relate in Vegas next spring?
## Sign up for Internal Note
A blog about Zendesk with a focus on development and the Sunshine platform.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Zendesk Roundup for September 2023
URL: https://internalnote.com/zendesk-roundup-for-september-2023/
Last updated: 2023-10-10T19:19:35.000Z
Welcome to fall. The season where trees drop their leaves, Apple releases a new iPhone, and Zendesk teases a new Zendesk AI drop for later this week.
I'm really curious about what they are going to announce. Will we finally see some Generative AI features in the Zendesk Bot? Or will it be expanding on what they already have with more industries, better intent analysis and the general availability of their agent comment expand/shift tone feature?
[The Next Big Zendesk AI DropGet the latest news and announcements on Zendesk AI, including new generative AI capabilities and what it means for CX, EX, and data security. Register now to secure your virtual seat for a major upgrade in customer experience. Broadcast live from New York City.This is a global event with three broa…Openform](https://event.zendesk.com/productlaunch-broadcast1/instapage?utm%5Fsource=website&utm%5Fmedium=blog&utm%5Fcampaign=NYDigLaunchEvent23&%5Fga=2.71159376.1322328706.1695978079-1883811584.1695978079)
I’ll post a full recap of the event later this week, so go subscribe if you haven’t yet.
➕
To celebrate the occasion I’m doing a 10% promotion for [Internal Note Plus](https://internalnote.com/zendesk-ai-drop-promo).
What’s Internal Note Plus? It’s a new way to subscribe to this blog and get even more content: more articles, previews of new Zendesk features, more in-depth tutorials and more to come!
[Check it out!](https://internalnote.com/plus)
# 🎉 New Releases
## 🤖 AI Powered Conversational Experiences
Zendesk Messaging got a few nice new releases this month.
First one is a feature that many people requested: Messaging First Time Reply and Next Reply SLA metrics are now finally [available](https://support.zendesk.com/hc/en-us/articles/6146050447642-Announcing-an-upcoming-enhancement-to-reply-time-SLAs-for-Messaging?ref=internalnote.com).
> Understanding the crucial role that timely responses play in superb customer service, we've introduced First Reply Time and Next Reply Time SLAs for messaging to help ensure your customers are receiving the prompt attention they deserve.
Secondly, we finally got an ETA for making [Messaging authentication data](https://internalnote.com/deepdive-into-messaging-profiles/) visible in the Agent Workspace.
> *Hi everyone,*
> *Posting an update on surfacing email address, provided in authentication API, on Agent Workspace. We are targeting Nov to support this enhancement. With this change, external Id, email or a combination of both can be used to uniquely identify your users.*
> *I will provide more updates closer to the rollout date.*
> *\- Prakruti*
> *[View the comment](https://support.zendesk.com/hc/en-us/articles/4411666638746/comments/6144042599706?ref=internalnote.com#comment%5F6144042599706)*
Zendesk AI also got a new model for the Insurance industry, and the existing retail, software and finance models got updated.
And social interactions over messaging or tickets (e.g. a Facebook post or Twitter mention) will now also see intents, sentiment and language predictions in the Intelligence Panel.
So all in all, not the biggest releases this month, but we got to remove some stuff from the [wishlist](https://internalnote.com/zendesk-wishlist/), which is always nice!
## 🔎 Help Center and Self Service
Only one update this month for the Help Center.
Zendesk moved the attachments to the new Media Gallery, where they now live alongside your images in one central place.
> You can access the media gallery from the Attachments section in article settings. From there, you can view or delete media attached to the article, or click Manage attachments to open the media gallery, where you can view, upload, attach or replace media.
[Announcing managing article attachments in the media galleryAnnounced on Rollout starts Rollout ends August 29, 2023 August 29, 2023 September 1 We are excited to announce that you can now manage all your article attachments in the Guide media gallery.…Zendesk helpKatarzyna Karpinska](https://support.zendesk.com/hc/en-us/articles/6082810582682-Announcing-managing-article-attachments-in-the-media-gallery?ref=internalnote.com)
## 🧱 Open and Flexible Platform
### The new Custom Objects
[Announcing the general availability of custom objectsAnnounced on Rollout starts Rollout ends September 26, 2023 September 26, 2023 September 26, 2023 Zendesk is pleased to announce a new and improved, no-code-required custom objects experience.…Zendesk helpAshwin Raju](https://support.zendesk.com/hc/en-us/articles/6172392000282-Announcing-the-general-availability-of-custom-objects?ref=internalnote.com)
> Zendesk is pleased to announce a new and improved, no-code-required custom objects experience.
One small sentence that opens up a WORLD of possibilities in Zendesk. I'm still working on a full overview of this new release, so stay tuned!
### New View limits!
A huge win for some, or a potential for even more cluttered interfaces. But however you see it, this new release allows you to add 30 shared and 10 personal views to your agents' workspace, compared to the old limit of 12 views.
## 🔐 Trust and security
### Admin Insights
Admins can now see agent created Macro's in the Admin Center. This follows last months release of them being made available via API. This change is available in Admin Center on the Macros page, where a new item, “Individual Agents” appears in the availability drop-down.
Similarly admins can now see all dashboards in Explore. Previously dashboards created by other users would not be visible to admins unless explicitly shared with them.
All theses small changes back to back makes me think someone at Zendesk is going through every API/feature and checking permission and visibility levels. 😅
### Deploying triggers from sandbox and production
> Zendesk is delighted to announce the general availability of deploying trigger configuration changes from a premium sandbox directly to your production instance. As a bonus, we're announcing a closed beta for deploying automations, too.
I think [this](https://support.zendesk.com/hc/en-us/articles/6171920920986-Announcing-the-ability-to-deploy-triggers-and-automations-from-premium-sandboxes-to-production?ref=internalnote.com) counts as another *finally?*
### Redaction in Child Tickets
It's now [possible](https://www.google.com/search?client=safari&rls=en&q=Announcing+redaction+in+side+conversation+child+tickets+Announced+on+Rollout+starts+Rollout+ends+September+8%2C+2023+September+8%2C+2023+September+15%2C+2023+In+side+conversation+child+tickets%2C+agents+now+have+the+ability+to+redact+side+conversations+whe%E2%80%A6+https%3A%2F%2Fsupport.zendesk.com%2Fhc%2Fen-us%2Farticles%2F6127124747034-Announcing-redaction-in-side-conversation-child-tickets&ie=UTF-8&oe=UTF-8&ref=internalnote.com) to redact attachments and comments in child tickets.
> Important: Redaction is still not propagated through each instance of the side conversation, so agents need to redact in both places, the parent and the child ticket, if they want the information removed from both.
# ⚒️ EAPs
## Auto-accept for messaging and live chat
> Auto-accept functionality automatically assigns messaging and live chat conversations and end-user queries to specified agents in the Agent Workspace. With this feature, agent capacity utilization will always be at maximum.
[Sign up for the EAP here](https://docs.google.com/forms/d/e/1FAIpQLSdQFkW3xVE7YS5NqyUGChe1paL4s46xPo3M0fIi%5FJKD7ddULw/viewform?ref=internalnote.com).
# ⚠ Major Changes
### Update trigger logic
With the release of Custom Objects v2 Zendesk also reworked the structure of their trigger conditions.
[Announcing changes to the trigger conditions and actions drop-down menusAnnounced on Rollout starts Rollout ends September 26, 2023 September 26, 2023 September 26, 2023 Zendesk is pleased to announce enhancements to trigger conditions and actions. What’s changing…Zendesk helpShishir Sharma](https://support.zendesk.com/hc/en-us/articles/6179959078170-Announcing-changes-to-the-trigger-conditions-and-actions-drop-down-menus?ref=internalnote.com)
For conditions, the options are now organized in three groups: **Object**, **Lookup relationships**, and **Ticket details**.
- All ticket fields are available under **Object** \> **Ticket**.
- Under **Lookup relationships** you'll find Organization, Requester, and any custom lookup relationship fields you've added to tickets.
- Under **Ticket details**, you'll find **Current user**, **Received from**, and **Sent to**.
Trigger actions are grouped by **Object**, **Lookup relationships**, and **Other**.
- The **Object** and **Lookup relationships** headings function the same as they do for conditions.
- Under **Other**, you'll find **Notify by**, which contains all of the notification actions.
### Error : Image cannot be pasted due to authentication requirements
Inline images in comments are [not possible anymore](https://support.zendesk.com/hc/en-us/articles/6022432434458?ref=internalnote.com) if you have setup authenticated attachments.
# 💡Insights
[Mark Zuckerberg on Threads, the future of AI, and Quest 3Meta CEO Mark Zuckerberg discusses Threads, his feud with Elon Musk, the Quest 3 headset, and the future of AI in a special episode of Decoder.The VergeAlex Heath and Nilay Patel/cdn.vox-cdn.com/uploads/chorus_asset/file/24950671/MarkZuckerberg_Decoder.jpg)](https://www.theverge.com/23889057/mark-zuckerberg-meta-ai-elon-musk-threads-quest-interview-decoder?ref=internalnote.com)
> **Alex Heath (The Verge): It’s overwhelming. I find this with the current chatbots. I feel like it can do so much that I’m not actually sure what to ask it.**
> Mark Zuckerberg: \[...\] let’s say you’re a small business and you want to have an AI that can help you interface with customers to do sales and support. **You want to be pretty confident that your AI isn’t going to be promoting your competitor’s products, right? So you want it to be yours.**
# 🎥 Videos
Pretty cool overview of Omnichannel Routing by [Roca.work](https://roca.work/?utm%5Fsource=internalnote).
# 📝 Articles this month
[My approach to Zendesk ViewsIn this article I explain my approach to Zendesk Views, and how you only need 8 views to make an efficient setup.Internal NoteThomas Verschoren](https://internalnote.com/my-approach-to-zendesk-views/)
[➕ Return to Sender - Reassign Zendesk Tickets back to the original agentUse triggers and webhooks in Zendesk to automatically reassign tickets back to the original assignee.Internal NoteThomas Verschoren](https://internalnote.com/return-to-sender/)
[➕ Checking for Agent Availability in Zendesk MessagingSometimes you want to let your customers know if agents are available before they try to reach out. This article will show you how to do it (on any Zendesk plan!)Internal NoteThomas Verschoren](https://internalnote.com/agent-availability-in-zendesk-messaging/)
# And finally...
A little bit of self promotion.
I’ve been writing this blog for over year now, delivering weekly insight and tutorials on Zendesk.
Today I'm soft-launching **Internal Note Plus,** a paid tier of this website that will offer you more exclusive Zendesk content.
If you already like this blog, or got some value out of it: please consider subscribing to **Internal Note Plus.** It’llhelpmake this project viable and gives me the room to invest more time in content.

#### Join Internal Note Plus!
Make use of our Zendesk AI Drop promo and subscribe with a 10% discount today, and receive weekly insights into Zendesk!
[Join today!](https://internalnote.com/zendesk-ai-drop-promo)
### My approach to Zendesk Views
URL: https://internalnote.com/my-approach-to-zendesk-views/
Last updated: 2025-09-08T06:42:06.000Z
For a long time now Zendesk had this strict limitation of 12 Shared Views, and 8 personal views. And even though they announced an expansion of this with a supported 30 shared, and 10 personal views later this month, I'm of the opinion that you don't need more than 12\.
[Announcing improvements to the views experience in SupportAnnounced on Rollout starts Rollout ends September 11, 2023 September 29, 2023 October 6, 2023 In response to customer feedback, Zendesk will be improving the views experience on September 29,…Zendesk helpSalvador Vazquez](https://support.zendesk.com/hc/en-us/articles/6059161161498-Announcing-improvements-to-the-views-experience-in-Support?ref=internalnote.com)
# How to use Views
There are a couple of approaches to how people setup views:
1. Views show work to be done by an agent
2. Views show work that is already done
3. Views give insights in a subset of tickets
4. Views split up tickets to create different queues.
For me, Views serve a very specific purpose: they are there to inform agents on the status of their work, and should offer the most urgent ticket first.
Any other feature or setup is secondary to this.
So if you use views to get insights in specific subsets of tickets, to get an overview of your entire inbox, or to filter to a very specific subset of tickets, well, in my opinion those views aren't views, but should be setup as dashboards and reports in Explore.
# How I approach views
When I setup a Zendesk instance for customers, I'm a big proponent of the idea of moving tickets through statuses and have agents only touch active tickets that require their attention.
In a good Zendesk setup your agent live in specific groups that define what they are working on.
Examples are: first line/second line or support/sales/finance or any other grouping. An agent belongs to one or more groups, and their job is responding to the tickets in their group and get the queue empty.
This is the way I imagine an ideal Zendesk flow:
1. A ticket is created by a customer.
2. Triggers assign the ticket to a specific group and set urgency to the ticket, this could be based on custom fields, Zendesk AI intents, brand, form or any other ticket metadata,
3. SLA policies set a first-reply and next-reply time for each ticket based on ticket group and priority.
4. The ticket appears in an *"Open Tickets"* view for agents that contains all new and open sorted by SLA, so the first SLA to breach is top.
5. Agents can do four things, and each one of them removed the ticket from their *"Open Tickets"* view:
1. Reply to a ticket and solve it – the issue is resolved and they don't expect feedback
2. Reply to the ticket and put it on pending – meaning they need customer input
3. Reply to a ticket and put it on hold, often combined with a side conversation or internal comment – meaning it needs internal action
4. Reassign to a different department
6. Whenever a ticket gets a reply, being it from a customer or colleague will re-open the ticket and resurface it in the *"Open Tickets"* view. As long as we're waiting, the ticket is out of side and out of mind. Once they re-appear we go back to step (5) until we reach a solved status.
💡
You can automate moving tickets from on hold or pending to open by making use of automations. This way agents can be sure that no tickets gets stuck in those statuses, and tickets are kept moving towards a solved status. Check out [this article](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/) for more info on how to do this!
# The views I use
Whenever I deploy a Zendesk setup, it contain these eight shared views. And I rarely add any more then these:

#### ➡️ My Tickets
Tickets where the current agent is the assignee, sorted by SLA. Depending on if the customer uses Omnichannel Routing or not this view is either on top (if routing is on agents solely work with assigned tickets), or lower in the view order (if agents pick their own tickets)
#### 📥 Open Tickets
This view contains all tickets in a NEW or OPEN status. The view is sorted by an Ascending SLA (first to breach on top).
This views is available for all agents, but is filtered to only show tickets to the groups the agent belongs to.
It also removes all **Problem* tickets from the view.
This is the default view that agents should work from, except when using OmniChannel routing.
#### ⏸️ Pending Tickets
This view shows all PENDING tickets, sorted by oldest agent reply on top.
Since I have two custom statuses **"Pending - waiting for information"* and **"Pending - Waiting for confirmation"*, I group them by Status Category.
This views is available for all agents, but is filtered to only show tickets to the groups the agent belongs to.
#### ⏭️ On Hold Tickets
This group shows all ON HOLD tickets, sorted by oldest agent reply on top.
This views is available for all agents, but is filtered to only show tickets to the groups the agent belongs to.
#### ⚠️ Active Problem Tickets
All open problem tickets. Useful to assign a few agents to handling the current crisis, while others focus on the rest of the tickets.
#### 🕣 Recently Updated Tickets
This tickets shows all tickets which were updated in the last two days by either an agent or end-user. This is useful for team leads to get an overview of what's happening. I sort these by most recent on top. And as always, they are filtered by the group the current user belongs too
#### ✅ Recently Solved Tickets
This tickets shows all tickets which were solved in the last three days, sorted by creation date, and once again filtered by the group the agent belongs too.
Useful to quickly detect recurring issues over the span of a few days
#### 👍 Recent Feedback
Tickets of the last week that got a recent CSAT score, sorted by ID and grouped per Feedback Type, in a descending order, so the bad ones appear on top. Handy for reaching out to angry customers.
## A word on groups
As you see, all views are scoped on the group an agent belongs too.

So in a setup where there are 10 open tickets, 6 for first line, 4 for second line, an agent in the First Line group would see 6 in their *Open tickets* view, and a Second Line Agent would see 4\. A team lead who works in both teams would see 10.
For every agent the closest SLA breach-ticket would be the top most, so you can be sure every ticket gets handled in relationship to your SLAs, which would, normally, make sure all customers get a reply in time.
Since the job of an agent is to reply to customers with a correct answer within an SLA, there's no reason any agent should see tickets in their views they shouldn't work on. And by scoping views to a specific agents' group, you only need one view that can be shared across all agents, instead of creating a view per department with almost identical parameters. So instead of creating a *"First Line open tickets"* *"Second Line open tickets"* view, you only need one.
## A word on reporting
But... but what if I need to see how many tickets are created about *"Refunds"*? How do I know the workload of the Finance team which I'm not a part of? How can I see all tickets assigned to John?
That's where **Zendesk Explore** comes in. Any insight you need with regard to current workload, backlog, tickets per intent or any other filter should be done in Explore. It gives a more nuanced view, has better filters, and, frankly, reduces the frustration with having only 12 views available.

# Additional Views
My above view approach still leaves room for four more shared views, and doesn't touch the personal views.
So if you really need to have a specific view for legitimate reasons you can still create them within that available space.
For example, a finance team in Zendesk might want a separate view for "Refunds" because sometimes its easier to just handle all refund tickets in one queue instead of mixing refunds with payment inquiries and invoice changes. So for that use case you can use one of the four slots for a "Refunds View" that contains all open refund tickets, shared with only the Finance team.
Similarly, you could create a few personal views to get insights in data instead of going to Explore each time.
But whenever you see yourself building a bespoke complex view with a lot of parameters, take a step back and think: since these tickets are also available in one of the 8 basic views, does this view help agent resolve tickets faster? Or is this a view I need for reporting?
And *if* that view helps those tickets be solved faster, try fixing it by changing the priority of these tickets, so they appear in the right place in your *"Open Tickets"* queue
# Agent Home
The new limits for views are not a bad thing. There are realistic use cases where you might need just that one additional view, and resorting to third party apps like [Viewer](https://www.zendesk.com/marketplace/apps/support/288141/viewer/?ref=internalnote.com) (Built by me), [Better Views](https://www.zendesk.com/marketplace/apps/support/192938/better-views-by-helphouseio/?queryID=b468ffcdc7c508f7b1b697f2fb51c169&ref=internalnote.com) or [Lovely Views](https://www.zendesk.com/marketplace/apps/support/140470/lovely-views/?queryID=b468ffcdc7c508f7b1b697f2fb51c169&ref=internalnote.com) always felt a bit like hack.
But in a Zendesk world where OmniChannel routing, skill based assignment and the new Agent Home are becoming the de-facto standard, you should reconsider your approach to views and start thinking from the idea of a ticket queue where Zendesk surfaces work to agent based on priority and sla, instead of a micro-managed view based approach with dozen if separate inboxes.
And once [Agent Home](https://internalnote.com/agent-home-beta/), currently in EAP, becomes widely available, the focus of your agents will shift from Views to the new Home, where the *Your Work* tab will provide them an SLA sorted list of assigned work, very similar to the *"My Tickets"* and *"*Open *Tickets"* view I proposed above anyhow.

So here's your homework:
1. Make sure every ticket gets a priority, group and ticket type assigned
2. Create those 8 views, put them as the top most views and make them available for your 3 best and 3 worst agents.
3. Test, validate, and deploy for all agents.
😉
### Return to Sender - Reassign Zendesk Tickets back to the original agent
URL: https://internalnote.com/return-to-sender/
Last updated: 2025-09-08T06:42:17.000Z
As a Zendesk agent, or administrator you might have run into the following scenario's:
- You have set agents to only view tickets in their own groups, but for some license types this means they can only assign to their own group and not to other groups
- You use private groups or light agents and this means some tickets can not be shared back to other groups via the UI
In either of these scenario's the process is the same: you have a ticket belonging to group A. They assign it to group B to take action. At some moment you want to reassign the ticket to group A. This might not be possible due to the above restrictions, or your agents might have the permissions to do so, but looking at a tickets' event log to find the original assignee is time consuming.
This is where the *Return to sender flow* comes in. It uses a combination of macro's, triggers and webhooks to store the original assignee, and uses that data to return the ticket to sender.
# Overview
# Setup
## Webhook
If you've already build an update ticket [webhook](https://support.zendesk.com/hc/en-us/articles/4408839108378-Creating-webhooks?ref=internalnote.com) you can re-use that one.
[Webhooks for User and Organisation eventsZendesk recently launched an expansion on their webhooks functionality that allows you to subscribe to changes in Users and Organizations and act upon those actions. In this article we’ll show how you can auto-complete agent profiles with a signature, alias and profile image upon creation.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-user-events/)
If not, you can build one as follows:
- Name: Update Ticket
- Endpoint: `https://subdomain.zendesk.com/api/v2/tickets/{{ticket.id}}.json`
- Request Method: PUT
- Request Format: JSON
- Authentication: Basic Authentication
- Username: `admin@domain.com/token`
- Password: a Zendesk API token

## Custom Fields
Create two custom fields to store the original assignee and group.

💡
An earlier version of this article used a Numeric Field for the Original Assignee. But now that we can have placeholders that return the ID of the related objects in Lookup fields via`{{ticket.ticket_field_123.id}}` this can be solved more elegantly.
### Original Assignee
This field can be a Lookup Field that creates a relationship with Users. Make sure to setup filter to only allow for agents and admins, by excluding end-users.


### Original Group
The original group field has to be a numeric field.
## Triggers
### Trigger #1: Log the original assignee
This first trigger sets references to the original assignee and group in the custom fields.
- **Meet ALL of the following conditions:**
- Ticket is updated
- Assignee is changed from (-)
- **Actions**
- Notify By > Active Webhook > Update Ticket
and set the following payload (update the IDs to match your assignee and group custom fields)
```json
{
"ticket": {
"custom_fields": [
{
"id": 123456789,
"value": {{current_user.id}}
},
{
"id": 987654321,
"value": {{ticket.group.id}}
}
]
}
}
```
### Trigger #2: Return to sender
This trigger reacts to tickets where the tag `return_to_sender` has been added too.
- Meet ALL of the following conditions:
- Ticket is updated
- Ticket Tags > Contains `return_to_sender`
- Actions
- Notify By > Active Webhook > Update Ticket
- Ticket > Remove Tags `return_to_sender`
and set the following payload
- update the IDs to match your assignee and group custom fields
- note the `{{ticket.ticket_field_123.id}}` syntax to access the ID of the linked user.
```json
{
"ticket": {
"assignee_id": {{ticket.ticket_field_123456789.id}},
"group_id": {{ticket.ticket_field_987654321}}
}
}
```
## Macro
Final step is adding a macro that adds the `return_to_sender` tag.

💡
A previous version of this article had a `Set tags` step. A Reader noted that `Add tags` is better since it does not remove all other tags on the ticket. Thanks!
# Bringing it all together
Now that we have all the steps your agents can experience the following automated flow:
1. A ticket arrives to the First Line Team and is assigned to John
2. They reassign the ticket to HR and it gets picked up by Linda
3. Once she wraps up her work she uses the *return to sender* macro to effortlessly reassigns the ticket back to John
4. John wraps up the ticket and confirms everything is ok for the customer.
# Variations
You can also use parts of this flow in different flows.
You could use the field to log the original assignee so you can report on both first line and second line actions in Explore for scenario's where the person solving the ticket (second line) might not be the one who did the triage (first line).
### Checking for Agent Availability in Zendesk Messaging
URL: https://internalnote.com/agent-availability-in-zendesk-messaging/
Last updated: 2025-09-08T06:42:22.000Z
Zendesk Messaging is a so called Conversational channel and is asynchronous by design. This means that the customer sending the messaging and an agent reading the message aren't necessarily things that happen at the same time. A customer can leave a message and close their browser window. When an agent reads the message the customer gets an email and can then choose to resume the conversation within the chat widget, or reply to the email and continue that way.
It's a nice feature but it often doesn't meet a customers' expectations. Some customers see the widget and assume an agent will reply to them immediately. They invested time to start the conversation and letting them know no-one can reply right now is a bad experience if that alert only appears whenever they try to contact an agent.
A while back I posted this link in one of my Roundup articles, showcasing how you can use the Zendesk Chat API to let users in your Zendesk Widget know if an Agent was available or not, which could be used to set expectations from the get go.
[Messaging recipe: Checking agent availability during a bot conversationWhat’s my plan? The conversation bot builder’s Add business hours condition step lets you branch a conversation bot’s answers based on your business hours. However, it can’t branch a…Zendesk helpJames Rodewig](https://support.zendesk.com/hc/en-us/articles/5706660392602-Messaging-recipe-Checking-agent-availability-during-a-bot-conversation?ref=internalnote.com)
.
At the time I didn't notice that this flow was limited to Enterprise users only and used a fairly complex (and old) API flow based on Zopim chat. However, with the new Agent Status feature in Agent Workspace and Omnichannel Routing there's now a different way to set and get Agent availabilities.

# Getting agent availability
The new Agent Status and availability feature gives agent a central place to manage with which channels they can or want to interact, and gives colleagues and managers insight in work load and availability of their teams. It allows them to strategically make channels available, and balance the load between ticketing, conversations and voice channels.
[This API call](https://developer.zendesk.com/api-reference/agent-availability/agent-availability-api/agent%5Favailabilities/?ref=internalnote.com) to the Agent Availability endpoint returns the status of all agents across all default and custom statuses. By adding a filter we can narrow this down to all agents that have an online status for Messaging across all agent statuses.
```bash
GET 'https://domain.zendesk.com/api/v2/agent_availabilities?filter[channel_status]=messaging%3Aonline'
```
The returned `data[]` object returns an array of each available agent.
```json
{
"links": {},
"data": [
{
"type": "agent_availabilities",
"id": "agent_availabilities|362397585840",
...
}
],
"included": [
...
],
"meta": {
"has_more": false
}
}
```
And when no one is online it returns an empty array:
```json
{
"links": {},
"data": [],
"included": [],
"meta": {
"has_more": false
}
}
```
Since we are only interested if *someone* is online, we can just check on the availability of elements within the `data` array. If no items are available, we are offline, when e.g. `data[0].id` exists, we know there is at least one person online.
👨💻
You can always use the API to nuance this availability a bit more. You could for example use the `&filter[work_items_count]=messaging:3` parameter to only return agents who are online and have less than three active conversations going on.
However you decide to filter, if the array ends up empty, you know no agents are. available.
# Setting up the Zendesk Bot
Now that we know how we can retrieve agent availability, we can use this in a Zendesk Bot to let customers know if someone is available to assist, or if they can leave a message.
You can combine this check with the *Business Hours* step to handle all three cases:
- During business hours and agents are available
- During business hours an no agent are available
- Outside of business hours.
For more information on building complex flows, take a look at the tutorial I build earlier this year:
[Learn how to build a full-featured Flow Builder Bot for Zendesk.In this article we will build a full-featured Flow Builder Bot for Zendesk. We’ll use every step type, use API calls and variables and show you how to create a bot yourself in a full length video tutorial.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-dinosaurs/)
## Connecting to the API
The first step in this flow is connecting to the API from within your Zendesk Bot.
Go to the *Admin Center > Apps and Integrations > Connections* and add a new connection.
- Choose Basic Authentication
- The credentials are *admin@domain.com/token* and a Zendesk API token.
- Allows Domains: `https://*.zendesk.com` (Since the call is made from a Zendesk proxy it has to be a wildcard)


## Making the API call
In this example we are creating a new **Answer** in the Zendesk Bot.
1. Go to *Admin Center > Channels > Bots > Zendesk Bot*
2. Select the Answer tab and add a new Answer
3. Add an *Make API Call* step
1. Request Method: GET
2. URL: [https://yourdomain.zendesk.com/api/v2/agent\_availabilities?filter%5Bchannel\_status%5D=messaging:online](https://d3v-verschoren.zendesk.com/api/v2/agent%5Favailabilities?filter%5Bchannel%5Fstatus%5D=messaging:online&ref=internalnote.com)
3. Authentication: \[the connection you just made\]
4. Click *Made API Call* to get the returned data
1. If successful you'll get a list of variables similar to the example JSON object earlier in this article.
2. Expand the sections until you find the `data > Item 1 > attributes > id` element and click on Save
3. Give the variable a name like *Availability ID*.
💡
Once you click the **Made API Call* button the bot will test API call and retrieve the data object. Since we need to check for the existence of an online agent, make sure you setup this bot with at least ****one** online agent.


Now that we have successfully added the API call you'll notice that our Bot has t2o branches: a API Call successful and failed branch.
Since we tested the API call we know it will always success *unless* there are no agents online. Cause if there are no agents the `data` object is empty and we can't get any *Availability ID.* So we now know that
1. API call successful means we have at least **one** online agent
2. API call failed means **no** agents are available.
## Wrapping it up
You can now wrap up the bot by adding a different experience to each branch.
Feel free to test the flow via the widget on this page!



### Zendesk Roundup for August 2023
URL: https://internalnote.com/zendesk-roundup-for-august-2023/
Last updated: 2024-01-15T08:43:47.000Z
We're reaching the end of the summer season. Kids are off to school again, businesses are waking up again and everyone starts prepping their teams for the fall and holiday season.
Or at least, if you want to be ready now's the time to look into your reporting and start optimising your Help Center content, Zendesk Bot and ticket deflection strategies!
Some readers noted that I didn't write about the Zendesk "What's New" event earlier this month. I watched it and started taking notes but it seems that where the event used to be an announcement of new announced features, it somehow turned into a recap of everything announced in the previous months, clearing the slate for a new set of announcements. So if you've read the previous [Zendesk Roundups](https://internalnote.com/tag/zendesk-roundup/) on this blog, you kinda are already up to speed.
> And if you haven't: [subscribe](https://internalnote.com/subscriptions/)! You get a monthly email with all the announcements in your inbox, for free. And as a bonus you get an email with Zendesk tips, strategies and code samples in your inbox every week!
Zendesk didn't sit still either with a bunch of small releases throughout the month fixing a lot of little bumps and annoyances in the platform. And with the announcement of [First Time Reply SLA](https://support.zendesk.com/hc/en-us/articles/6083739462682-Announcing-reply-time-SLAs-in-messaging-EAP?ref=internalnote.com) support for messaging they nicely wrapped up the summer with a final great announcement!
Now, on to the releases!
## 🥳 Thanks for reading Internal Note
If you like this kind of content, please consider ****subscribing** via email or ****share** the article to your colleagues.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🎉 New Releases
## 🤖 AI Powered Conversational Experiences
### Improved Messaging Backend
Zendesk announced a bunch of big improvements on the Messaging platform. They'll support more concurrent messages, faster loading times and reworked most integrations with e.g. Twitter or other social platforms for a better performance.
[Announcing improved messaging backendRollout start Rollout end August 23, 2023 September 30, 2023 What is changing and why ? Zendesk is focused on improving the agent workspace and enhancing the experience for both customers and…Zendesk helpArpan Nagdeve](https://support.zendesk.com/hc/en-us/articles/6041628932250?ref=internalnote.com)
This update also unlocked a slew of new capabilities:
- You can now manage your [**Ticket transcript visibility settings**](https://support.zendesk.com/hc/en-us/articles/4408818625690?ref=internalnote.com) and choose if Messaging conversations are visible to the end-user or not after the conversation wraps up.
- Zendesk [moved](https://support.zendesk.com/hc/en-us/articles/5973077601562?ref=internalnote.com) the Messaging Chat triggers from the old Chat Dashboard to Admin panel and introduced three default triggers to get started: First Reply, Request Contact Details, All Agents Offline.
- It is [now possible to ask](https://support.zendesk.com/hc/en-us/articles/5480101976218?ref=internalnote.com#topic%5Flcx%5F2ft%5Fdyb) a customer for additional details, like order number or company name, without enabling a full Bot in your widget. This brings the Messaging widget almost up to feature parity with the Classic Zendesk Widget.
### Zendesk Bot
The Zendesk Bot also got a lot of (long requested features) this month. First off is the introduction of templates. This gives you a head start when building a bot in Zendesk by offering sample flows for classic scenario's like password resets, where is my order or other similar inquiries.
**Intent Clarification** was also introduced. This is an optional step you can enable that will ask the customer for more information when their original input wasn't clear. The system will ask to rephrase or show multiple matching intents if the system can't decide which one it should show. This feature will surely remove a lot of friction for end-users while training your bot to better match future intents.
We can now use [**Sunshine Conversations variables**](https://support.zendesk.com/hc/en-us/articles/5480101976218?ref=internalnote.com#topic%5Flcx%5F2ft%5Fdyb) in bot answers to access SunCo data in the Make and API call step. You can call the user, conversation, and app ID variables.
And the big cherry on top this month is the [ability](https://support.zendesk.com/hc/en-us/articles/6033444498202-Announcement-Introducing-Custom-ticket-fields-in-basic-settings-for-Messaging-Web-Widget-and-Zendesk-SDKs-for-Android-iOS-and-Unity?ref=internalnote.com) to collect custom fields from an end user before passing the conversation to an agent. Or in other words: you can now *finally* pre-fill custom fields in the bot via code. Useful for passing customer IDs, order numbers or other contextual information.


## **🧱 Open and Flexible Platform**
### Zendesk Guide
After last month's ZCLI and Secure JWT announcements this month was a slower month for the Help Center. They announced semantic search for English community posts, which will improve search results for that content, and they are now enabling [content blocks](https://support.zendesk.com/hc/en-us/articles/6012860666906-Announcing-content-blocks-enabled-by-default-in-all-articles?ref=internalnote.com) on all existing articles by default, removing the extra step of enabling said feature each time you need it.
As an aside, did you know that Copenhagen has a new sibling called [Role](https://www.zendesk.com/marketplace/themes/14/role/?queryID=7bddf4e8af813e691390af37a985f24d&ref=internalnote.com)? It's a new official Zendesk theme with a fun twist that organised content by user role instead of section or category.
### Agent Workspace
- A bug-fix for how saving tags is handled when multiple agents update the same ticket that prevents agents from losing tags on unsaved tickets when another agent causes a change to the ticket.
- The [Essentials Card](https://internalnote.com/essentials-card/) will now displays social identities whenever a customer reaches out from a social messaging channel. If you merge email and social accounts for a user the card will show all those identities in a list.
### Data Importer
A beta of the new Data Importer was announced with initial support for organisations. This new importer will allow you to import a CSV of data and will give you a UI (not too dissimilar to how [Sell](https://support.zendesk.com/hc/en-us/articles/4408845638298-Importing-leads-and-contacts-using-a-CSV-file?ref=internalnote.com) works) to map columns to fields in Zendesk.
The importer currently only supports Organisations but will soon be expanded to Users and the new Custom Objects v2 when available.
[Announcing the data importer beta and a new way to import organization dataAnnounced on Rollout on August 4, 2023 August 4, 2023 Zendesk is pleased to announce a new way to import organization data. What is changing? Zendesk is progressively replacing the current bul…Zendesk helpCarl Joseph](https://support.zendesk.com/hc/en-us/articles/5789015428250?ref=internalnote.com)
### Jira Integration
In the past, when moving Jira instances, it was necessary to contact Zendesk Customer Support for migrating links between Zendesk tickets and Jira issues. However, now you can easily migrate these links to your new Jira instance by using the [**Migrate Links**](https://support.zendesk.com/hc/en-us/articles/6014646536730-Announcing-new-tools-to-migrate-your-Zendesk-Support-for-Jira-integration?ref=internalnote.com) button available in Jira administration.
## 🔐 Trust and Security
### SSO
If you enable multiple SSO solutions for your end-users you can now [rename](https://support.zendesk.com/hc/en-us/articles/5973530227226-Announcing-single-sign-on-SSO-improvements?ref=internalnote.com) this buttons to make it easier to pick the right one for your users!


### Roles and Permissions
[Custom roles](https://support.zendesk.com/hc/en-us/articles/4408882153882?ref=internalnote.com) got a few more options for those using Suite Enterprise:
- Agents now have the ability to grant permission to view and manage other team members. This can be done with options such as "Not Allowed," "View only," and "Create, assign roles, edit, and delete." However, agents cannot assign roles to themselves. These permissions are distinct from those related to creating and managing custom roles.
- Agents in custom roles can be given permission to access and manage suspended tickets separately from their permission to access non-suspended tickets.
- Agents can be granted permission to search and view lists of end users independently from their access to individual end user profiles. This permission allows agents to search for agents by name, email address, phone number, or organisation.
[Announcing new agent permissions to manage other team membersImportant: Rollout of the new permissions to manage other team members’ permissions has been rolled back temporarily. These permissions won’t be available until the rollout resumes. Announced o…Zendesk helpAlina Wright](https://support.zendesk.com/hc/en-us/articles/5973478348186-Announcing-new-agent-permissions-to-manage-other-team-members?ref=internalnote.com)
# 💡Insights
Speaking of preparing for the Holiday season, here's a good article on how to build a good bot!
[Enterprise Bot Building Best PracticesThis guide offers expert tips and advice from Zendesk’s bot building team and Ultimate’s customer success team to enable AI projects set for success.Ultimate.](https://www.ultimate.ai/education/bot-building-best-practices?ref=internalnote.com)
And for those using Zendesk AI, some insights in setting up the triage triggers correctly.
[Why didn’t my intelligent triage trigger run during ticket creation?Question I created a trigger that includes the Ticket | Is | Created condition, along with one of the intelligent triage conditions below, but the trigger didn’t work as I expected. Why didn’t it w…Zendesk helpErin O’Callaghan](https://support.zendesk.com/hc/en-us/articles/5940673936026?ref=internalnote.com)
# ⚠ Major Changes
Starting August 23d, Zendesk will rollout the previously mentioned new Messaging backend to all customers. For those trying out Messaging there's an important caveat though:
> **Opting out of messaging** \- with the messaging backend changes, customers will no longer be able to opt out from the messaging product on a self-serve basis. For opting out of messaging you can fill out this [form](https://docs.google.com/forms/d/1IaORimmXIZTJ%5FumWMgq-svcAzHUKYRGxc72sqTfZHKc?ref=internalnote.com).
## V**isibility restrictions on tickets requested by agents**
Companies using Zendesk for internal support will run in the scenario where an Agent will often act as an end-user to request support from another department. E.g. a System Engineer has a question for HR and both IT and HR are departments that run on Zendesk.
As an Agent the Engineer has access to both the Customer Portal and the Agent Workspace in Zendesk. This could mean that the user also has access to the ticket as an agent since he is the requester of the ticket and thus can also read the internal notes the HR team made on his request.
Previously, this could lead to weird situations since the employee might not need to see those internal comments that discuss how to handle his request.
This has now changed. When an Agent creates a ticket via the portal for themselves, they can no longer access that ticket in the Agent Workspace if it gets assigned to a private group.
A bit complex, but if you ran into this scenario you'll probably recognise it and be happy with the change 😉
[Announcing new visibility restrictions on tickets requested by agentsAnnounced on Rollout starts Rollout ends July 31, 2023 July 31, 2023 August 29, 2023 Zendesk is excited to announce a new experience for agents who request tickets that are assigned to private…Zendesk helpAlina Wright](https://support.zendesk.com/hc/en-us/articles/5952162640282-Announcing-new-visibility-restrictions-on-tickets-requested-by-agents?ref=internalnote.com)
# 🎥 Videos
Zendesk posted a few overview video's of What's New in Q3
- [Platform](https://www.youtube.com/watch?v=DmJjyKPboh0&list=WL&index=2&t=375s&pp=gAQBiAQB&ref=internalnote.com)
- [AI](https://www.youtube.com/watch?v=arUNos6qffE&list=WL&index=3&pp=gAQBiAQB&ref=internalnote.com)
- [Trust and Security](https://www.youtube.com/watch?v=4wmHHOWLRO0&ref=internalnote.com)
# 📝 Articles this month
[➕ Viewing User Interaction Context in ZendeskThis article shows you three ways you can leverage existing Zendesk features to give agents insights in user intents so they can resolve tickets faster and give better support.Internal NoteThomas Verschoren](https://internalnote.com/context-in-zendesk/)
[Quick Look at the new Essentials Card in ZendeskA quick overview of the new Essentials Card for Zendesk user profiles.Internal NoteThomas Verschoren](https://internalnote.com/essentials-card/)
[➕ Enabling forms on the Zendesk Messaging widget without using a ChatbotThis article explains how you can use the Messaging Widget without a chatbot and still collect information from your customersInternal NoteThomas Verschoren](https://internalnote.com/widget-without-a-bot/)
# And finally…
I came across [this inventive method](https://medium.com/@tbs89berlin/balanced-workload-proportional-ticket-distribution-in-zendesk-explained-dbde81f7a16e?ref=internalnote.com) of distributing tickets across different teams using Zendesk‘s Liquid Syntax. Pretty cool stuff.
```html
{% assign randomizer = ticket.id | modulo:7 %}
{% case randomizer %}
{% when 0 %}
{"ticket": {"additional_tags":["team_A"]}}
{% when 1 %}
{"ticket": {"additional_tags":["team_A"]}}
{% when 2 %}
{"ticket": {"additional_tags":["team_B"]}}
{% when 3 %}
{"ticket": {"additional_tags":["team_B"]}}
{% when 4 %}
{"ticket": {"additional_tags":["team_C"]}}
{% when 5 %}
{"ticket": {"additional_tags":["team_C"]}}
{% else %}
{"ticket": {"additional_tags":["team_D"]}}
{% endcase %}
```
#
### Enabling forms on the Zendesk Messaging widget without using a bot
URL: https://internalnote.com/widget-without-a-bot/
Last updated: 2025-09-08T06:45:23.000Z
Before Messaging and the new Zendesk Bot and Flow Builder everyone used the Classic Widget. This widget offered a modal view which searched your Help Center first, and then offered your users a web form to submit a ticket if they still needed help.
Optionally you could expand this widget with Chat or Talk integrations to offer more direct and immediate support to your customers.
With the arrival of Messaging and conversations the old widget made room for the new experience we know (and love) today. However with the new we also lost some of the old. If you don't offer a self service solution via your Help Center, or your customers or support scenario's don't really fit a chatbot-first approach, the new widget gave a subpar experience. Without enabling a bot you can only ask for a name and email, and there's no other metadata to be captured.
Many of my own customers that didn't find a fit in Zendesk Bot resisted moving to the new Messaging experience and kept the Classic Widget and its webforms active all this time.

## 🥳 Thanks for reading Internal Note
If you like this kind of content, please consider ****subscribing** via email or ****share** the article to your colleagues.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# Custom ticket fields the Messaging Web Widget
Since last week it's now possible to add custom fields to a basic Messaging Widget. So instead of just asking for a name and email when a user launches your widget, you can now ask for additional details without the requirement of adding a full Zendesk Bot (and paying for its usage via MAU).
> Text and drop-down custom field types are supported in this first release. We are considering expanding support for other types such as numeric and date in the future.
## Who wants to use this?
The best customer care setup is one where you allow customers to find answers themselves without waiting for or needed your support team. This leads to faster resolutions for the end-user, and gives your care agents the room to spend time on the more complex or unique scenario's.
However, there are a few scenario's where having a Help Center and Bot first approach isn't a good fit.
- You use your web widget and Zendesk instance as a way to capture sales leads and inquiries instead of a real customer care platform
- Your Help Center is not yet ready for deployment, you're still working on its contents or your information doesn't live on Zendesk Guide (although [Federated Search](https://internalnote.com/federated-search/) can assist here).
- Your support use cases are verify specific and don't lent them to self service.
- You only just started using Zendesk and you want a basic support flow via Messaging. You can then use the data captured to learn what flows are ideal for ticket deflection, and start working on a real bot for future deployment.
In these kind of scenario's it might be useful to offer direct support via a webform, instead of having a chatbot that deflects, which makes this new feature launch ideal!
## How does it work?
So, how does it work? In this article we'll explore three scenario's:
- Default setup where we ask for a name and email
- A nicer setup where we ask for additional information
- A full setup where we pre-fill fields based on website context
As always, you can test out the feature on a demo page:
[Internal Note - Zendesk Widget - No BotDemo page to showcase using the Zendesk Messaging Widget without a BotNo BotInternal Note](https://widget.internalnote.com/no-bot?ref=internalnote.com)
Let's dive in!
# Default Setup
The initial setup of any new Messaging widget contains this default setup. The system welcomes the user, and then asks for their name before moving to an available agent. If no one is available, it asks for an email and then lets the customer know they'll receive a notification once an agent replies.
It's basic, bare bones and does the job.


💡
If you want to unlink your widget from your existing Zendesk Bot, you need to go to **Messaging > Bots and Automation* and hover over your Bot. Click on Settings and uncheck your widget from the list of channels the bot is available on.
## Asking for information
The default setup is nice, but this article wouldn't exist if there weren't some configurations and improvements we can do.
First, let's set the context. Our Zendesk setup has two custom fields.
- A dropdown where we ask the customer to make a choice
- A text field where the customer can enter some information.
As noted above, no other field types are currently supported.


Now that we have our two fields we can jump into *Messaging > Widget* and go to the *Responses* section. We can tweak the welcome message, and use the *Customer Details* section to add, remove or reorder custom fields. Any field you add to this list is mandatory.
In this example I've added the email field from the get go, but note that if no agents are available and you've got [Continuous Conversation](https://support.zendesk.com/hc/en-us/articles/4408829095706-Enabling-customers-to-continue-their-conversation-over-email?ref=internalnote.com) enabled, the system will asks for the email anyhow. I just find this a nicer flow for the customer.
Once the customer fills in the form they get a final Follow-up message, before we move to an Agent. If you plan to offer only async offline ticketing, it's best to change this follow up message to something akin to "We'll reach out via email".


As you can see in the screenshots above, the experience of the end-user is nearly identical to the form-only experience the Classic Widget offered, with the added benefit that you can move to a Zendesk Bot once you're ready.
## Pre-fill data
So far, everything we did was a no-code UI only setup. This means it can be done by anyone and requires minimal effort from an IT or Marketing team to enable the widget on your website.
We can however improve this flow a bit with some code.
Imagine a scenario where you have three distinct departments or product categories on your website: mobile, desktop and wearable. Instead of asking the customer to select a product type for their inquiry, it might be nice to preset that option based on the product they're currently looking at.
Or similar, if you have a website that spans multiple countries or multiple properties or hotels, you might want to set the Country, Location or Hotel custom field upon opening the widget based on what the customer is looking at.
[➕Pre-filling custom fields in the Zendesk Bot with Messaging MetadataThis article contains three tutorials that explain how to use the new Messaging Metadata feature in Zendesk to pre-fill fields in your conversation bot flows.Internal NoteThomas Verschoren](https://internalnote.com/messaging-metadata/)
I wrote an entire article on this topic, and the cool new is that all of those API endpoints also work with this no-chatbot setup.



> You take the blue pill, the story ends, you wake up in your bed and believe whatever you want to believe. You take the red pill, you stay in wonderland, and I show you how deep the rabbit hole goes.
On the [demo page](https://widget.internalnote.com/no-bot?ref=internalnote.com) you'll find a sample where clicking a button will make your choice and set the field.
```javascript
$('.pill').click(function(){
var pill = $(this).data('target');
zE('messenger:set', 'conversationFields', [{ id: '13281147569042', value: pill}]);
zE('messenger', 'open');
});
```
And making a choice is one thing, we also want to assign this ticket to someone. Luckily this works identical to how any trigger works. Since we use and set custom ticket fields, we can use those field values to assign tickets to the right department upon ticket creation.
# Wrap Up
This new release takes Messaging yet one step closer to the Classic Widget experience while still keeping the spirit of Messaging there. I can really see a flow where companies start with this setup and then gradually migrate to a bot and expand the flow without exposing their customers to big UI changes when they move from forms to bots.
I heard from some people that they would like to see Help Center search, context aware forms, multiple forms,... in this feature too. I agree that these are useful features to have, but I think that those were already covered by the real Zendesk Bot feature.
But either way, this features lowers the threshold of getting on board with Messaging while retaining feature parity with your existing Classic Widget, so it's a real win-win.
### Viewing User Interaction Context in Zendesk
URL: https://internalnote.com/context-in-zendesk/
Last updated: 2024-08-19T20:37:06.000Z
When defining a good customer care strategy there's 3 main elements that are core items that need to be part of your strategy. Customers need be able to self serve, agent need context and as an admin you need insights.
**Self service** not only allows customers to solve issues more quickly by offering solutions up front without waiting for an agent, it also removes workload from your team so that they can focus on the complex issues while the easy questions are handled by bots and guide articles.
Similarly, when agents have **context** they know who the customer is and what they want to accomplish. It reduces duplicate work and makes sure information is available instead of customers needing to repeatedly provide their name, email or intent.
And finally you need good **reporting** that categorises your inquires and flags repeated scenarios and blockers so you can optimise these flows so you can improve self service and context.
This article will focus on giving agents context based on user actions.
## Giving context
Imagine a customer who visits your webshop and looks at a product. They spend some time on the product page and then reach for the Contact Us button. Their question will probably be about that product.
So when an agent sees an incoming conversation it would be pretty convenient if they can see what the customer was looking at right before they send a message so they can open up the product page themselves, check if the customer bought or orders the item, pull up the knowledge articles on the product, ... The customer will be assisted faster, and the agent doesn't need to ask that context from the customer.
Similarly let's say that same customer started the conversation and the Zendesk Bot proposed a few articles. They read the articles, maybe mark a few of them as "did not help", and then reach out to an agent. The worst experience we can offer the customer is having the agent send them those same articles again. So if we can make the list of read/shown articles visible to the agent they won't waste time sending the same information again, but can immediately dive into more complex support questions and solutions.
Both of these scenario's are examples on how Zendesk and the Agent Workspace can give agents insight in user intents to better assist them while working more efficient.
# How does it work?
So, how does it work? Let's dive into three concrete examples
1. Show browser history next to tickets
2. Show prior interactions and actions in external tools next to tickets
3. Show FAQ activity next to tickets.
# 📈 Showing browsing history
One of the benefits of adding your Messaging widget not only to your support site but to every site you own (blog, help center, webshop,..) is that the widget will track page views across all websites where the widget is embedded.
When a user visits your website, navigates to a product page, looks at the product, then goes to a few support articles and finally ends up on the checkout page the widget will store those page views. If the customer then contacts you via the widget the Customer Context Panel in Agent workspace will show those visited webpages to your agent, providing immediate context.
[Viewing customer context in a ticketWhat’s my plan? This article describes how to view customer context in the context panel, including additional user profiles and events from applications other than Zendesk, in both the Zendesk Ag…Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/4408829170458-Viewing-customer-context-in-a-ticket?ref=internalnote.com#topic%5Fehg%5F1qz%5Fvkb)
The panel will show the last 20 pages a customer has looked at and the list is updated whenever a new Conversation is started. So the context will change and rotate over time and any interaction will always show the most recent 20 pages (if available).
This feature is enabled by default so there is no configuration to be done.

Example customer journey on the right side of the Agent Workspace
## 🔒 Privacy
Tracking user interactions can be frown upon and might even be against local privacy regulations. Luckily Zendesk took this into account when they designed this feature.
By default Zendesk pushes the following object to their servers upon page load:
```json
{
"url": "https://widget.internalnote.com/",
"buid": "fc5ded164c5d4e628163e85c7ba7d04f",
"channel": "web_messenger",
"version": "1a67289",
"timestamp": "2023-08-18T10:02:05.535Z",
"suid": "35092f59253640d89b27a488fe47930d",
"pageView": {
"pageTitle": "Internal Note - Zendesk Messaging Authentication",
"referrer": "https://widget.internalnote.com/",
"time": 10,
"loadTime": 62,
"navigatorLanguage": "en-GB",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"helpCenterDedup": false
}
}
```
Notable here is the `buid` that is a unique ID for that session, and the `url` .
For any subsequent request the same `buid` will be passed along. This is stored in localStorage and has no expiry date so should be considered stable.
However, as long as no conversation is started there is no User information passed along, and the data is not visible anywhere in the Zendesk UI for Agents.
The passed URLs are also limited to 20, so after 21 page visits the first page will be purged. The fact that the `buid` is fixed on a user device might make it an identifier.
More info on Zendesk cookie usage can be found here:
[Zendesk In-Product Cookie PolicyThis In-Product Cookie Policy (“Policy”) provides information about how and when Zendesk uses Cookies within the Zendesk Services. For the purposes of this Policy, the term, “Services,” shall have…Zendesk helpRob Slattery Edited June 14, 2023 00:42](https://support.zendesk.com/hc/en-us/articles/4408824378650-Zendesk-In-Product-Cookie-Policy?ref=internalnote.com)
Now, when a user does click the widget and starts a conversation, the following payload gets send. This one **does** contain a `appUserId` and is responsible for linking the current conversation to a user in Zendesk. And since this payload also contains a `client.id` that is the same as the `buid` the history already submitted to Zendesk is linked to your user and shows up in their context panel.
```json
{
"author": {
"role": "appUser",
"appUserId": "d36caf93deaded3cea0be14d",
"client": {
"platform": "web",
"id": "fc5ded164c5d4e628163e85c7ba7d04f",
"integrationId": "61ea8723f4aa6100eb8a69e5",
"info": {
"vendor": "zendesk",
"sdkVersion": "0.1",
"URL": "widget.internalnote.com",
"userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36",
"referrer": "",
"browserLanguage": "en-GB",
"currentUrl": "https://widget.internalnote.com/",
"currentTitle": "Internal Note - Zendesk Messaging Authentication"
}
}
},
"activity": {
"type": "conversation:read"
}
}
```
If you want to tie this behaviour into your privacy policy and cookie banner you can leverage the [Zendesk Widget API](https://developer.zendesk.com/api-reference/widget-messaging/web/core/?ref=internalnote.com#set-cookies). This will disable the widget if the user declines your cookie settings.
```javascript
zE("messenger:set", "cookies", false)
```
💡
The interaction history only works with Zendesk Messaging. So if a user submits a webform via Zendesk Guide this will not show the browsing history prior to submitting the webform.
# 📅 Showing actions and events
Where the previous flow focussed on actions happening outside of Zendesk, Zendesk Events are there to give agents context on what's happening inside of Zendesk.
The Context Panel by default shows a list of recently created tickets and conversations, but when you dive into the settings you can enable a few other Zendesk events related to Zendesk Guide.
When an agent gets a new ticket they can reference that context panel to see if the user recently created a ticket for a similar topic, or if they read guide articles in the past that referenced that same topic, helping the agent to suggest the right solution without repeating past information.

## Shopify Events
If you have the Shopify integration for Zendesk enabled you can also show orders, refunds, deliveries and other interactions with your webshop right next to tickets.
If a customer inquires about an order status but forgets to add an order number, it's probably that order they placed a few days before creating the ticket.
Or if you see a refund processed event, you can use that to let the customer know they've got their money back and resolve the ticket.
[Setting up Shopify profiles and events for Sunshine in SupportWhat’s my plan? Sunshine profiles and events enable agents to view additional information about a Shopify customer in a ticket. This article explains how to configure the Shopify integration to vi…Zendesk helpDarren Chan Edited April 11, 2023 20:23](https://support.zendesk.com/hc/en-us/articles/4408821228442-Setting-up-Shopify-profiles-and-events-for-Sunshine-in-Support?ref=internalnote.com)
## Custom Events
When you enable these Zendesk events you'll notice that you can also create Custom Event types. These events can be added via API and allow you to any kind of event in the timeline giving agents context specific for your use case.
For example, I created a custom Event flow that shows me when someone [subscribes](https://internalnote.com/#/portal/signup) to Internal Note or, even better, when someone decides to become a [**paid supporter**](https://internalnote.com/#/portal/signup)**. 🥳**
That way, whenever someone contacts me with feedback I can quickly reference their status without switching between multiple tools.
If you want to know how to do this, take a look at the article below, or if you don't want to code, take a look at [Event Manager Pro](https://www.zendesk.com/marketplace/apps/support/912698/event-manager-pro/?ref=internalnote.com) on the Zendesk marketplace.
[Sunshine Events via Zapier or WebhooksZendesk Sunshine Events allows you to enrich your customer profiles and give context by building a timeline of your customers’ actions by adding events from external systems. This tutorial shows you how.Internal NoteThomas Verschoren](https://internalnote.com/sunshine-events-via-webhooks/)
# 🤖 Show FAQ activity
To wrap up this article on giving agents context, let's dive into a final big one: give agents insights in which articles the customer already read and didn't help them.
Most companies that setup Self Service start with the basics: the set up a good Help Center that handles the usual questions and point customers to that page whenever they need help.
Agents can then use the [Knowledge Panel](https://support.zendesk.com/hc/en-us/articles/4408836451610-About-Knowledge-in-the-context-panel-and-the-Knowledge-Capture-app?ref=internalnote.com) to lookup articles and offer them to customers as a possible solution, if customers didn't already lookup the articles themselves in the first place.
Step two in this flow is turning self service into ticket deflection. Instead of relying on the customer to search for something, or have agents spend time offering solutions, you can let Zendesk automate this flow for you.
You can enable a Zendesk Bot that will offer the customer articles based on their question in the Messaging widget or on social channels, or you can enable auto-replies which will respond to incoming emails by offering three Help Center articles in response to the customers' inquiry. Enabling auto-reply will also intercept webform submissions in your Help Center by presenting a modal view that shows three articles that might help.
[Quickstart guide: AutorepliesWhat’s my plan? Fastpath: Admin Center > Channels > Bots and automations > Article recommendations Attention: Zendesk has renamed our bot capabilities. Answer Bot is now Zendesk bo…Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/4408820349850-Quickstart-guide-Autoreplies?ref=internalnote.com)
Whatever option you choose, the flow is similar:
1. Zendesk offers three support articles to the customer
2. The customer clicks a link and reads (or looks at) the article
3. Zendesk offers the customer the option to mark their question as resolved
When they mark the article is resolved, Zendesk will close the open ticket and tag it with `auto-solved via bot` tag for reporting purposes.
The two galleries below give you an idea on how this flow works for webforms and email.
What's nice about this setup is that not only will you deflect questions that can be resolved with an article, thus giving agents time to focus on the complex questions, but Zendesk will also list the offered articles in the ticket thread. This way your agents know what's been offered to the customer already, which removes the risk of sending the same link again and again.
Aside from showing the list of articles suggested, Zendesk will also mark articles as viewed or even highlight those deemed "unhelpful" or "unrelated" so you can improve those articles where needed.
## Via webform
💡
If a customers gets suggested articles via the webform they will not get another email with possible solutions once they submit the ticket as to not overload the customer with options.


## Via Email


# Conclusion
Zendesk offers a lot of code-free solutions out of the box that make it easy and fast to give agents context in what your customers want to achieve which allows them to give better and faster support, leading to better response times and, hopefully a higher CSAT.
So, which of these features do you use already?
### Preview of the new Essentials Card in Zendesk
URL: https://internalnote.com/essentials-card/
Last updated: 2024-08-19T20:33:39.000Z
A little over two years ago Zendesk moved to Agent Workspace and introduced the concept of [Context Panels](https://support.zendesk.com/hc/en-us/articles/4408836526362-Using-the-context-panel?ref=internalnote.com). These panels live on the right side of the interface and allows agents to view customer information, search the Help Center, interact with Zendesk AI to view intent, summary and sentiment, or use custom apps installed in their instance to reference external systems.
The Customer Context Panel shows an overview of a tickets' requester details. It also included a timeline of recent interactions (which can be expanded with custom events) and recent web pages visited (if they contain the Zendesk Widget and the ticket was created via the Messaging channel). For more information on the custom events, take a look at this article.
[Sunshine Events via Zapier or WebhooksZendesk Sunshine Events allows you to enrich your customer profiles and give context by building a timeline of your customers’ actions by adding events from external systems. This tutorial shows you how.Internal NoteThomas Verschoren](https://internalnote.com/sunshine-events-via-webhooks/)
# Essentials Card
The customer overview has been a rather static element that shows a fixed list of items (email, organisation, tags, details, locale e.a.). This has now changed with the introduction of the new Essentials Card.
With this new Essentials Cards you can now pick and choose which elements you want to show and in which order, giving your agents a lot more context while making sure only the required data is shown.
Take a look at the examples below. The first one shows a traditional profile card as we know it already. The middle one shows an essentials card that has a custom user field (VIP) enabled and the order of the fields changed. And the final one shows a fully configured card with social fields, custom fields, multiple email addresses e.a.
Compared to the first card you can see how this gives you a lot more insight in who your user is.
Configuring the cards works similar to how we already configure ticket Forms. Go the *Admin Center > Workspaces > Agent tools > Essentials card* and select the User card. Here you can then drag and drop the shown fields to reorder the fields, press the little X to remove the field from the view, or use the button at the bottom to add (custom) fields to the card.
[Configuring the essentials cardWhat’s my plan? Fastpath: Admin Center > Workspaces > Agent tools > Essentials card The essentials card appears in the context panel in the Agent Workspace and displays information abou…Zendesk helpColleen Hall](https://support.zendesk.com/hc/en-us/articles/5768595554714?ref=internalnote.com)



If a field links to another Zendesk object (organisation, [lookup fields](https://internalnote.com/lookup-fields-and-ticket-escalation/), custom objects v2,...) the values will be rendered as links opening the related object in a new tab. In case of social profiles, clicking the link will open a users' profile on its respective social platform (e.g. Facebook). Note that if a field has no value, it will not be shown.
As for improvements, there's a few things I'd like to see different.
**Checkboxes** display as a YES or NO value, but a nicely rendered checkbox might be easier to read at a glance. It's also too bad there is no URL type field for user fields. When entering a **webpage** (e.g company website) in a users' profile it's rendered as text instead of a clickable URL.

## What's next?
I really like this small improvement to the customer context panel. It allows you to change the shown data to match your use case, and allows you to show stuff that used to be hidden (or part of the now deprecated [User Data](https://www.zendesk.com/marketplace/apps/support/6536/user-data/?ref=internalnote.com) app).
When looking at the Admin Panel interface, having just one Essentials Card named User makes me think there will be future cards? Maybe organisation cards? Context driven cards similar to layouts or contextual workspaces? A custom objects card? There's plenty of options here.

Parallel with this new Essentials Card Zendesk is also working on a new [Profile Page layout](https://support.zendesk.com/hc/en-us/articles/4901908551962?ref=internalnote.com). I wonder if the layout changes we add to the Essentials Card will also be reflected to the Key Details panel in that new layout? It seems unnecessary or redundant to have to places with the same data to have two different setup locations, but time will tell?
### Zendesk Roundup for July 2023
URL: https://internalnote.com/zendesk-roundup-for-july-2023/
Last updated: 2023-10-12T14:07:13.000Z
Summer's here, and even though most of use are looking forward to [holidays in the sun](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=video&cd=&cad=rja&uact=8&ved=2ahUKEwjepavwrrGAAxXswAIHHV5yCxkQtwJ6BAgPEAI&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D2Ah1JM9mf60&usg=AOvVaw2-QMjW7rXIly51bnjUg1eM&opi=89978449), Zendesk has kept delivering with a bunch of smaller and bigger updates to their platform. Mostly adding features to existing tools, but also filling in major gaps to new platforms like Messaging.
Zendesk has also announced a [What's New](https://event.zendesk.com/whatsnewatzendesk2023q3amer/whatsnewwebpage/?ref=internalnote.com) on August 2nd which will introduce a bunch of new feature. I'll be on holiday but I hope to write a short recap on some quiet warm evening that week. My hopes? A release of Custom Objects V2, Layout Builder and app shortcuts in the ticket sidebar.
Let's dive into this months' updates!
## 🥳 Thanks for reading Internal Note
If you like this kind of content, please consider ****subscribing** via email or ****share** the article to your colleagues.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🎉 New Releases
## Agent Workspace
The Agent workspace got a bunch of improvements this month.
- The new [**Essentials Card**](https://support.zendesk.com/hc/en-us/articles/5768594815898-Announcing-the-configurable-essentials-card?ref=internalnote.com)offers a configurable context panel with information about a ticket requester. You can now even include User Fields, and Lookup Fields as well as social channels.
- You can now [**pin a relevant article**](https://support.zendesk.com/hc/en-us/articles/5861246798618-Announcing-Content-Pinning-in-Knowledge-in-the-Agent-Workspace-?ref=internalnote.com)in the Knowledge Panel for a specific ticket. Whenever someone looks at the ticket that article will be shown above the suggested articles. Handy when e.g. second line or a colleague looks at an article and you know they'll need to reference that same article or procedure.
- [**Omnichannel Routing**](https://support.zendesk.com/hc/en-us/articles/5877283895834-Announcing-skills-in-omnichannel-routing-general-availability?ref=internalnote.com) (I should really write about it someday) now allows you to also assign based on skills in addition to the existing capacity and status options already available. It's also possible to [reassign reopened tickets](https://support.zendesk.com/hc/en-us/articles/5952305148442-Announcing-the-ability-to-reassign-reopened-tickets-with-omnichannel-routing?ref=internalnote.com) based on the status of the assigned agent.

### Channel switching changes
Zendesk will now dynamically switch the composer field to better match the expected action of the agent. For example: when an agent opens a chat ticket with an active conversation it will select *reply via chat* by default, but when the agent opens a ticket where the conversation has ended or is inactive, it will select an *reply via email* or *add internal note* option based on the privacy settings.
It's a small tweak but every clicked saved counts when you're handling hundreds of tickets a day.
[Announcing improved channel switching logic in the Agent WorkspaceAnnounced on Rollout starts Rollout ends July 17, 2023 July 17, 2023 July 25, 2023 Zendesk is pleased to announce some improvements to our channel switching logic when opening tickets in the Z…Zendesk helpAmisha Sharma](https://support.zendesk.com/hc/en-us/articles/5924579450522-Announcing-improved-channel-switching-logic-in-the-Agent-Workspace?ref=internalnote.com)
## Zendesk Bots
- **Conversation bots** can now be deployed on Slack Direct Messages
- You can now pre-fill fields in the bot and pass tags via the new [**Metadata API**](https://support.zendesk.com/hc/en-us/articles/5868905484442?ref=internalnote.com). This was one of the biggest feature gaps between Zendesk Messaging and the Classic Web Widget so it's great this has finally been resolved.
- **Restricted knowledge base articles** in bot conversations are now supported. You can read all about it in [this article](https://internalnote.com/show-restricted-articles-in-zendesk-bots/).
> **Note:** The restricted article preview for end users will only be visible to those authenticated via [Messaging Authentication with JWT](https://support.zendesk.com/hc/en-us/articles/4411666638746/?ref=internalnote.com) and is part of the user segment the article is visible to. If you want to display the restricted article preview to all end-users, this can be enabled in the bot settings. When the end-user clicks *View article*, they will be taken to the knowledge base article page and must sign in to view the article contents.
- **New standard responses -** Conversation Bot used to have a fallback response whenever a match couldn't be found, with the option to include a few intents to guide the customer to a possible solution. This fallback response has now been expanded with four options to better match different scenario's:

🤨
Am I the only one who finds this new collapsable UI unintuitive to use? Especially when configuring e.g. the Messaging Widget all options are hidden behind an extra click that requires you to expand the blocks before you can even see what options are available. I'd rather have a long expanded view by default.
## Help Center Improvements
### Announcing Secure end-user experience integrations for Help center
When I first read about this feature I expected something completely different than what was announced. I hoped it would be a way to store authentication secrets inside of Zendesk Guide (similar to how [API Connections for bots](https://support.zendesk.com/hc/en-us/articles/5040378297626?ref=internalnote.com) work) . That way Zendesk could proxy API integrations build inside of customised Help Centers without the risk of exposing tokens or passwords to end-users.
Sadly, this is not the case. This feature works the other way around. It will allow you to add an extra authentication header to outgoing requests which you can use to validate the request coming from Zendesk Guide. Useful to validate and authenticate requests to custom written endpoints or workers, but useless when you want to directly connect to e.g. Shopify, Airtable or other API platforms with their own authentication methods.
[Announcing Secure end-user experience integrations for Help centerAnnounced on Rollout starts Rollout ends July 3, 2023 July 3, 2023 July 7, 2023 Secure end-user experience integrations for help center allow Zendesk customers to build rich end-user experien…Zendesk helpGorka Cardona-Lauridsen](https://support.zendesk.com/hc/en-us/articles/5860358664730-Announcing-Secure-end-user-experience-integrations-for-Help-center?ref=internalnote.com)
### ZCLI Guide
A few years ago I wrote a [Custom GitHub action](https://github.com/verschoren/zat-deploy?ref=internalnote.com) to automatically deploy Zendesk apps via [ZAT](https://developer.zendesk.com/documentation/apps/zendesk-app-tools-zat/installing-and-using-zat/?ref=internalnote.com). I've since migrated this one (privately) to use the new ZCLI API but keeps a fork of the code active to deploy themes. But with ZAT going away, I was hoping they would port the Custom Theme functionality to ZCLI before the old tooling was deprecated.
And this is exactly what was announced: fresh new ZCLI commands to import, update and publish themes in your instance. If you're interested in this, [**subscribe now**](https://internalnote.com/#/portal/signup/63ff05d99deb9e003d619e70/yearly) to my blog, cause I'm working on an article documenting how to deploy this via GitHub Actions..
[Announcing support for help center themes in ZCLIAnnounced on Rollout on July 13, 2023 June 28, 2023 We are super excited to announce that we have released support for help center themes in ZCLI for our theme developers. This announcement…Zendesk helpGorka Cardona-Lauridsen](https://support.zendesk.com/hc/en-us/articles/5919699832602-Announcing-help-center-theme-support-for-ZCLI?ref=internalnote.com)
### Support for Third party copy-pasting
To wrap up the Guide Improvements this month: Zendesk announced some improvements in the way they handle copy-pasting content from Google Docs, Word e.a. in the article editor.
[Announcing support for copying and pasting content from third-party document typesAnnounced on Rollout starts Rollout ends June 30, 2023 March 2023 March 2023 We are excited to announce that in March of this year, we released a series of improvements to streamline the proc…Zendesk helpKatarzyna Karpinska](https://support.zendesk.com/hc/en-us/articles/5876866227098?ref=internalnote.com)
## Also announced
- There's a bunch of new Zendesk SDK Demo Apps available with up to date Swift code explaining on how to deploy the Zendesk SDK in your iOS apps.
[GitHub - zendesk/zendesk\_sdk\_demo\_apps\_ios: iOS demo applications for the Zendesk SDKiOS demo applications for the Zendesk SDK. Contribute to zendesk/zendesk\_sdk\_demo\_apps\_ios development by creating an account on GitHub.GitHubzendesk](https://github.com/zendesk/zendesk%5Fsdk%5Fdemo%5Fapps%5Fios?ref=internalnote.com)
- Ever since the new Group SLA's arrived and Zendesk introduced the new Total Resolution Time metric the SLA admin page became a bit long and cluttered. The page now [got a new layout](https://support.zendesk.com/hc/en-us/articles/5838451139482-Announcing-a-redesigned-SLA-admin-page?ref=internalnote.com) with a clearer overview and the option to set different calendar types for Reply, Resolution and Update metrics.
# 💡Insights
[Can customers open a separate conversation with an ongoing conversation in the Web Widget?Question How can customers start a new conversation from the Web Widget when they have an ongoing one? Answer This isn’t possible. When an existing conversation is ongoing, end users cannot create…Zendesk helpAlex](https://support.zendesk.com/hc/en-us/articles/5924471230490?ref=internalnote.com)
# ⚠ Major Changes
## Discontinued Apps
Zendesk is removing a bunch of old apps from the Zendesk Marketplace. These apps are all either replaced with native functionality in the new Agent Workspace, or there are better third party alternatives available.
[Announcing the discontinuation of select Built-By-Zendesk appsAnnounced on Discontinuation date July 10, 2023 January 10, 2024 Zendesk will be discontinuing the eight apps detailed below on January 10, 2024, because their existing capabilities have been…Zendesk helpKolten Kittleson](https://support.zendesk.com/hc/en-us/articles/5500321965978?ref=internalnote.com)
## Secure App Settings
Zendesk also issued an update to their documentation for Secure App settings with an extra warning on including default API keys or authentication keys in your apps' setting bundle.
> **Warning**: The `secure` property has no effect on the `default` property if specified. The value of `default`will remain public and should not contain any sensitive information. If your app uses OAuth and requires a client secret, you can use the manifest's `oauth` parameter instead. See [oauth](https://developer.zendesk.com/documentation/apps/app-developer-guide/manifest/?ref=internalnote.com#oauth) in the manifest reference.
# 🎥 Videos
> I work for Premium Plus and we're an Ultimate partner. This post was not sponsored.
# 📝 Articles this month
- [Redirect Rules for Zendesk Guide](https://internalnote.com/redirect-rules-for-zendesk-guide/)
- [Pre-filling custom fields in the Zendesk Bot with Messaging Metadata](https://internalnote.com/messaging-metadata/)
- [Show restricted articles in Zendesk Bots](https://internalnote.com/show-restricted-articles-in-zendesk-bots/)
- [Quick Look at the new Essentials Card in Zendesk](https://internalnote.com/essentials-card/)
# And finally...
Undocumented for now but Zendesk added the option to add an Internal Note (😇) to your tickets. Weirdly, depending on your instance you get one of these three options, or not at all.
Weird.


### Redirect Rules for Zendesk Guide
URL: https://internalnote.com/redirect-rules-for-zendesk-guide/
Last updated: 2025-09-08T06:42:26.000Z
When it comes to providing efficient and good customer care the three biggest items are self service, context and omnichannel.
You have to be where your customers are (omnichannel), you have to know your customers and make it easy for agents to retrieve information (context) and you have to allow customers to find and resolve items themselves (self service) in order to provide quick and frustration less support to your customers.
Self Service starts with your Help Center content. Ideally your Help Center articles should each handle one topic and resolve one specific issue so that both search, autoreply, the agent knowledge panel and your bots can offer the right information at a glance to your customers and agents.
Using Zendesk Explore and Content Cues allows you to get insight in your articles and find the articles that should be optimised. But what happens is that you archive old or redundant articles, you split long articles into multiple short ones, or merge related topics to avoid query confusion.
Sadly, whenever you delete or replace an article with a new one, anyone visiting the old url would get a 404 page with no reference to the original article.
# Classic solution

I used to solve the above scenario in a couple of ways:
- I'd add a `search` object to the 404 page so there is an easy way to find what they're looking for
- I add a `{{promoted_articles}}` block so we can offer popular articles immediately.
```html
Oops
{{#is error 'unauthorized'}}
{{link 'sign_in'}}
{{/is}}
{{#is error 'forbidden'}}
{{t 'not_authorized'}}
{{/is}}
{{#is error 'not_found'}}
{{t 'nonexistent_page'}}
{{t 'mistyped_address_or_moved_page'}}
{{/is}}
{{search scoped=settings.scoped_kb_search submit=false}}
{{#if promoted_articles}}
{{t 'promoted_articles'}}
{{#each promoted_articles}}
{{title}}
{{/each}}
{{/if}}
```
This does however not resolve the main issue: if a user clicks on a link for article X, and article X got deleted or replace with article Y, they still reach dead end without context or an easy way to find the actual content.
# Redirect Rules
Luckily, this issue is now resolved 🥳.
Zendesk Guide now has an API endpoint for redirect rules. In short this allows you to send people who open article X to article Y automatically.
When is this useful?
- You have an existing popular article that got replace by a newer article.
- You have deprecated or replaced a service and want to redirect visitors of those articles to the page explaining the removal of the service
- You have released a brand new version and want to send all visitors of the old product to the new product documentation instead
- You merged to articles and want visitors of one article to be send to another
## How does it work?
Currently the API endpoint is fairly limited, but does offer the basics we need. We can redirect articles, sections and community topics to any other resource.
Examples of help center URLs that can be redirected:
```
/hc/en-us/articles/1138
/hc/en-us/community/topics/1977
/hc/en-us/sections/1984
```
But you can also redirect — so called — vanity urls. This is useful if you want to prevent dead links after a migration to Zendesk, and replicate your legacy faq paths, or want nice urls to redirect to a specific article.
```
/faq/how-to-update
/help/1138
/announcements
```
You can find the full documentation in [this Help Center article](https://developer.zendesk.com/api-reference/help%5Fcenter/help-center-api/redirect%5Frules/?ref=internalnote.com) but in essence you can set a `from`, `to` and `status` value for each redirect you configure, and optionally a `brand` value for environments with multiple brands configured.
The API supports the following HTTP Statuses, from which 301 and 302 will probably be the most used ones.
| HTTP Status | Meaning |
| ----------- | ----------------------------------------------------------------------------------------------- |
| 301 | Moved Permanently - The requested resource has been permanently moved to a new location. |
| 302 | Found - The requested resource has been temporarily moved to a different location. |
| 303 | See Other - The response to the request can be found under a different URL. |
| 307 | Temporary Redirect - The requested resource has been temporarily moved to a different location. |
| 308 | Permanent Redirect - The requested resource has been permanently moved to a different location. |
## Creating or Updating a Redirect Rule
To create a Redirect Rule you need to `POST` to `/api/v2/guide/redirect_rules`.
```json
{
"redirect_rule": {
"redirect_from": "/hc/en-us/articles/123",
"redirect_status": 301,
"redirect_to": "https://support.example.com/hc/en-us/456"
}
}
```
The `redirect_from` is the URL your customers are visiting. It can be either an article `/hc/en-us/articles/1138`, community topic `/hc/en-us/community/topics/1977` or help center section `/hc/en-us/sections/1984`.
💡
Note that the URL only accepts the ID of an article. If the URL contains a slug (e.g (1234-article-title) you should only use 1234.
The `redirect_to` can be any URL as long as it is a HTTP(s) url or starts with a `/` . The latter will use the Help Center base URL as a prefix.
Note that if there already is a rule with the same `redirect_from` URL that the existing one will be overwritten and your `POST` will act similar as an update.
Similarly, to remove a rule, you should first list all rules via a `GET` command, then retrieve the `ID` of the rule you want to delete, and then to a `DELETE /api/v2/guide/redirect_rules/{redirect_rule_id}`. (Remember that deleting a 301 permanent redirect can do weird things with Google indexing)
## Example
I've use to have an article that explained how to subscribe to this blog at an path [https://support.internalnote.com/hc/en-us/articles/12677034076434](https://support.internalnote.com/hc/en-us/articles/12677034076434?ref=internalnote.com)
That article has since been migrated to a native page on the blog, but I reference that article in multiple places. So by adding a redirect rule with the following payload, I can make sure people end up on the right page.
```json
{
"redirect_rule": {
"redirect_from": "/hc/en-us/articles/12677034076434",
"redirect_status": 301,
"redirect_to": "https://internalnote.com/#/portal/signup/63f0d0f4034c3d004d5ef75a/yearly"
}
}
```
Which means that, whenever someone visits [the article](https://support.internalnote.com/hc/en-us/articles/12677034076434?ref=internalnote.com), they will get redirected to the [signup page]({ "redirect%5Frule": { "redirect%5Ffrom": "/hc/en-us/articles/12677034076434", "redirect%5Fstatus": 301, "redirect%5Fto": "https://internalnote.com/#/portal/signup/63ff05d99deb9e003d619e70/yearly" } }) for my blog.
> Which reminds me: did you subscribe yet? It's free, or optionally paid, and really helps this website to grow!
# Advanced Redirects and wish list
Another fun setup is something like the following
```json
{
"redirect_rule": {
"redirect_from": "/jurassicpark",
"redirect_status": 302,
"redirect_to": "https://support.internalnote.com/hc/en-us/search?utf8=✓&query=jurassic+park"
}
}
```
This rule gives you a shorthand for searching the Help Center for specific articles.
But what I'd really love to see is a way to have regex support for the redirect rules like e.g. [Next.js has](https://nextjs.org/docs/pages/api-reference/next-config-js/redirects?ref=internalnote.com#regex-path-matching) so we can use one rule to redirect a bunch of matching articles.
But for now, if you've recently migrated from a competitor and you want to bulk redirect all old Freshdesk URLs like `https://support.domain.com/en/support/solutions/folders/7000008400` to matching articles on Zendesk, this API certainly comes in handy, even though it’s going to require a lot of API calls to setup each redirect one by one.
As a last feature request, it would be nice to have some reporting on this so we know which redirects are (un)used for SEO optimization.
## Conclusion
I love how Zendesk keeps improving the Help Center website experience even though the focus of most customercare is moving to chatbots and conversational design.
But (seemingly) simple things like adding redirects makes Guide so much more powerful.
What will you use it for?
## Sign up for Internal Note
Turning Zendesk into practice. – A newsletter about Zendesk written by Thomas Verschoren.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
### Pre-filling custom fields in the Zendesk Bot with Messaging Metadata
URL: https://internalnote.com/messaging-metadata/
Last updated: 2025-07-21T10:01:55.000Z
Last week's article [showed](https://internalnote.com/show-restricted-articles-in-zendesk-bots/) how Zendesk now allows you to show restricted Help Center articles in Guide, removing one of the final missing items for feature parity between the Classic Widget and Messaging from the list.
Less than a week later they released another update to Messaging that resolves maybe the biggest open item on that list:
[Announcement: Introduction to Messaging MetadataIntroduction We are very excited to announce the introduction of Metadata APIs to be used with our flagship Messaging product. This capability will allow our customers to send metadata relating to…Zendesk helpMick O’Donnell](https://support.zendesk.com/hc/en-us/articles/5868905484442?ref=internalnote.com)
In short, it is now possible to fill in custom fields in the Messaging flows via a bit of code and preselecting dropdown, pre-filling text fields or checking checkboxes without user interaction.
This not only enables now flows in your Conversational Bot, but also removes manual actions that used to be done by your users: you can enter order numbers, select a venue, tag conversations with VIP, or set values you can use in API calls (retrieve an order) or branched conditions in your flows.
This is all done with one fairly simple line of code:
```javascript
zE('messenger:set', 'conversationFields', [{ id: 'id', value: 'string'}]);
```
Let's dive in!
# Pre-filling Ticket Fields
To demo this new feature I've build three demo environments:
- [Movie Picker](https://demo.internalnote.com/prefill?ref=internalnote.com) \- a demo on how to pre-fill a text field and use the input to make an API call.
- [Star Tours](https://demo.internalnote.com/startours?ref=internalnote.com) \- a demo on how to choose a dropdown option and handle the choice via conditional branching.
- [VIP Flow](https://demo.internalnote.com/proactive-contact.html?ref=internalnote.com#vip) \- set a VIP tag whenever a VIP customer is logged in and contacts you via the bot.


## 🥳 Thanks for reading Internal Note
If you like this kind of content, please consider ****subscribing** via email or ****share** the article to your colleagues.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# Demo Flow 1 - Pre-fill a text field
This demo builds on top of the [Ask for Details](https://internalnote.com/flow-builder-ask-for-details/) article that I published earlier this year. It runs as follows:
- A user enters a movie in the bot flow
- We make an API call to retrieve info about the movie
- We show the returned info (title, director, release year) as a result.
Now that we can pre-fill data in the Messaging Flow we can make this flow a bit nicer. We can e.g. show a list of movies on our website, and whenever the customer selects a movie we fill in the movie field with its title, and open the widget.
## Setup
The first item you need for this flow is a ticket field to capture the Movie Title. Note down the `Field ID` which is part of the URL while editing the ticket field in the Admin Center: [https://domain.zendesk.com/admin/objects-rules/tickets/ticket-fields/**7662882404114**](https://d3v-verschoren.zendesk.com/admin/objects-rules/tickets/ticket-fields/7662882404114?ref=internalnote.com)

## Bot
To see how to build this bot, please refer to this earlier article.
[Flow Builder - Ask for detailsThe new Ask For Details option in Flow Builder allows you to pull in contextual information via API into your Zendesk Chat Bot.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-ask-for-details/)
One extra I added to make the flow easier to discover is create a proactive message that preselects the **🎬 Movie Info** intent in the Admin Center. This is an optional step but makes it easier for customers to discover the demo.
However, if we pre-fill the fields they will also show up as filled in without selecting an intent in advance.


## Website
The final part is the actual new part of this release.
We're going to pre-fill our custom field with the value of a selected movie.
[https://demo.internalnote.com/prefill](https://demo.internalnote.com/prefill?ref=internalnote.com)
The first step is creating an array of movie posters to click on. Note that we add a `data-target` value to each poster so we know which poster was clicked on.
```html
```
Next we react to a click on a `.movie` and set the custom field with the `Field ID` we copied earlier to the `data-target` of the selected item.
And finally we open the widget to start the conversation.
```javascript
$(document).ready(function() {
$('.movie').click(function(){
var movie = $(this).data('target');
zE('messenger:set', 'conversationFields', [
{ id: '7662882404114', value: movie}
]);
zE('messenger', 'open');
})
});
```
Note that even if we preselect a movie, the customer will still be able to see and change the value.

## Use Cases
You can adapt this flow in a myriad of ways:
- Whenever a customer is looking at an order in their order history you can fill in the Order Number field in your bot flows so that any conversation starts references that order
- If a customer is looking at a product page you can fill-in the SKU number so you know what item they're interested in
- Since we can not yet pass user metadata other than email or name, you can fill in a customer id or membership number field with the value of their profile
- If a customer needs help with changing a booking you can launch the widget, pass the conversation to an agent and already pre-fill in their booking number.
# Demo Flow 2 - Pre-fill a dropdown
This next demo doesn't use a text field but makes use of drop-down with a preset list of options.
In this demo we show 3 holiday locations in a galaxy far, far away. When the user selects a destination we pre-fill the location in the messaging flow and when the customers interacts with the bot we'll use this value to branch to the right flow.
## Setup
Step one is creating a dropdown with a list of locations in the Admin Center. Note down the `Field ID.`

.
## Bot
Next up we create a new intent for our bot. For a full breakdown on how to build complex Conversational Bot flows, take a look at this article:
[Learn how to build a full-featured Flow Builder Bot for Zendesk.In this article we will build a full-featured Flow Builder Bot for Zendesk. We’ll use every step type, use API calls and variables and show you how to create a bot yourself in a full length video tutorial.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-dinosaurs/)
Our intent functions as follows:
1. We add an *Ask for Details* step where we ask to select a location by adding the `Holiday Location` field to the Ask for Details step. We'll call this: Pick a Location.
2. We add a *Branch by Condition* step with 3 branches.
1. `Pick a location is Hoth`
2. `Pick a location is Tatooine`
3. Else (the last option)
3. For each branch we add some text, an image and a *Was this helpful?* step



And finally we add a new proactive flow. This is optional, but by using this flow we can select the *Intent* and immediately jump to it when the page loads.


## Website
The logic for this step is similar to the first demo.
[https://demo.internalnote.com/startours](https://demo.internalnote.com/startours?ref=internalnote.com)
First we create a list of locations. Each location has a `data-target` with a location name that matches the `tag` of the dropdown we created earlier.
```html
```
Next we react to a click event and pre-fill our field by setting the `id` to the `Field ID` and the value to the chosen location.
```javascript
$(document).ready(function() {
$('.location').click(function(){
var location = $(this).data('target');
zE('messenger:set', 'conversationFields', [
{ id: '12367640319506', value: location}
]);
zE('messenger', 'open');
});
});
```

## Use Cases
Based on the above there's a few scenario's where this could be useful:
- You're a hotel chain with multiple locations. If a user looks at a specific hotel you can preset the *Hotel* dropdown so you can route the requests to the right team
- You've got a request type field that's used to route between Support issues and Sales inquiries. Based on the page the customer is looking at (Support page or Product page) you can preselect the request type.
- For logged in customers you can set the "Are you already customer" field to yes, and no for others.
## Demo 3: Setting tags
You can set Tags. These tags will only be applied to the created ticket once a conversation has started, and cannot (yet) be used on conditions within the bot flow.
```javascript
zE("messenger:set", "conversationTags", ["vip", "gold"])
```
For example, on [this](https://proactive.internalnote.com/contact.html?ref=internalnote.com#vip) demo page whenever our VIP logs in, we set a tag `VIP` to the conversation, and we wipe the tag for all other users:
```javascript
if (vip) {
Login({
name: 'Vito Corleone',
email:'vito+'+random+'@corleone.example',
external_id: random
});
zE("messenger:set", "conversationTags", ["vip"])
} else {
Login({
name: 'Maximus Decimus Meridius',
email:'maximus+'+random+'@example.com',
external_id: random
});
zE("messenger:set", "conversationTags", [])
}
```
# Final notes on Messaging Metadata
There's a few caveats when using the new feature.
Fields are always visible to the end-user and are you can't make them read only like you could with the [Classic Widget](https://developer.zendesk.com/api-reference/widget/settings/?ref=internalnote.com#fields).
One final "issue" is the fact that once the customer has started a conversation you can't update the values anymore.
Also, you can set multiple fields at once by adding more items to the array
```javascript
zE('messenger:set', 'conversationFields', [
{ id: 1234, value: 'text_string'},
{ id: 5678, value: true},
{ id: 1977, value: 'dropdown_option'},
{ id: 1138, value: 42}
]);
```
To wrap this up, this release is one that's been on my [Wishlist](https://internalnote.com/zendesk-messaging-feedback/) for a long time and makes more complex flows possible. Are there things I still want? Sure, hiding pre-filled fields, making them read only, selecting an intent via the same API, ... are just a few of them.
What do you think of this new feature? Which flows does it unlock for you?
### Show restricted articles in Zendesk Bots
URL: https://internalnote.com/show-restricted-articles-in-zendesk-bots/
Last updated: 2024-08-19T20:39:20.000Z
One of the core tenants of a good customer care setup is a way to allow customers to self service. This not only deflects tickets and lowers the workload of your agents, but also allows customers to resolve issues faster, leading to a higher CSAT.
For this reason the more Help Center articles are made publicly available to all of your customers (and Google..), the better your self service approach will work. Customers will search your Help Center, interact with your Bot, or get auto replies with these articles as your first line of defence.
But sometimes you want articles to be available to only a subset of users. Maybe you use Zendesk for an Internal Help Desk, and you want your IT guidelines only visible to your employees. Or you are a hotel and have special amenities only available to your VIP guests. Or you have support articles that should only be visible to customers who buy a specific product or support SLA.
This is where user segments and restricted articles in Zendesk Guide come in. You can create segments of users based on tags or organisations, and then make articles only available to those segments. These articles are then invisible to guest users, or logged in users outside of the segment, but will be searchable and readable to logged in users that do belong to the segment.
💡
Did you know you can make (parts) of your restricted articles visible to everyone to improve discovery? [Read the article](https://internalnote.com/zendesk-guide-membersonly/)!
Up till now this would not work for conversations started via Zendesk Messaging on the Web. The Zendesk Bot did not care about segments, and even if you authenticated your user, it would only show publicly available articles. But this has now changed!
[Announcing new updates for Zendesk bots that improves employee experiencesAnnounced on Rollout starts Rollout ends July 4, 2023 July 3, 2023 July 6, 2022 We are excited to announce the following releases for Zendesk bots Conversation bots can now be deployed on Sl…Zendesk helpLisa Tam](https://support.zendesk.com/hc/en-us/articles/5879606612506?ref=internalnote.com#h%5F01H45EYPVJ3FK55SNRAV8FVAZ9)
Any user that interacts with your Bot within the Zendesk Web Widget can now search for and see restricted articles, provided they are authenticated. Flow Builder even allows you to add restricted articles as part of the Show Articles step in your flows.
When an anonymous user uses the widget restricted articles will not be part of the suggested articles via search. For authenticated users they will appear if they match their segment.
Similarly, if you add a restricted article to a "Show Articles step", they'll show up as a generic card without exposing any titles or content. For authenticated users the system will show the restricted articles' title and a snippet of the content.
If you want to you can jump into the Bots' settings and make the metadata of suggested restricted articles visible to everyone regardless of logged in status. But watch out, the snippet might expose article content you don't want to be visible to the world!

## **What do you need to get this to work?**
Since you are interested in using this feature in Messaging we can assume you already have segments on your Help Center, allow users to login and restrict some articles to those segments.
So, to get started with restricted articles in Zendesk Bot, you basically only need to enable Authentication for Messaging and you're done. Luckily, I've got an entire article on this topic:
[Authenticate Zendesk MessagingZendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.Internal NoteThomas Verschoren](https://internalnote.com/jwt-messaging/)
# **Example Flow**
As explained in the overview above, by default Zendesk will show restricted articles as placeholders to unauthenticated users.
In this article we will build a bot flow that will **only** show restricted articles to logged in users if applicable, and will fall back to only show public articles to everyone else. A bit more complex of a setup.
You can test it out by going to our demo page.
[Internal Note - Zendesk Messaging AuthenticationDemo page to showcase the JWT Authentication for Zendesk MessagingZendesk Messaging AuthenticationInternal Note](https://jwt.internalnote.com/?ref=internalnote.com)
If you log in as `vito@corleone.example` you'll get the VIP experience. If you log in as `john@example.com` you'll get the regular flow.


# Bot Setup
We'll build a dedicated bot flow to show this new functionality. It flows as follows:

## 🥳 Thanks for reading Internal Note
If you like this kind of content, please consider ****subscribing** via email or ****share** the article to your colleagues.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
1. We check via `conditions` if the user is authenticated or not.
2. If they are authenticated we use an `API Step` to retrieve their data from the Zendesk instance.
3. We check the returned user data for a `VIP tag` and if they are a VIP we show the segmented article to them.
4. In all other cases we show a more generic reply with public articles.
## Assumptions
1. You have a working Messaging Authentication flow.
2. You have created a [User Field](https://support.zendesk.com/hc/en-us/articles/4408822051866-Adding-custom-fields-to-users?ref=internalnote.com) of type `checkbox` that sets a `vip` tag to a user
3. You have created a [User Segment](https://support.zendesk.com/hc/en-us/articles/4408837707290-Creating-user-segments-for-Guide-user-permissions?ref=internalnote.com) in Guide that contains all users with a `vip` tag
4. You have an article that is restricted to that [segment](https://support.zendesk.com/hc/en-us/articles/4408824005914?ref=internalnote.com).
## Check if the user is authenticated
Since restricted articles only show up for logged in users if they match the segment applied to the ticket, being logged in is a first requirement for showing these articles and displaying a title and snippet.
All you need to do is use a `Branch Condition` step and check for `Authentication status is true` in the conditions.


## Retrieve customer data via API
Now that we know if the user is logged in, we need to check if they are a VIP user or not. In our scenario we created Guide segment for users that are tagged with `vip`. This tag is set by a User Field of type checkbox called VIP.
Since Zendesk does not allow to add any tags to the authentication payload, and since we can only use email and name as native variables inside Bot Builder, we need to retrieve this data from Zendesk itself via the API.
We use a `Make API call` step to call the Zendesk search API to search for users that match our authenticated users' email address. It's not the most elegant way, but it's what's available for now.
### Connections
Before you can make an API call you need to go to *Admin Center > API and Integrations > Connections* and add a **two** secure connection.
1. **zendesklocal**
Use `Basic Authentication` as the type and add an admin email address followed by `/token` and a Zendesk API token.
Add `https://*.zendesk.com` as the allowed domain
2. **zendeskwidget**
Use `Basic Authentication` as the type and add an admin email address followed by `/token` and a Zendesk API token.
Add `https://*.yourhelpcenterdomain.com` as the allowed domain
💡
We need to run a test API call in the next step to set the required variables. Since the test runs from your Zendesk admin panel, and the widget will run from your Help Center we need to (temporarily) create two connections. One for setup, one for production.

### API Call
Once we have the connections setup we can add the `API call` step to our bot flow. Set it as a step in the `Is Authenticated` branch
1. Endpoint URL
Set it to [https://d3v-verschoren.zendesk.com/api/v2/search?query=type%3Auser%20email%3A](https://d3v-verschoren.zendesk.com/api/v2/search?query=type%3Auser%20email%3A{{system.user.email}}&ref=internalnote.com) followed by pressing the {+} button and add the *Messaging Metadata > provided email* as a variable
2. Authentication
Choose the `zendesklocal` authentication method
Next press Make API Call to do a testrun. The system will fetch a random user. Scroll down the *Variables* list and expand until you see the `user_fields` and click on the *Save button* next to the VIP field to store it as a variable called `vip`. In our example, since it's a checkbox it has either a true or false value.



3\. One final step before wrapping up and saving this step is to swap the API Authentication method from `zendesklocal` to `zendeskwidget`.
Even though we can assume the user exists (they can log in) they might not yet have any interaction with Zendesk yet, so there might not be a user profile. So this API call can fail.
## Check for VIP Tag
Now that we have an authenticated user and we have stored their VIP status in a variable we can **finally** check if our user is a VIP user.
We'll use another `Branch by Condition` step for this one. Add the step in the `API Call Successful` and set the IF condition to `vip = true`


## Show Segmented articles
Now that we know we have an authenticated user that is a VIP we can safely show them restricted articles for their section and we can be sure that the user will see the title, snippet and will be able to see the entire ticket if they click the link.
1. Add a `Show Help Center Articles` step in the is VIP branch
2. Search through your list of article and select the (restricted) article you want to show

💡
For all other branches (Not authenticated, not found, not a VIP) you can create other flows. Since all three should probably get very similar flows, you can create a flow for one branch and copy it to all other branches.
This can be done by right clicking the top step of a branch, and choose "Copy this step and all below". Right click on an empty branch and choose "Paste steps"
# Wrap up
I think it's fair to say that *finally* is a word to use in this context. Showing restricted articles has been an existing feature in the Classic Widget, and the lack of support in Messaging made it impossible for most Business-to-Employee or Internal use cases to move to Messaging and the new Zendesk Bot.
This new flow elegantly builds on the work done for Zendesk Messaging authentication and works without any complex custom work for most environments. The flow above is a bit more complex by design because I wanted to **only** show restricted articles to users that can access them, but in most other scenario's it will just work.
🫣
There is [still some weirdness](https://internalnote.com/deepdive-into-messaging-profiles/) going on with authentication and mapping messaging authenticated users to existing end users that never interacted with messaging. Until this is fixed (and Zendesk maps based on email addresses) your logged in users might not be part of the segments their email counterparts belong too..
##
##
### Zendesk Roundup for June 2023
URL: https://internalnote.com/zendesk-roundup-for-june/
Last updated: 2023-10-12T14:08:02.000Z
June was Zendesk Showcase month with Zendesk holding a bunch of mini-Relate events across the world. I got invited to the local Showcase in Utrecht where we spend the afternoon watching presentations about all the new releases.
The event opened with a keynotefrom Zendesk EMEA CTO Matthias Göhler going over all the new features launched at Relate. Most of it was already known if you watched the main event in May, but I really liked his focus on our EMEA market and especially the way OpenAI, Privacy and GDPR interact.
Paraphrasing Göhler:
> The Zendesk Suggested Reply feature is in EAP and will remain so until OpenAI is GDPR compliant. So use it at your own risk.

Up next was an awesome product deep dive from one of Zendesk's EMEA consultants. He took everything Zendesk announced in the last year and turned it into a nice story that really showed how these items could impact actual workflows.
To wrap things up we had a round-table with Sarah Al-Hussaini (COO @ [Ultimate](https://ultimate.ai/?ref=internalnote.com)) and a few other Zendesk people and customers on AI and the impact on CX.
And now, the updates for June!
## 🥳 Thanks for reading Internal Note
If you like this kind of content, please consider ****subscribing** via email or ****share** the article to your colleagues.
Subscribe
Email sent! Check your inbox to complete your signup.
No spam. Unsubscribe anytime.
# 🎉 New Releases
## Zendesk Guide Updates
- Zendesk updated their Guide Templates to a new v3 release with a focus on adding improved rich text editing and accessibility features. The Copenhagen theme has been updated automatically, custom themes will get the features once new versions are released. (like the ones my team at [Premium Plus](https://www.zendesk.com/marketplace/themes/?query=premium+plus&ref=internalnote.com) built)
[Announcing Templating API v3 with improved rich text editorAnnounced on Rollout starts Rollout ends June 1, 2023 June 1, 2023 June 8, 2023 We’re releasing v3 of the help center Templating API, which introduces a better rich text editor (RTE) and fix…Zendesk helpGorka Cardona-Lauridsen](https://support.zendesk.com/hc/en-us/articles/5762406613530?ref=internalnote.com)
- You can now configure Guide security settings to allow restricted content to appear in the body of notification emails sent to section followers. This used to be bug where those emails would not show/load images, and this has now been fixed.
[Announcing an update to new article in section e-mail notificationAnnounced on Rollout starts Rollout ends June 22, 2023 June 22, 2023 June 22, 2022 We are excited to announce that you can now configure the way in which article notification emails are sent…Zendesk helpKatarzyna Karpinska](https://support.zendesk.com/hc/en-us/articles/5838337923866-Announcing-an-update-to-new-article-in-section-e-mail-notification?ref=internalnote.com)
## Side Conversations
Side Conversations got a bit of love this month. The new [context panel location](https://support.zendesk.com/hc/en-us/articles/4486696180378-Announcing-side-conversations-in-the-context-panel?ref=internalnote.com) is still in EAP, but in the meanwhile the Microsoft Teams feature is now available for all.
If you want to configure this new channel, note that Side Conversations have [moved](https://support.zendesk.com/hc/en-us/articles/5852242092186-Announcing-a-change-to-side-conversations-settings?ref=internalnote.com) to a new location in Settings.
[Using Microsoft Teams in side conversationsWhat’s my plan? Side conversations are spaces in a ticket where agents can have a conversation with a specific group of people, or discuss a specific area of concern or…Zendesk helpColleen Hall](https://support.zendesk.com/hc/en-us/articles/5191537451290?ref=internalnote.com)
## Messaging Voice API
Launched late last month, Zendesk now allows you to enable calls via the Zendesk Messaging widget, powered by their Digital Talk lines. It's a half-launch since it's not yet integrated with Bot Builder or the widget, but with a bit of custom code you can easily enable this feature anywhere on your website or Help Center.
[Voice API powered by Zendesk MessagingYou can now let your customers place calls via the Messaging Widget. This article shows you how, and explains how to integrate Voice with your Zendesk Bot.Internal NoteThomas Verschoren](https://internalnote.com/voice-api-for-zendesk/)
## Capacity Management for Messaging
Omnichannel Routing is a big new feature in Zendesk that will underpin most of the new developments in Zendesk like Agent Home, Intelligent Triage and Agent Status. Zendesk has been adding features to their platform for over a year now to build up Omnichannel Routing to a powerful engine that will replace existing triggers and views.
This month they added support for routing Messaging Tickets based on their (in)activity.
[Announcing assignment and capacity management for messaging in omnichannel routingAnnounced on Rollout on June 15, 2023 June 15, 2023 Zendesk is pleased to announce a new setting to help you manage omnichannel routing capacity rules for messaging tickets. What’s changing?…Zendesk helpPrakruti Hindia](https://support.zendesk.com/hc/en-us/articles/5785684459418-Announcing-assignment-and-capacity-management-for-messaging-in-omnichannel-routing?ref=internalnote.com)
## Also announced
- **Total Resolution Time** was [added](https://support.zendesk.com/hc/en-us/articles/5785457764634-Announcing-a-new-SLA-metric-Total-resolution-time?ref=internalnote.com) as a new SLA metric which measures the total lifetime of a ticket across all statuses.
- **When you resize the composer window in a ticket** in the Agent Workspace, the window size is saved across multiple tickets. It stays the same until you resize it again. See [Composing messages in the Zendesk Agent Workspace](https://support.zendesk.com/hc/en-us/articles/4408831849882?ref=internalnote.com#topic%5Fs55%5Fzzg%5Frmb).
- Zendesk **fixed** an issue where tickets got **bad CSAT scores** due to link expanders in email clients accidentally clicking those links. Zendesk now updated their systems to prevent these kind of automatic clicks.
# ⚒️ EAPs
## Agent Home
The new Agent Home has been made available in beta for all interested customers. It replaces the classic Agent Dashboard and deeply integrates with Omnichannel Routing to give your agents a clear overview of work to be done.
[➕ Overview of the new Agent HomeAgent Home is a new way for your Zendesk agents to interact with tickets and conversations that focusses on work to be done in a nice overview. Read the article to read my first impressions!Internal NoteThomas Verschoren](https://internalnote.com/agent-home-beta/)
## A powerful enhancement for the Layout Builder EAP
Layout Builder is a new feature in Zendesk that allows you to create custom interfaces in Zendesk. You can move elements like the conversation view, ticket fields, sidebar apps or intelligent panel anywhere in the UI, you can hide elements, or make elements bigger and smaller.
The EAP has been available for a while now, but it got a major update by integrating with Contextual Workspaces. This new enhancement allows you to dynamically trigger your custom layout by brand, group, ticket status, form, and much more.
One of the next updates *should* also allow for pinned custom apps in the sidebar so they are even easier to reach for your agents.
[\[Release announcement\] Layouts + Contextual Workspaces is now live for EAP customers. You can now apply custom layouts based on brand, group, form, and more!Hi everyone, thanks for using Layout Builder and providing feedback through the various channels. One major feature request that has bubbled up is the ability to apply a custom layout to a particul…Zendesk helpPaul Von](https://support.zendesk.com/hc/en-us/community/posts/5706915959578-Upcoming-summer-release-of-Layouts-Contextual-Workspaces-will-allow-application-of-multiple-layouts?ref=internalnote.com)
# 💡Insights
Zendesk's documentation team has been on a roll recently and wrote a couple of handy flows to setup in Messaging:
- [Bypassing the 24-hour rule with macro's](https://support.zendesk.com/hc/en-us/articles/5869718332954?ref=internalnote.com)
- [Notify customers that a department is offline](https://support.zendesk.com/hc/en-us/articles/5746602384794?ref=internalnote.com)
- [Check agent availability within a bot conversation](https://support.zendesk.com/hc/en-us/articles/5706660392602?ref=internalnote.com)
I really like this renewed focus on recipes and how-to's in Zendesk's Help Center resources. Explaining practical flows that build on top of Zendesk is one of the reasons I started this blog, and Zendesk itself also writing this kind of stuff is a pretty good motivation to keep this blog going.
# ⚠ Major Changes
Agent Workspace, Messaging and Omnichannel routing are powerful additions to the Zendesk platform that have seen a rather slow pickup since it has a big impact on how agents work.
The end result is better experiences for both customers and agents, but logically, most Zendesk users have been a bit hesitant in deploying big changes to their environments.
However, recently Zendesk started to aggressively push activations of the above features to more and customers for [messaging](https://support.zendesk.com/hc/en-us/articles/5637090228250-Announcing-assisted-messaging-activations?ref=internalnote.com) and [omnichannel routing](https://support.zendesk.com/hc/en-us/articles/5716181238938-Announcing-automatic-activation-of-omnichannel-routing-?ref=internalnote.com).
You'll get an email from them once you're eligible, but you might want to make use of the summer slowdown to look into proactively moving to these features at your own pace.
# 🎥 Videos
[Zendesk has acquired TymeshiftThis morning, we announced Zendesk’s acquisition of Tymeshift! Many of you in the Zendesk Community already know and use Tymeshift, but for those of you who don’t, Tymeshift is an AI-powered soluti…Zendesk helpNicole Saunders](https://support.zendesk.com/hc/en-us/community/posts/5846605714842-Zendesk-has-acquired-Tymeshift?ref=internalnote.com)
# 📝 Articles this month
- [Zendesk Roundup for May 2023](https://internalnote.com/monthly-note-for-may/)
- [Voice API for Messaging](https://internalnote.com/voice-api-for-zendesk/)
- [Sending Automated Messages via WhatsApp with Sunshine Conversations](https://internalnote.com/sunshine-conversation-automations/)
- [Overview of the new Agent Home](https://internalnote.com/agent-home-beta/)
# And finally...
Did you know Zendesk has a build-in feature to check for missing attachments? 😱
[Why do I receive a missing attachment notification when submitting a ticket response?Question When I submit a ticket response, a Missing attachment? notification displays, but my reply doesn’t include ticket attachments. Why do I receive this message? Answer This message is promp…Zendesk helpNatassja Jordan](https://support.zendesk.com/hc/en-us/articles/5710417631258?ref=internalnote.com)
##
### Preview of the new Agent Home
URL: https://internalnote.com/agent-home-beta/
Last updated: 2024-08-19T20:36:03.000Z
Let's start this article with a quick game: one of these screenshots was taken in 2012\. The other was taken today. Can you spot the differences?


When comparing Zendesk 10 years ago and Zendesk today a **lot** has changed. Even Zendesk two years ago is almost incomparable with the version you use today.
Agent Workspace got a full redesign with a lot less visual clutter and integrated tickets, messaging and context. Similarly, the Admin Center completely reworked the Zendesk admin experience with a reworked structure, search and cleaner settings views. All reporting got moved to Explore, and even the Chat and Web Widget experience got a full make-over.
But there's one spot in Zendesk that's always been a big head-scratcher for me: the Agent Dashboard. It's the first element in the Agent Workspace navigation and it's a place I seldom use. The Dashboard contains a random list of priority sorted tickets, and a list of updates and wraps up with a list of stats.
I've seen customers using this view as their main entry point, and discover that there are dozens, if not hundreds of unattended tickets in their views once they click through. And guessing from quick poll I ran on our internal team slack at the office, I guess I'm not the only one not using this part of the Agent Workspace.
# Agent Home
A few weeks ago one of the product managers at Zendesk reached out to me to show a new concept they were working on and ask for some initial feedback. That concept turned out to be the new Agent Home. I had already seen some earlier versions of this new idea in slide decks, but apparently the new Agent Home was not only almost ready, but the beta was launched a few weeks later.
[Announcing Agent Home (beta)Announced on Beta rollout June 13, 2023 June 13, 2023 Zendesk is introducing an updated page in Support, called Agent Home. Agent Home is the one-stop-shop for agents to manage all their work,…Zendesk helpZac Garcia](https://support.zendesk.com/hc/en-us/articles/5785063561242?ref=internalnote.com)
So, what is *Agent Home*? Agent Home is a new dashboard for Agents. It shows Agents an overview of work to be done, as well as a list of recent updated tickets, and easy links to their followed or cc'd tickets.
Normally an Agent would work from the Views tab and most instances have one or more *Action Needed* views that list open or active tickets and work through the list of tickets handling the most urgent, oldest or, if cherry picking, easiest ticket first.
With the arrival of Omnichannel Routing and Messaging we see most instances move away from this shared list of tickets to tickets and conversations getting assigned to agents based on skills and availability.
Instead of a shared list of tickets, agents get tickets assigned to them on a *one-by-one* basis, and reopened or replied-to tickets get reassigned based on context and status. But even though this flow works with a view-based system, it's not ideal.

Enter Agent Home. It's a new overview for agent that takes inspiration from the [Asana Home Page](https://asana.com/guide/help/fundamentals/navigating-asana?ref=internalnote.com) or other task based dashboards. It'll show agent their assigned/routed tickets, active messaging conversations and other tickets that require their attention. Which means that, if you've got your Omnichannel routing (see below) setup correctly, they're gonna work to one view and one view only.

# What about Views?
Now that Agent Home is available, there are now three places in Zendesk to get an overview and insights in tickets: Agent Home, Views, Explore. Their functionality overlaps, but I see them having three distinct use cases and users in mind:
- Agent Home is by nature for agents, it shows **active tickets** and helps them to get their **work done**
- Views are now mostly for Team Leads; they allow to get an **overview of all backlog** in one plays sorted by intent, status, sla or whatever fits your needs. It allows for quick decisions and reassignments based on current workload
- Explore is for Managers. It gives insights and long term data on the status of the entire CX team and allows for longterm decisions.
# Omnichannel Routing
Agent Home is available for all Zendesk environments with Agent Workspace, but Zendesk advices it mostly for users on Messaging and Omnichannel Routing due to its focus on ticket routing and assignment.
Omnichannel Routing is rather new and relatively complex to setup, and I'm planning on a big article about the topic later this summer. So [subscribe](https://internalnote.com/#/portal/signup) if you want to receive the article!
[About omnichannel routing with unified agent statusWhat’s my plan? Omnichannel routing with unified agent status allows you to direct tickets from email (including web form, side conversations, and API), calls, a…Zendesk helpJacquelyn Brewer](https://support.zendesk.com/hc/en-us/articles/4409149119514?ref=internalnote.com)
# Wrap Up
Any change to the old Agent Dashboard would have been an improvement, and even removing that tab all together would have made the product better overal.
But this new Agent Home is pretty amazing. Even with only a week of access I've shifted to this new tab as my main view to work on third line tickets that get escalated to me.
It is a beta though and some features like live refresh, active messaging conversations and filters other than status are not available yet. That being said, it's a solid and stable tool that, in my opinion, can be used in active environments without much change management or training **if you already use omnichannel based routing or have SLA and priority enabled on your instance.**
Do I have a wish list of features? Sure!
- Allow to create filters on intents and store them as quick links in the sidebar
- Allow developers to create new widgets to be shown in the sidebar (Google Calendar? Asana? [Message Board](https://www.zendesk.com/marketplace/apps/support/738366/message-board/?ref=internalnote.com)? Weather?
- Show a colleagues dashboard so I can quickly see workload of my team members as a teamleader.
- Show my requested tickets, show side conversations I'm a part of as filters below the existing Cc'd and Follower views.
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### ➕ Sending Automated Messages via WhatsApp with Sunshine Conversations and Zendesk
URL: https://internalnote.com/sunshine-conversation-automations/
Last updated: 2025-09-08T06:42:44.000Z
In a [previous article](https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk/) I wrote about how you can now use the new Sunshine Conversations in Zendesk Suite to work around the 24h limit for WhatsApp conversations.
There are however a lot more (complex) use cases possible via the Conversations API. Think about sending confirmations or reminders for bookings. Send password reset codes, confirm subscriptions or changes in order status,.. the list goes on.
All this is possible by leveraging two kinds of conversation types: messages, and notifications, whoch both allow you to send messages over social channels like WhatsApp, Instagram, Twitter,...
# Conversation Types
There are two types of conversation updates you can send to your customers.
The first are **comments**. These are replies to existing conversations and can be in the form of Agent replies (via Agent Workspace), free text or templates (both via API). The important part here is that as long as you are in an existing conversation with a customer over e.g. WhatsApp or Instagram DM, you're allowed to send anything to them.
The other type are **notifications**. These allow you to send a message to anyone without the requirement of an existing conversation. You can however only send approved message templates and these notifications come at a higher cost (you're also limited to the amount you can send depending on your verifications state)
**Templates** for e.g. WhatsApp are created via the WhatsApp business portal, other platforms have similar requirements. Check out this [article](https://docs.smooch.io/guide/key-concepts/?ref=internalnote.com#message) for more info.
# Sending messages
There's a few ways we can send out messages:
1. Automated via Zendesk triggers/automations, similar to how we solved the WhatsApp issue, this is ideal for reminders, confirmation messages,...
2. Automated via external platforms like your webshop, booking tool,...
3. Manually by agents in Agent Workspace who can use e.g. a button to trigger a template.
Options (1) and (2) require a webhook and some worker or script that handles the message. (3) can be done via a sidebar app in Zendesk. In this article we'll explore both options.
Let's dive in!
# Messages via webhooks
The easiest way to make a scalable way to interact with Sunshine Conversations is to setup a script *somewhere* that takes messages and users as input, and handles the flow to the Sunshine Conversation endpoints.
For this tutorial I'll assume you have access to Cloudflare Workers (free!) and will handle the WhatsApp channel.
You can copy the entire workflow from the example [GitHub](https://github.com/verschoren/outbound%5Fmessaging?ref=internalnote.com) repository and paste it into a blank Cloudflare Worker via your browser. Just remember to create the required variables as defined below.
[GitHub - verschoren/outbound\_messagingContribute to verschoren/outbound\_messaging development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/outbound%5Fmessaging?ref=internalnote.com)
### Requirements
- **Sunshine Conversations API Credentials**
This can be done via the Admin Center [https://yourdomain.zendesk.com/admin/apps-integrations/apis/conversations-api](https://d3v-verschoren.zendesk.com/admin/apps-integrations/apis/conversations-api?ref=internalnote.com). This gives you an `app_id`, `secret_key` and `key_id`
- **Integration ID for WhatsApp**
You need to know your `integration_id` for WhatsApp. You can find this in Admin Center by selecting your WhatsApp channel and copying the last part of the URL: [https://yourdomain.zendesk.com/admin/channels/messaging\_and\_social/channels\_list/edit/**646b411abc0c536ba1a98263**](https://d3v-verschoren.zendesk.com/admin/channels/messaging%5Fand%5Fsocial/channels%5Flist/edit/646b411abc0c536ba1a98263?ref=internalnote.com)
- Zendesk API Token
You will need a Zendesk [API Token](https://www.google.com/search?client=safari&rls=en&q=zendesk+api+token&ie=UTF-8&oe=UTF-8&ref=internalnote.com), an admin email address, and your Zendesk subdomain.
- You need (at least) one [approved WhatsApp template](https://www.google.com/search?q=create+whatsapp+template&client=safari&rls=en&sxsrf=APwXEdchRzrKGY06VApVE1TPOVf-8VbqFw%3A1685543701718&ei=FVt3ZKW9K-eM9u8P1LyfmAg&ved=0ahUKEwjlm-DM45%5F%5FAhVnhv0HHVTeB4MQ4dUDCA4&uact=5&oq=create+whatsapp+template&gs%5Flcp=Cgxnd3Mtd2l6LXNlcnAQAzIFCAAQgAQyBQgAEIAEMgUIABCABDIFCAAQgAQyCAgAEAUQBxAeMgYIABAIEB4yBggAEAgQHjoKCAAQRxDWBBCwAzoKCAAQigUQsAMQQzoQCC4QigUQxwEQ0QMQsAMQQzoHCCMQsAIQJzoGCAAQBxAeOgcIABANEIAEOggIABAIEAcQHjoICAAQigUQhgNKBAhBGABQ-AJYwQhgwgpoAXABeACAAViIAZMEkgEBN5gBAKABAcABAcgBCg&sclient=gws-wiz-serp&ref=internalnote.com)
### Creating variables
I stored all these inside Cloudflare Workers as Environment Variables:

## Script Overview
The basis script we build has two endpoints: `/notifications` and `/messages` to handle the two use cases mentioned above. Notifications can be send to anyone, but require a template. Messages can be send to active conversations and can contain messages or templates.
1. We check the url pathname for /notifications or /messages
2. We get the input `await request.json()`
3. We handle any errors that occur.
## Sending Notifications
Notifications require two inputs: a user identifier (phone number) and a template name from an approved WhatsApp template.
```json
//POST https://domain.workers.dev/notifications
{
"phone":"1234567890",
"template":"template_name"
}
```
All logic for sending conversations is contained in the `sendNotification()` function. It first creates a `payload` that references the phone, template and integration ID, and then contacts the Smooch API endpoint.
```javascript
async function sendNotification(phone, template, env){
var payload = {
"destination": {
"integrationId": env.sunco_integration_id,
"destinationId": phone
},
"author": {
"role": "appMaker"
},
"messageSchema": "whatsapp",
"message": {
"type": "template",
"template": {
"namespace": "XXXXXXXX_XXXX_XXXX_XXXX_XXXXXXXXXXXX",
"name": template,
"language": {
"policy": "deterministic",
"code": "en"
}
}
}
}
const api_endpoint = `https://api.smooch.io/v1.1/apps/${env.sunco_app_id}/notifications`
const sunco_key = btoa(env.sunco_key_id + ":" + env.sunco_secret_key);
const init = {
body: JSON.stringify(payload),
method: "POST",
headers: {
"content-type": "application/json",
"authorization": "Basic " + sunco_key
},
};
const response = await fetch(api_endpoint, init);
const results = await response.json();
return results;
}
```
## Sending Comments
Where sending notifications is pretty straightforward, sending comments is a bit more complicated. Assuming you start from a known Zendesk user:
1. You need to find the Sunshine Conversations User ID for your user
2. You then need to find the active conversation for that user.
3. You can then send your message.
The comments endpoint expects the following JSON payload. Requester is the user ID of a Zendesk user and message can be any freeform text we want.
```json
// POST https://domains.workers.dev/messages
{
"requester":"1234567890",
"message":"message"
}
```
🔍
If you only know the email of a user, you can search for a user based on the email via `https://domain.zendesk.com/api/v2/search.json?query=type:user email:name@domain.com"` and return `results[0].id`
### User Identity
Assuming you have a user ID from a Zendesk user, you can use that to return the identities for that user. Most users have only one Messaging identity, namely from the channel they first contacted you. If you have a tendency to merge your users you might need to expand this function to filter out the right one based on the type.
We need to target the Zendesk API for this, and specifically the `/users/{user_id}/identities` endpoint.
```javascript
async function getIdentities(requester_id, env){
const api_endpoint = `https://${env.zendesk_domain}.zendesk.com/api/v2/users/${requester_id}/identities.json`
const zendesk_key = btoa(env.zendesk_admin_email + "/token:" + env.zendesk_token);
const init = {
method: "GET",
headers: {
"content-type": "application/json",
"authorization": "Basic " + zendesk_key
},
};
const response = await fetch(api_endpoint, init);
const results = await response.json();
for (let index = 0; index < results.identities.length; index++) {
const identity = results.identities[index];
if (identity.type == "messaging"){
var messaging_id = identity.value;
return messaging_id;
}
}
return '';
}
```
### Conversation ID
Once we have our user id in messaging, we can use that to find the active conversation for that user. Remember, comments can only be send to active conversations, so we need to target the right one.
This happens via the Smooch API, which is the old brandname for what's now called Sunshine Conversations (SunCo). By default SunCo only has a single conversation per user, and WhatsApp only allows for one anyway, so we can safely return the first conversation we find.
```javascript
async function getConversationId(messaging_id, env){
const api_endpoint = `https://api.smooch.io/v2/apps/${env.sunco_app_id}/conversations?filter[userId]=${messaging_id}`
const sunco_key = btoa(env.sunco_key_id + ":" + env.sunco_secret_key);
const init = {
method: "GET",
headers: {
"content-type": "application/json",
"authorization": "Basic " + sunco_key
},
};
const response = await fetch(api_endpoint, init);
const results = await response.json();
return results.conversations[0].id;
}
```
### Send Message
Now that we know which conversation to target we can finally send the message. This happens by configuring a new `payload` that contains the `message` from our original POST payload.
Note that we use `zd:agentWorkspace` as a source. This way any reply will surely arrive back to your agents in Zendesk!
```javascript
async function sendMessage(conversation_id, message, env){
const api_endpoint = `https://api.smooch.io/v2/apps/${env.sunco_app_id}/conversations/${conversation_id}/messages`
const sunco_key = btoa(env.sunco_key_id + ":" + env.sunco_secret_key);
var message_payload = {
"content": {
"type": "text",
"text": message
},
"author": {
"type": "business"
},
"source": {
"type": "zd:agentWorkspace"
}
}
const init = {
body: JSON.stringify(message_payload),
method: "POST",
headers: {
"content-type": "application/json",
"authorization": "Basic " + sunco_key
},
};
const response = await fetch(api_endpoint, init);
const results = await response.json();
return results;
}
```
## How to use this.
Now that we have a deployed script that can handle any WhatsApp message, you can use this to `POST` any kind of message to your customers, and this flow is ideal for automated API flows.
If you want an easy way to integrate you could invoke this script via e.g. Zapier as a webhook target and sent a reminder to a user based on a Google calendar with appointments to remind customers of an upcoming event.

# Sidebar App
The previous flow described how you could create a script you could invoke via a POST command to trigger messages and notifications to customer.
There is however another way you can use Sunshine Conversations and that is leveraging sidebar apps in Agent Workspace. In the repository below you'll find a fully functional sidebar app for Zendesk that allows you to:
- Send a message to a user from the ticket sidebar.
- Send a template to a user from both the ticket sidebar as well as a user profile.
The settings of the app allow you to enter two approved templates and require you to enter the same `app_id, secret_key, key_id, integration_id` as you entered for the worker script above.
You can download the app via the GitHub repository below. It's a fully functional private app you can modify or install in your instance.
[GitHub - verschoren/outbound\_messagingContribute to verschoren/outbound\_messaging development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/outbound%5Fmessaging?ref=internalnote.com)

## Code Highlights
This being a Zendesk app makes the app flow a bit different than our script.
### Get user info
Since our app runs in both the `ticket_sidebar` and the `user_sidebar` we can use the `client.context();` function to get the location of our app, and we use `client.metadata();` to securely retrieve our API credentials we store in the apps' settings.
```javascript
var client = ZAFClient.init();
var metadata,context;
var recipient,phone;
var conversation_id,key,integration_id
metadata = await client.metadata();
context = await client.context();
```
Once we have our location we need to get the user information we want to sent a message to.
```javascript
if (context.location == 'ticket_sidebar'){
recipient = await client.get('ticket.requester')
} else {
recipient = await client.get('ticket.requester')
}
phone = await getUser(recipient);
async function getUser(requester){
return await client.request({
url: '/api/v2/users/' + requester.id,
type: 'GET',
dataType: 'json'
}).then(function(data) {
$('#phone').html(data.user.phone.replaceAll(' ', ''));
return data.user.phone.replaceAll(' ', '');
});
}
```
And now that we have the user, similar to how we did it in our script, we can get the messaging identity of the user from our `recipient.identities` object. The rest of the app flows similar to how we handled our earlier script.
## How to use the app
Agents can reply to conversations and send random messages to customers via the Message Field, although, honestly, in this case using the Agent Workspace is more logical. They can also send predefined templates via the two buttons underneath the text field.
You could imagine expanding this app and integrating it with your CRM, booking system or others, to allow agent to send specific templates with relevant placeholders to their end users.
# Conclusion
So, there you have it, two different ways we can interact with Sunshine Conversations, one ideal for automations, and one to make it possible for agents to interact with Sunshine Conversations via a sidebar app.
### Digital Voice API powered by Zendesk Messaging
URL: https://internalnote.com/voice-api-for-zendesk/
Last updated: 2024-08-19T20:37:46.000Z
The Classic Zendesk widget was a powerful tool. It allowed for [full customization](https://internalnote.com/customize-and-brand-your-zendesk-widget/), offered help center search, chat, webforms, authentication, pre-filling values and ... Zendesk Talk support out of the box.
The new Messaging widget has gradually catching up with its older sibling. The customisation API has been expanding with a lot more native features available in the admin panel, you can [authenticate](https://internalnote.com/jwt-messaging/) Zendesk Messaging, and, arguably, the new Zendesk Bot experience is way better than the old model search and forms flow.
This week brings the latest addition to its feature set: [Voice integration](https://support.zendesk.com/hc/en-us/articles/5531102360090-Announcing-the-new-Voice-API-powered-by-Zendesk-Messaging?ref=internalnote.com) that allows customers to call your CX team right from within the browser. No phone or other software required.
It's build on top of Zendesk Talk's [Digital Lines](https://www.google.com/search?client=safari&rls=en&q=digital+line+zendes&ie=UTF-8&oe=UTF-8&ref=internalnote.com) feature where you can get Talk enabled in your environment without having a real number.

# Feature overview
The new Voice feature works as follows:
- You add a *Call Us* button on your website
- When clicked you invoke a specific API endpoint for the new Messaging widget
- The widget shows a Call now (or we're offline) view allowing customers to call you.
- Calls appear in Agent Workspace and agents can handle them just like any other ticket.
You can test out the flow below:
[Internal Note - Voice API for MessagingDemo page to showcase the JWT Authentication for Zendesk MessagingVoice API for MessagingInternal Note](https://widget.internalnote.com/voice?ref=internalnote.com)
# Enabling Voice via Messaging
## Get a digital line
First you need to add a Digital Line to your Zendesk instance. Zendesk has a pretty good article explaining it:
[Adding a Talk digital lineWhat’s my plan? In Understanding Talk Embedded voice, you learned the basics about how Talk digital lines can help you improve the experience for your customers, wherever…Zendesk helpRob Stack](https://support.zendesk.com/hc/en-us/articles/1260805715389-Adding-a-Talk-digital-line?ref=internalnote.com)
Next you will need to find the Digital Line ID of your line. You can do this by going to [https://yourdomain.zendesk.com/api/v2/channels/voice/lines](https://d3v-verschoren.zendesk.com/api/v2/channels/voice/lines?ref=internalnote.com) in your browser while being logged in as an admin to your Zendesk instance.
In the returned data, search for the `line_id` of the line with `line_type:digital`
```json
{
"lines": [
{
"line_type": "digital",
"line_id": "6c0e70e6ef77d7a711a073f249ab6304",
...
```
Once you have your `line_id` you can invoke the Voice widget via:
```javascript
zE('messenger:open', 'voice', '{{line_id}}')
//replace {{line_id}} with your value
```
## Triggering the widget
Sadly there no native way (yet) to trigger the voice channel directly from the widget. However, there are a few ways you can show the option to your customers:
### Call us button
The easiest way to trigger the feature is buy adding a button somewhere on your website that opens the widget.
```html
Call Us
```
[Call Us](https://internalnote.com/voice-api-for-zendesk?voice)
### URL-based triggers
Sometime you might want to send customers directly to the widget without them needing to click on anything.
An example scenario might be a *Call Us* link in an email you send to your customers. For example, if I ask you to click on [https://widget.internalnote.com?voice=true](https://widget.internalnote.com/?voice=true&ref=internalnote.com) you will land on my demo page and the call widget will be immediately available to you.
By using the code below, you can automatically trigger a call based on the url parameter `voice=true`
```javascript
$(function() {
//check for URL parameter called "voice" and if it is set, open the voice channel
var urlParams = new URLSearchParams(window.location.search);
if (urlParams.has('voice')) {
zE('messenger:open', 'voice', '6c0e70e6ef77d7a711a073f249ab6304')
}
});
```
### Triggering a call via the Zendesk Bot
One of the limitations of the Voice via Messaging feature is its lack of integration with the Zendesk Bot. Where the [Classic Widget](https://developer.zendesk.com/api-reference/widget/core/?ref=internalnote.com#contactoptions) had a `contactOptions` feature which listed chat, forms and voice as options in a list, the current bot misses this feature.
If you do want to offer a similar feature, there's a small workaround you can use to make this work:
1. Add the URL based trigger code above to your website
2. Insert a Bot Message to your flow and add a button to the message
3. Set the link of the button to *https://domain.com?voice=true* and give it a useful label
4. Whenever a customer clicks the *call us* button it will open a new window with the call function enabled.
I sure hope this will be a native feature in the future.



# Conclusion
Voice via Messaging is one of those feature additions that seem really cool, but in practice lack in functionality. Hacking this into the Zendesk Widget with an API and neglecting to enable any native way to trigger it makes me really wonder why this feature had to go live now.
I can understand adding it to the Bot Builder might require additional resources from different teams, but it feels like a natural step to add to that list of options.
Or, if that was not possible in the near future, even adding a *Continue via phone* option to this dropdown would have been nice.
That being said, it is a nice feature addition to Zendesk's omnichannel set of features that brings the Messaging widget yet one step closer to feature parity with the classic widget.

### Zendesk Roundup for May 2023
URL: https://internalnote.com/monthly-note-for-may/
Last updated: 2023-10-12T14:07:49.000Z
A few weeks ago Zendesk held there big Relate conference which [introduced](https://internalnote.com/relate-2023/) Zendesk AI, Adaptable Agent Workspace and a lot of security and privacy improvements.
For those thinking that was enough for one month, well think again, cause this roundup is going to be a long one 😅
> *Our climate commitment: Zendesk signs its first off-take agreement to scale carbon removal technology.*
The above is a quote from a recent [press release](https://www.zendesk.com/newsroom/articles/our-climate-commitment-zendesk-signs-its-first-offtake-agreement-to-scale-carbon-removal-technology?ref=internalnote.com) by Zendesk. Closely [followed](https://www.zendesk.com/newsroom/articles/zendesk-usatoday-climate-leaders/?utm%5Fcampaign=61d659e08d1774000193466d&utm%5Fcontent=646f97876f007d00015a6e18&utm%5Fmedium=smarpshare&utm%5Fsource=linkedin) by "**Zendesk ranks in top 10 of USA Today’s Climate Leaders".**
There's just something about companies that put people and climate above profit..
🥳
Also, a small personal milestone: Internal Note reached its hundred subscriber this month. Six months in and I can finally start calling this website a real blog and no longer a proof of concept. So for all of you [subscribing](https://internalnote.com/#/portal/signup) (free or paid), thanks! 🥳
And if you're not yet subscribed and just reading this: I compile an overview of Zendesk News every month. If you don't want to miss it, please [subscribe](https://internalnote.com/#/portal/signup/free) to the blog. It's free. (Or optionally paid if you really like it)
Every new subscriber motivates me to keep putting in the effort.
Thomas
Now, on to the updates!
# 🎉 New Releases
## Help Center Updates
Zendesk Guide keeps getting better month after month. This month marks the release of *Semantic search in Guide,* a completely revamped search engine for Guide that moves away from exact keyword matches to using the meaning of a query to find matches. It's enabled automatically for all Zendesk users.
Additionally, Zendesk Guide now gives the option to feature up to six articles in the search dropdown. Similar to Promoted Articles, these articles allow you to intercept customers and draw attention to the articles you want them to read first.
You can now [update](https://support.zendesk.com/hc/en-us/articles/5401983216794.html?ref=internalnote.com) translations via API for articles that contain Content Blocks, and the [Audit Log](https://support.zendesk.com/hc/en-us/articles/5685642913050-Announcing-Help-center-events-available-in-the-Audit-log?ref=internalnote.com) now shows configuration and security changes in Guide too!
And to round up this overview, Zendesk just announced the availability of the new account level image gallery for Guide. Similar to the [Media Gallery](https://wordpress.com/support/media/?ref=internalnote.com) in Wordpress this will give you a single place to get an overview of images in your Help Center and easily share images across Content Blocks and Articles.
[Announcing semantic search in GuideAnnounced on Rollout starts May 1, 2023 April 28, 2023 We’re thrilled to announce the newest leap Guide is taking towards intelligent help centers, semantic search. Unlike search methods that…Zendesk helpOrsolya Forster](https://support.zendesk.com/hc/en-us/articles/5641000272922-Announcing-semantic-search-in-Guide-?ref=internalnote.com)
[Announcing featured articles in Guide searchAnnounced on Rollout starts Rollout ends May 15, 2023 May 15, 2023 May 22, 2023 We’re excited to announce the new article recommendation tool in Guide. Featured articles allows Guide admins t…Zendesk helpOrsolya Forster](https://support.zendesk.com/hc/en-us/articles/5685608132890?ref=internalnote.com)
[Announcing the new account level image gallery for articlesAnnounced on Rollout starts Rollout ends May 24, 2023 May 24, 2023 June 9, 2023 We are excited to announce the new account level image gallery for articles, which provides you with new tools…Zendesk helpKatarzyna Karpinska](https://support.zendesk.com/hc/en-us/articles/5737099213978-Announcing-the-new-account-level-image-gallery-for-articles?ref=internalnote.com)
## Group SLA
One of the biggest requests I hear from customers when talking about Service Level Agreements is a way to measure internal reply times, e.g. when escalating tickets to other teams or departments. As shown [in this article](https://internalnote.com/sla-policies/) from earlier this month, that's exactly what the new Group SLA policies allow you to do: report on and show expected handling time to agents in Zendesk for tickets escalated between teams.
[Announcing group service level agreementsAnnounced on Rollout starts Rollout ends May 10, 2023 May 15, 2023 May 19, 2023 Zendesk is excited to announce the introduction of group service level agreement (SLA) policies! Commonly known…Zendesk helpScott Allison](https://support.zendesk.com/hc/en-us/articles/5617720797338?ref=internalnote.com)
## Sunshine Conversations API is now part of Suite
The relationship between Zendesk Suite and Sunshine Conversations (SunCo) is a complex one. One one hand Zendesk Messaging delivered a lot of the capabilities of SunCo out of the box, on the other hand, integrating Conversational bots like [Ultimate](https://ultimate.ai/?ref=internalnote.com), or enabling [proactive messaging](https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk), was only possible by buying the, arguably, expensive SunCo add-on which often, especially for smaller companies, costs more than their Zendesk setup.

Luckily this is now fixed thanks to **Sunshine conversations now being included** with Zendesk Suite Professional or Enterprise plans!
Natively available within the Admin Panel this integration now allows powerful capabilities like sending marketing messages via WhatsApp, enabling third party Chatbots, routing messages from Zendesk to Slack,...
📥
If you're interested in this new platform capability, and you loved the "[Breaking the 24-hour Whatsapp rule](https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk)" from last week, please subscribe. There's lots more coming!
## Draft Mode in Composer
Often when writing a long or complex reply agents will turn to the internal note (😎) mode in the Comments Composer to prevent accidentally submitting an incomplete answer. With the move to Agent Workspace switching from public comment to internal note became a modal shift and the written text gets hidden. Now, with the new draft mode in the ticket composer you can write a draft first, then send it when you’re ready to submit the update, preventing you from accidentally submitting a reply.
[Announcing draft mode in the composerPhased rollout - Announced on May 16, 2023 Rollout starts Rollout ends Phase 1: All channels that support public replies, except chat and messaging May 16, 2023 May 19, 2023 Phase 2: Chat and m…Zendesk helpAmisha Sharma](https://support.zendesk.com/hc/en-us/articles/5637822550938?ref=internalnote.com)
## Conversational Bots
Speaking of draft modes, Zendesk has enabled a new option in bot builder tool that allows Admins to test new flows without needing to publish the changes first.
[Announcing new testing capability for conversation botsRollout start Rollout end May 19, 2023 May 23, 2023 We’re excited to announce that we have released a new bot testing capability for conversation bots. This announcement includes the following…Zendesk helpLisa Tam](https://support.zendesk.com/hc/en-us/articles/5727388526874-Announcing-new-testing-capability-for-conversation-bots?ref=internalnote.com)
## Other small changes
- The new [Developer Portal Change Log](https://developer.zendesk.com/api-reference/changelog/changelog/?ref=internalnote.com) captures significant changes, additions, fixes, deprecations, removals, and betas and EAPs related to Zendesk APIs and SDKs, and the list is filterable by event type.
- Admis can now [see](https://support.zendesk.com/hc/en-us/articles/5711217754394-Announcing-visibility-of-all-macros-to-admins-in-the-Macros-API?ref=internalnote.com) all macros in an instance, even personal ones both via the Admin Panel as well as via API.Visibility of all macros to admins.
- The Group View got [redesigned](https://support.zendesk.com/hc/en-us/articles/5547375026714-Announcing-an-updated-Groups-page?ref=internalnote.com) and got faster search to match the new UI for Agents, Views or Triggers.
- User profiles now show a nice time offset for customers in different timezones.

# 💡Insights
## Using Generative AI in Customer Care
The same week Zendesk announced Zendesk AI, Ultimate posted a nice overview of ways Generative AI can be used for customer care.
> Generative AI is a powerful tool that (when built into a broader automation or CX strategy) can help companies to deliver faster, better support — from offering a more conversational experience for customers, to assisting agents and supporting bot builders. So let’s take a look at the top 6 use cases of gen AI for customer service. - Reetu Kainulainen | Ultimate
[How to Intelligently Use Generative AI in Customer ServiceHere’s a deep dive into what gen AI is and 6 leading examples of generative AI and how it can be used in the support space.ultimate.aiReetu Kainulainen](https://www.ultimate.ai/blog/collaborations/gen-ai?ref=internalnote.com)
## Conversations with Zendesk
Brand new podcast hosted by [Zendesk Community](https://support.zendesk.com/hc/en-us/community/topics?ref=internalnote.com) Manager Nicole Saunders. The first episode was releases a little while ago so go listen!
[Conversations with Zendesk - Interviews about Customer Service, Support, and Customer Experience on Apple PodcastsBusiness · 2023Apple Podcasts](https://podcasts.apple.com/be/podcast/conversations-with-zendesk-the-podcast/id1685847701?ref=internalnote.com)
# ⚠ Major Changes
## Zendesk moves to Monthly Active Users
Zendesk has announced a few changes to the way it works with conversations and bots.
First off, Answer Bot and Flow Builder are gone. From now on there will be Zendesk Bots: The Conversational Bot powered by Bot Builder, and Autoreply to handle your email and webform automations. And similar to Answer Bot in the past, customers will now get a set of Monthly Active Users (MAU) as part of their Zendesk Suite, and can buy additional MAUs if they go over that limit.
There's a lot of details to go over, but in a nutshell, every unique user interact with your Conversational Bot (Free-text entry, Clicking on a quick-reply option or Submitting a detail collection form) it's counted as a MAU. You can lower this amount by enabling [Authentication for Messaging](https://internalnote.com/jwt-messaging/). Similarly, if a customer gets suggested articles via Autoreply, they will also counts an an MAU.
Note, a user that contacts you multiple times in the same month only counts as one MAU.
[About monthly active users for Zendesk botsNote: We have been actively listening to our customers about this change (thank you) and have decided to revisit our plan for bot usage pricing. This shift is in light of your helpful feedback and…Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/5352026794010-About-Monthly-Active-Users-for-Zendesk-bots?ref=internalnote.com#topic%5Fgww%5F13x%5F4wb)
Similarly, users leveraging the new Sunshine Conversation APIs in Zendesk Suite also get an alloted quota (see Above). For users who need more proactive messages, or more users, you can buy additional quota via a new[ add-ons](https://support.zendesk.com/hc/en-us/articles/4408834152730?ref=internalnote.com).
# 🎥 Videos
# 📝 Articles this month
[Setting up SLA Policies and enabling Group Policies.In this article we’ll explore the new Group SLA policies in Zendesk, lay out an approach to setup a scalable SLA policy across your instance and make sure agents take care of the right ticket first.Internal NoteThomas Verschoren](https://internalnote.com/sla-policies/)
[What’s new at Zendesk Relate 2023Interested in what Zendesk announced at Relate? Want to know more about Zendesk AI, Intelligent Triage, Adaptable Agent Workspace and Conversational Commerce? Read my “What’s new at Relate 2023” overview and discovered all the new announcements!Internal NoteThomas Verschoren](https://internalnote.com/relate-2023/)
[➕ An in-depth overview of Proactive Messages for ZendeskDiscover the new Zendesk proactive messaging. Learn about the main features and advanced flows, including the ability to show proactive messages based on specific marketing campaigns. Target customers based on their locale, or offer a premier experience to VIP users.Internal NoteThomas Verschoren](https://internalnote.com/proactive-ticketing-for-messaging/)
[➕ Bypassing the 24-hour rule for WhatsApp in ZendeskIn this article we’ll show you how to bypass the 24-hour WhatsApp limit in Zendesk by leveraging the included Sunshine Conversations API.Internal NoteThomas Verschoren](https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk)
# And finally...
I stumbled on this pretty handy article listing all feature deprecations in Zendesk. Might be useful to plan for future obsolesce.
Speaking of.. have you moved to Agent Workspace and Messaging already?
[What is being removed \[updated: September 2023\]Please refer to the following articles to learn more about Zendesk feature removal: How much notice does Zendesk give for feature removal How Zendesk communicates feature removal Why Zendesk remo…Zendesk helpJennifer Rowe](https://support.zendesk.com/hc/en-us/articles/4408843026714-What-is-being-removed-updated-April-2023-%202021-10-16T04:00:19Z%20-%202023-05-01T16:08:21Z?ref=internalnote.com)
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### ➕ Bypassing the 24-hour rule for WhatsApp in Zendesk
URL: https://internalnote.com/breaking-the-24h-rule-for-whatsapp-in-zendesk/
Last updated: 2025-09-08T06:42:39.000Z
One of the benefits of Zendesk's Omnichannel approach is that you can connect with customers across a myriad of channels from one centralised tool. Where Zendesk used to be focussed mainly on email, and later Facebook and Twitter, Zendesk Messaging now allows you to interact with customers across web, Facebook, Instagram, Twitter and WhatsApp easily.
Even though Zendesk provides a unified experience for your agents, and a native experience for your end-users on whatever platform they decide to use, some channels have specific limitations defined by their vendor to prevent spam or other bad behaviour on their platform.
WhatsApp for example has a 24-hour rule which prevents business integrations from replying to customers that haven't interacted with your business for over 24 hours. Example: If a customer sends a ticket at 10AM, you need to make sure your agent replies AND you get a reply from the customer before 10AM the next day. If those 24h pass without a customer reply to your agents' remark, you can't send any reminder or more info to that customer anymore.
[Working with WhatsApp tickets and the 24-hour ruleWhat’s my plan? If your WhatsApp account has been added to Zendesk Support, you can communicate with end users about support requests using…Zendesk helpAmy Malka Edited April 11, 2023 20:53 Zendesk Documentation Team](https://support.zendesk.com/hc/en-us/articles/4408829291162-Working-with-WhatsApp-tickets-and-the-24-hour-rule?ref=internalnote.com#:~:text=This%20is%20a%20WhatsApp%20rule,%2C%20you%20can%27t%20reply.)
# Bypassing the 24-hour rule
Luckily, there is a way to work around this limitation by leveraging the WhatsApp Business API and Notification feature. If you use the WhatsApp Business API you can send outbound messages to customers regardless of the expired time.
If a customer replies, their messages gets added to your existing conversation, and your agents can reply to them within a new 24h window.
Sending Outbound notifications to WhatsApp users requires you to have a Sunshine Conversations license. This used to be an additional add-on you needed to buy for your Zendesk environment,
# Sunshine Conversations in Zendesk Suite
Starting this month every Zendesk Professional or Enterprise Suite user gets access to Sunshine Conversations. You get full Platform and API access with an included limit of 1,000 Monthly Active Users (MAU) and 1,000 outbound notifications.
For larger use cases you can purchase additional users and notifications.
[About Sunshine Conversations platform access and supportWhat’s my plan? Sunshine Conversations is a messaging platform that unlocks the conversations API for customers who want advanced customizations. It is designed to help businesses build interactiv…Zendesk helpGary Beichler](https://support.zendesk.com/hc/en-us/articles/5514407356954?ref=internalnote.com)
What's nice about this is that, where previously there was no way to work around the 24-hour limit, now every Zendesk customer can solve this limitation for free and native within Zendesk.
# How does this work?

The setup is rather easy:
1. A customer contacts you over WhatsApp
2. Their conversation gets picked up by a Zendesk Conversation Bot to allow for self service and ticket deflection
3. If needed, the Bot forwards the message to an Agent
4. The Agent replies to the ticket and puts the ticket on Pending once the customer stops interacting
5. An automation monitors the WhatsApp conversations and sends out a reminder to customers after 24 hours
6. If the customer reacts before the 24-hour limit, or reacts to the outbound message, the conversation re-opens and we have a new 24h window to handle the conversation.
# Requirements
In order to enable automatic notifications to your customers there are a few requirements. Most of these are probably already setup when you first enabled WhatsApp for Zendesk Messaging:
- You need a verified Facebook Business Account - [link](https://www.facebook.com/business/help/2058515294227817?id=180505742745347)
- It's best to also verify your WhatsApp for Business account - [link](https://developers.facebook.com/docs/whatsapp/overview/business-accounts/?ref=internalnote.com)
- You need to have WhatsApp linked to Zendesk Messaging - [link](https://support.zendesk.com/hc/en-us/articles/4408842821786-Adding-WhatsApp-channels-to-the-Zendesk-Agent-Workspace?ref=internalnote.com)
- Your templates (see later) need to be validated by Meta. This takes \~2-3 days.
## A word about cost
Sending out outbound messages over Sunshine Conversations has two costs involved:
1. You need to pay for MAU in Sunshine Conversations. You get a certain amount (1,000 Monthly Active Users (MAU) and 1,000 outbound notifications) included for free. If you go over you need to buy a [Sunshine Conversations add-on](https://support.zendesk.com/hc/en-us/articles/5514407356954-About-Sunshine-Conversations-platform-access-and-support?ref=internalnote.com).
2. Outbound WhatsApp messages have a cost charged by [Meta](https://www.facebook.com/business/help/2225184664363779?id=2129163877102343). You get a 250-1000 depending on your verification status
# Setup
To setup this flow we need to do four things:
1. Create a Sunshine Conversations API integration
2. Create a Template in Facebook Business Manager
3. Setup a webhook in Zendesk
4. Setup an automation in Zendesk
The next part of this article will show you how.
# Create a Sunshine Conversations API integration
The first step in this setup requires the creation of a new Conversation API key.
Go to the Admin Center > Apps and Integrations > APIs > Conversations API and click *Create API Key*. Give it a name and copy the 3 values Zendesk shows somewhere safe. You'll need this App ID, Key ID and Secret Key in the next steps.
🤔
Zendesk has both a **Conversation Integrations* and **Conversations API* option in the Admin Panel. The former is used for ChatBots (like [Ultimate](https://www.ultimate.ai/?ref=internalnote.com), the latter for these kind of custom integrations.




# Create a Template in Facebook Business Manager
You need to go to your [Facebook Business Manager](https://business.facebook.com/wa/manage/message-templates?ref=internalnote.com) to create a new Template for your WhatsApp account. Go to WhatsApp Manager >> Account Tools >> Templates.
⁉️
Meta is quite strict about using the right type for the right message. ****Marketing** Messages can be send to more people but are a lot more expensive and are ideal for outbound sales campaigns.
Since we only need to alert an existing user about an existing interaction, we can use the ****Utility** category.
1. Create a new *Utility*template for your message.
2. Give the template a clear name like *24h\_reminder*
3. Leave the language to English for now.
4. Add a body text like the one below.
5. I added a Quick Reply button with a "*Keep ticket open"* option, so customers can reply even faster.
6. Submit your template
> Hey,
> Our agent are awaiting your reply. Please respond to keep your ticket open, or ignore to automatically close your ticket within 24 hours
The review process will take 2-3 days and you will get an email once your template is approved. Only when the template is approved will you be able to send out notifications.




# Webhook
Create a trigger or automation based Webhook URL.
The *Endpoint URL* should be to the following URL. Note the `app_id` value needs to be replaced with your App ID.
```
https://api.smooch.io/v1.1/apps/app_id/notifications
```
Leave the *Type* to `POST` and the *Request Type* to `JSON`.
Choose *Basic Authentication* with: Username: `key_id` and Password: `secret_key`


# Setting up the Automation
## Integration ID
You will need an Integration ID to get the automation to work. This will tell Sunshine Conversations via which channel they should send out the notification.
You can find your Integration ID by going to Admin Panel > Messaging > WhatsApp and copying the last part of the URL shown.
```
https://subdomain.com/admin/channels/messaging_and_social/channels_list/edit/646b411abc0c536ba1a98263
```
Replace `[integration_id]` in the payload below with the ID of your WhatsApp integration.
## Conditions
We only want to send out a notification for tickets that match the following conditions:
- `Channel is WhatsApp`
- `Ticket Status is Pending`
- `Tags does not contain 24h_reminder`
This makes sure we only send out the notification once.
- `Ticket hours since update is more than 10`
⁉️
Notifications allow you to send a message to the customer without keeping the 24h rule in mind. But to keep conversations fresh I prefer sending out a messages rather quickly.
## Actions
As a first action choose `Add tag: 24h_reminder` to let the automation know it has run.
Now choose `Notifications - Webhook: Sunshine Conversations Notifications` as the action, and add the following in the JSON body field. Make sure to replace the `[integration_id]` with yours.
🌎
The payload below contains a `"code":"en"` value. If your template has no English translation, make sure to replace `en` with your language. Eg. `fr` or `nl`
```json
{
"destination": {
"integrationId": "[integration_id]",
"destinationId": "{{ticket.requester.phone}}"
},
"author": {
"role": "appMaker"
},
"messageSchema": "whatsapp",
"message": {
"type": "template",
"template": {
"namespace": "XXXXXXXX_XXXX_XXXX_XXXX_XXXXXXXXXXXX",
"name": "24h_reminder",
"language": {
"policy": "deterministic",
"code": "en"
}
}
}
}
```


# The Result
As shown in the screenshot at the start of this article, each time a ticket passes the 24h limit while we're waiting for the customer, that customer will get an automated message, and if they reply, we can extend the 24h limit.
This is only one use case where the new Sunshine Conversations API inside of Zendes Suite becomes useful. Following a similar flow like the one above we could easily use this API to send out appointment confirmations, activation messages, shipping updates or any other kind of utility or marketing based notification to customers.
These interactions don't even need to be based on an existing conversation. If you send out a reminder for a reservation, and the customer replies to your message to make a change, this will create a new conversation with your CX team.
You can find a full overview of the API capabilities here:
[Outbound MessagingSmooch Documentation](https://docs.smooch.io/guide/outbound-messaging/?ref=internalnote.com#notification-api)
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### My approach to setting up Zendesk SLA Policies and enabling Group Policies.
URL: https://internalnote.com/sla-policies/
Last updated: 2025-09-08T06:44:12.000Z
Earlier this month Zendesk announced the availability of Group SLA policies as an extension of the regular SLA policies that existed for customer facing tickets.
SLAs, or Service Level Agreements are a way to measure reply and handling time on tickets and to make sure tickets get replied to in a realistic timing.
[About SLA policies and how they workWhat’s my plan? Fastpath: Admin Center > Objects and rules > Business rules > Service level agreements A service level agreement, or SLA, is a policy yo…Zendesk helpColleen Hall](https://support.zendesk.com/hc/en-us/articles/5600997516058?ref=internalnote.com)
All SLA policies in Zendesk are are based on four elements:
- Priority, ranging from low to urgent as a way to differentiate different tickets
- Business schedule, or differentiating between counting only actual working hours or also continue counting when your agents are offline
- Measurement type, ranging from first reply, next reply to total working time.
- A filter to define which tickets an SLA policy applies too.
# My approach
I like to keep my Zendesk environments rather sparse and easily readable. So when I go and setup SLA policies I've got a few basic steps I take first:
1. Split conversational and ticketing requests
2. Set priority on all tickets based on category or customer type
3. Map all tickets to a specific group
4. Have a schedule for each group
My SLA policies then follow a clear order. For a given group, e.g. Support I have the following two policies:
- SLA Support - Tickets
- SLA Support - Messaging
Within each SLA Policy I filter based on the group and channels, and I always set the operational schedule to Business Hours, cause we can't account for time we're not at work.
And once those policies are made I fill in only First Reply Time (create a sense of urgency) and Next Reply Time (create room for informed replies)
# Preparation
## Define Channels
Each business has their own needs, and each channel has to be treated differently, but in general we can define two types of channels: conversational and ticketing
**Conversational** channels, like chat or Facebook Messenger, tend to be focused on short messages sent in burst. Issues can be resolved quickly, and neither party expects the conversation to take long.
**Ticketing** channels like email are often used for longer, more complex interactions. An email can contain a lot more nuance than a message, and we often even escalate conversations to email ticketing if the issue is too complex or needs to be handled by different teams (e.g. Finance or IT)
For that reason I like to make a difference in SLA between the two types of interactions.
📞
Zendesk Talk or other voice channels fall back to the Ticketing type for me. Calls are to be taken immediately and can't be asynchronous, but the follow-up almost always happens via email or a callback anyway
## Set Priority
Each SLA Policy can contain up to four different targets for each of the metrics, ordered by Priority. I used to create a lot of different SLA policies to handle different ticket types. An SLA for returns, an SLA for complaints, another one for downtime, ... This leads to a lot confusion on which SLA applies when.
To remove this confusion I now always fall back to four triggers that set the Priority for each incoming ticket, with a default of "normal".
That way, each ticket that comes into my Zendesk environment via a specific channel is first prioritised, then assigned to a group and then gets one SLA applied based on the combination of these 3 elements. For regular SLA policies you might be tempted to put these metrics in the conditions of the policy, but for Group SLA policies that isn't possible, and you can only work with Priority. So turned ticket conditions into priorities early one via triggers is worth it and makes working with SLA a lot easier.
⁉️
Did you know you can remove some complexity by editing the Priority Ticket fields? When editing the field you can choose to use four values (low, normal, high and urgent) or just two (normal and high)
I start by creating 4 triggers

The first three triggers are similar. They each contain a list of conditions in the *`Meet ANY of the following conditions`* step that should match that priority.
This can be any combination of elements, like Subject contains urgent, or customer is VIP, or category is GDPR, or any combination of elements. The goal here is to have a few triggers that narrow down your inquiries to a single item: priority.
Once you've got your conditions setup, you add a single action: proirity is urgent (or high, or low).
If the triggers get too complex, feel free to create multiple triggers for specific scenario's.

Once you've created the first three triggers, you can add the fourth one: Priority is Normal. This is our fallback trigger that makes sure if none of the above apply, your ticket gets treated as normal. Cause remember: no priority means no SLA!

Note that I did not add any conditions like *`ticket is updated`* or *`created`* to the triggers. I want these triggers to run on every ticket and update to make sure the SLAs get updated when needed. If you want agents to be able to manually update their priority too, add a *`Priority is not changed`* condition to the triggers.
## Schedules
You should make sure to setup at least one schedule for your Zendesk instance, since SLA's can (and should) be based on Business Hours.

Note that if you have multiple schedules running, you should create triggers that assigns a schedule to a ticket. Otherwise tickets get created without a schedule and the SLA does not get calculated.

# Creating the SLA Policies
Once the above steps are completed, creating the SLA's is pretty straightforward:
1. Go to the Admin Panel and create a new SLA policy.
2. Give it a logical name, eg *`SLA Messaging - Support` or `SLA Ticketing - Support`* to make it clear that this is an SLA that applies to tickets for the Support group and the Messaging Channels (or not)
3. Start by adding one condition to each SLA Policy: `*Channel* is *Messaging*` or `*Channel* is not *Messaging*`. Since *Messaging* is a parameter that contains all Messaging Channels (Twitter DM, Facebook Messenger, WhatsApp, Web Widget,...), and SLA Policies are applies top-to-bottom, with the first applicable rule applying, this will make sure all Messaging tickets get the first SLA, with the rest the other one.
4. Add a second condition: `*Group* is *Support*`, to scope the SLA to that group.
5. Set the `*Hours of operation* to *Business Hours*` so we only count the time agents can really have an effect on tickets.


## Metrics
Now comes the crucial part. Setting up the metrics. I like to keep the data clear for Agent so they know how to interpret the numbers shown.
For Ticketing channels I often only fill in First Reply Time and Next Reply Time. -
- First reply time should be kept short. The faster we acknowledge a problem, the happier the customer is. They know we're working on it.
- Next reply time can be longer. Giving agents time to look into requests in detail results in better responses and less chance of getting many back and forts.
If you're worried that longer next reply times will result in backlog I would recommend resolving this issue at the beginning and put more effort in enabling self service and ticket deflection.
For Messaging Channels these two metrics [don't exist](https://support.zendesk.com/hc/en-us/articles/4408822351642-Limitations-in-messaging-functionality?ref=internalnote.com) (yet). Here the Periodic update option can offer relief. It measures the time between Agent actions, and since messaging tends to be short and quick, we can use this as a good replacement.
Fill in the columns for each priority with the required value. Or, if you have no idea what to fill in, you can go for a 2-4-8-16 metric for first reply time, where urgent ones see a reply in 2 business hours, and low priority tickets see a maximum of 2 working days (measured as 9-5, 8h per business day). Let these SLAs run, and check back in a month to see if they are realistic.
For next reply I often go for a basic 4h for high/urgent and 8h for normal/high before a follow up reply is due.

## The result
If you've followed the above steps you'll end up with a view not too dissimilar from this one, a clear overview of policies ordered by channel and responsible agent group.

What will happen with your tickets is also clear:
1. A VIP customer emails about a lost package
2. We have a trigger that sets these kinds of requests to High
3. And assign these tickets to our Support group
Since this is a request raised via email, and assigned to the group Support, our *`Ticket SLA - Support SLA`* should start. And since the request is Urgent, we need to reply within 4 hours.

Similar, a user sends a message over WhatsApp requesting info on getting a discount on a product. We tag discount requests as Low, and assign it to the Sales team. The *`Messaging SLA - Sales`* starts and we need to reply within 16h, or 2 days.
If a new type of requests requires a specific urgency in replies, you can add that type of requests to the trigger that sets priority as a condition and the SLA will automatically apply. Or if urgent now means "Within 30minutes" for your third level IT group, you can update the *`SLA Ticket - 3th level IT`* policy and update the metric for next reply time for that team.
# SLA based views for a fair order
SLA Policies are only useful when we give Agents a good way to interact with them. One way to make it more intuitive for agents to handle tickets based on priority and make sure they handle the most urgent ones first is to work with SLA based views.
Let's say I have an SLA setup with First Reply times of Urgent: 2h and Normal: 4h
1. A customer emails me with an normal question at 9AM
2. A customer emails me with a urgent question at 10AM
3. A customer emails me with a normal question at 10AM
4. A customer emails me with an urgent question at 11 AM
If we use an ID sorted view, or first in first out based, and I look at this list at 12PM, I might see the tickets 1-2-3-4 sorted as follows:

But how do we handle these tickets fairly once priority comes into play? Does ticket 4 come before or after ticket 1? You might be tempted to sort by priority. But that means the more urgent tickets are created, the lower that first ticket will drop. Not exactly fair for that user, right?

This is where SLA based views are useful. In these views we sort tickets by SLA in an ascending order, meaning the first ticket to breach comes first.

Let's take our four tickets as an example. Taking our priority and SLA policies into account:
1. Needs to be replied to by 1PM (9AM + 4h)
2. Needs to be replied to by 12PM (10AM + 2h)
3. Needs to be replied to by 2PM ( 10AM + 4h)
4. Needs to be replied to by 1PM (11AM + 2h)
If we sort tickets based on their SLA expiration, the tickets will appear in the following order for your agents: 2143 at 1PM.
Urgent tickets still are handled before less urgent ones, but we make sure we handle all tickets taking their SLA into account, preventing tickets getting breach by always picking the first or most urgent one first

Once we also take Next Reply Time into account this logic becomes a bit more complex, but the same rules apply. Tickets where the Next Reply time expired will be intermixed with new tickets but everyone gets threated fairly.
# Group SLA Policies
The inspiration for this article came from the recently announces Group SLAs. These SLAs are, in contrast to the regular SLA policies, not focussing on reply times to the customer, but measure ownership by a specific group of agents.
The setup has a lot less options, but builds upon similar concepts.
- **Conditions** are group based. So you can only measure data based on which group is the current owner of a ticket.
- **Priority** is the same priority as the regular SLA policies look at. Here you see another reason why having triggers assigning priorities and working only with those in SLA policies is worthwhile. Group SLA conditions can't use anything else to set metrics.
- **Hours of operations** are once again the choice between Business and Calendar hours. To keep things consistent, keep it the same as the regular SLAs.
So, going back to our VIP customer who lost their package above: imagine the customer requested a refund for the lost parcel. We could initiate a side conversation via Child Ticket with the Finance Team to get approval for a refund, or assign the ticket to the Finance Team directly. Depending on the Group SLA setup, that team would then see a Group Ownership SLA counter, with a timing depending on the Priority of the ticket.


## Views
When I first setup Group SLA policies I assumed they would intermix with the regular SLAs in views. But, apparently it's a second column you can enable. Which means, if you sort tickets by SLA breach, you have to pick one of them.

## Restrictions
### Assignment vs Escalation
There is one weird behaviour I found with these new SLAs though: there's no way to differentiate between being the primary owner of a ticket, and getting a ticket escalated in these SLA policies.
In a flow where your Support team is a first line support team, and escalates to the Finance team like we showed above, we see that that Finance team gets 30 minutes to ownership time and reassign it to the Support team again.
But what happens if you set a Group SLA for your first line support team?
Imagine most tickets take two days to get resolved. But you set the Ownership to a day. How does that work? Cause the only way first line can fulfill that SLA is by solving in less than a day, and/or escalating. I wonder what Zendesk wants us to do here. Do we don't set a Group SLA for a first line team? Do we set the SLA to the expected resolution time of a ticket?
The same can be said for environments where the IT team is both a first line for colleagues and employees, but second line for customer request related to the website. Setting a Group SLA is logical for escalated tickets. Your CX team wants replies back fast. But illogical for requests from colleagues directly, if IT has a supporting role there the ticket lifetime is probably longer than the ownership time for escalations.
Group SLA Policies are fairly new though, so I can only assume these quirks get ironed out. But if you have any insight in this, feel free to let me know.
One workaround I though of was creating two groups: IT, and IT Escalated. One for first line IT support, and a second group for escalated tickets that takes a Group SLA into account.
Another solution could be custom statusses. Group + Custom Status = SLA. Tickets assigned as `Open` could then be measure one way, `Open via Escalation` could be measured differently. But that would require an expansion of the feature.
### How to handle external escalations?
A second part of escalations that can't be measured is anything that escalates outside of Zendesk.
Imagine your IT team working in Jira and you use the [Zendesk to Jira integration](https://support.zendesk.com/hc/en-us/articles/4408837969946-Setting-up-the-Zendesk-Support-for-Jira-integration?ref=internalnote.com). Or you escalate to your Marketing in Slack, or an external vendor via Side Conversations. I'd assumed that we could measure these kind of escalations too since they fall under how Zendesk describes this feature:
> Tickets often pass between multiple departments or teams on the path to resolution. Group SLAs allow admins to set target times for those groups and separately track resolution times between departments.
However, with groups as the only available condition, this seems impossible to do. You could work with placeholder groups for assignment + escalation and then re-assign to the main group if the ticket gets updates, but that would mean end-user responses are invisible until we re-assign to the main group, which then resets the other groups' SLA. Weird. But then again, this is a first release.
# Additional Notes
## What about specific SLAs for a customer?
Let's say you followed the above steps and configured a similar SLA policy for your instance. But have a few customers whose SLA contract differs from the default. They have unique SLA requirements that apply across all your agents and departments. Or their SLA metrics really differ from your general numbers.
You can still apply the above for all your tickets and create a few specific SLA policies for these specific customers. Just scope them with e.g. `Organisation is Acme Inc` or `Ticket tags contain Gold SLA` .
Just make sure they stay above the other policies so they get applied first, since the first applicable policy gets activated.
All other customers don't apply these policies and will use the normal ones we just build.
## What about customers that have a paid SLA, and other customers?
The same flow can still apply. You could split up the policies to differ between those with a Paid SLA, and the others. It might seem redundant, but since all policies follow the same logic, it's a lot easier to maintain.
- Premier SLA - Messaging - Support
- Default - Messaging - Support
- Premier SLA - Email - Support
- Default - Email - Support
- ...
It's useful to use the clone button in these scenario's to speed things up.
# What's next?
The new Group SLA policies were the incentive to write this article. I like the fact that Zendesk is expanding their Service Level Agreements to be compatible with more scenario's, but I would've loved to have seen a bit more customisability to the Group SLA feature.
Why can't we differ between tickets escalated to a team and owner by a team? How can we measure SLA's for departments working outside of Zendesk we reach via Teams, Slack or the Jira integration? Where's the support for reply-based SLA's for Messaging? I hope (and I'm sure) Zendesk will keep in improving this feature.
If you've got any feedback on my approach, I would love to hear how you handle SLA policies and which scenario's I haven't thought of! Leave a comment below, or feel free to send me an email with feedback!
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### What's new at Zendesk Relate 2023
URL: https://internalnote.com/relate-2023/
Last updated: 2023-10-12T14:07:41.000Z
What WWDC is for Apple, [Relate](https://mc.zendesk.com/mc/zendesk-relate/?ref=internalnote.com) is for Zendesk. A keynote presentation that not only shows what the company has been working on the past year(s), but also sets the tone for the future vision of the company.
And similar to this years' [Google I/O](https://techcrunch.com/2023/05/10/heres-everything-google-has-announced-at-i-o-so-far/?ref=internalnote.com), this keynote can be summarized in three words: AI, privacy and productivity. With the former taking the lead.
Let's dive in!
📥
I compile an overview of Zendesk News every month. If you don't want to miss it, please [subscribe](https://internalnote.com/#/portal/signup/free) to the blog. It's free. (Or optionally paid if you really like it)
Every new subscriber motivates me to keep putting in the effort.
Thanks,
Thomas
The presentation started with an intro by CEO Tom Eggemeier. Not only did he announce he's dropping the Interim from his title (congratulations!), he also set the tone for the presentation and announced Zendesk's new tagline.
> ... it’s also a commitment to deliver on the promise of intelligent CX. So, in addition to bringing great products like Zendesk AI and Conversational Commerce to market, we will transform the way we work.
>
> Today I committed to the following:
> 1\. Renewing our innovation focus
> 2\. Increasing our focus on our own customer experience and doubling down on our commitment to delivering on being “customer first”
> 3\. Providing more expertise in CX with a point-of-view on how customers can improve key customer satisfaction metrics, specifically the ones that impact loyalty while simultaneously improving costs.
## The intelligent heart of the customer experience
Gone is ***Champions of customer service*.** It's replaced with a new commitment that sums it all up:
- *Intelligent*, or driven by AI, ML and data
- *Heart*, sentiment and human connections at its core
- *Customer Experience*. No marketing, no sales, no dev-ops, but customers and agents.
I like the new slogan, just like the new branding it shows a shift from a company focussed on growth and expansion, to a company that's clearly at the top of its game and want to flex its muscles and show its prowess.

Source: Zendesk Newsroom
> In rolling out the new brand identity, we said goodbye to kale, one of our core brand colours, the ‘relationshapes,’ and metaphorical imagery we’d used in the past. The new look focuses on the future and the company we represent, with a few key elements that honour our history. Our new primary colours are espresso and cream, and secondary colours are berry and matcha.
It feels like a more mature but still familiar version of the current branding. Quieter colours, a more serious font, but still the same great Z-logo.
Really curious on how this will impact the product UI. Some marketing screenshots (see below) show a different take on Zendesk's [Garden](https://garden.zendesk.com/?ref=internalnote.com) design, so really curious how the product design will evolve.
# Announcements
Zendesk made three announcements during the presentation, with a few other smaller niceties woven throughout the presentation:
1. Zendesk AI
2. A renewed focus on privacy
3. An adaptable Agent Workspace
# 🤖 Zendesk AI
> What does the customer want and how do they feel?
Naturally, the main focus of the event was Zendesk AI: a new suite of AI and ML capabilities woven throughout the entire product suite.
Zendesk CTO Adrian McDermott positioned AI as a trusted partner, empowering conversational experiences and built on top of your data in a way that combines efficiency and empathy.
He also focused on their new partnership with OpenAI, integrating their generative LLM into Zendesk's core. This allows them to not only use Zendesk AI to detect *intent*, *language* and *sentiment* , but also generate text and summaries based on agent input.
Zendesk trained their AI model on 18 billion tickets and 15 years of ticket history, but then gives each customer a model that's (re)trained on their specific ticket set. This allows them to basically jump-start any customer to get valuable data and content out of Zendesk AI, but will also allow them to guarantee security and privacy. You work with your own data, not others'.
## Intelligence in the Panel

Source: Relate Livestream screenshot
The first big new item was an improvement to the context panel that's shown to the right of your tickets. Zendesk AI will power a new Intelligence Panel.
The panel will show *customer intent, sentiment and language* and allow the agent to also generate a *summary* of the conversation to quickly get up to speed.
That same panel will also suggest a list of macros to the agent, accompagnied by a confidence level to show your agents how sure the system is about using macro.
Last month my team at Premium Plus launched a basic summary app on the Zendesk Marketplace. But I'm really glad app is now a native feature. Not only will native be faster, it's also contained within Zendesk and doesn't need external API's, which is a pro for privacy, and the fact that it's AI is trained on a customers' specific data will make the summary even more precise.
I also think this summary feature will make escalations to second line so much easier. No need to read up on half a dozen comments, but a succinct overview of the current state of the ticket.
## Enhance Ticket Comments
The comment field gets a new button which allows agents to enhance ticket comments . It'll powered by OpenAI's generative AI and allows agents to quickly jot down a solution or response, and then use Zendesk AI to turn it into a good reply for their customer. (in theory)
The Enhance ticket comment feature offers three options:
- **Expand**: turn a short sentence in a longer message with additional context taken from the conversation.
- **Make more friendly**: Turn a factual reply into a more casual or conversational message.
- **Make more formal**: Turn a reply into a more professional tone.
[Using AI to summarize and enhance ticket comments (EAP)Note: The summarization and enhancing features are currently available in an early access program (EAP). You can sign up for the EAP here. You must have Agent Workspace activated to use the feature…Zendesk helpErin O’Callaghan](https://support.zendesk.com/hc/en-us/articles/5608712782362?ref=internalnote.com)
The whole idea of generated emails like [Google](https://www.theverge.com/2023/5/13/23719115/google-ai-help-me-write-communications-email?ref=internalnote.com) does, or now Zendesk, still feels a bit weird to me. I keep thinking we'll end up in an absurd scenario where:
1. *Customer has an issue and writes a three sentence email and uses ChatGPT to expand that into three paragraphs of text.*
2. *Zendesk receives email and an agent uses Zendesk AI to turn email into three sentence summary*
3. Agent *replies in three lines and uses Zendesk AI to turn it into three paragraphs of text*
4. *Customer receives reply and uses ChatGPT to summarise the reply. into three short lines again.*
With a lot of wasted bits in the middle and some nuances getting lost in translation. But I understand the benefits too. We all wrote that short email at 4:55PM before we leave the office which could have been a nicer written email when you reread it the day after.
## Intelligent Triage

Source: Relate Livestream screenshot
> Intelligent triage enables the Zendesk ticket fields for intent, language, and sentiment predictions and confidence, which you can then use for setting up views for teams, automating with triggers or automations, and enhancing Explore reports.
The same values for sentiment, intent and language that are shown to the agent in the context panel, are also available for use in triggers or views:
- **Language** works similar to the existing language filters (although I wonder if it's the same dropdown but with better detection or a full replacement?).
- **Sentiment** is a good, bad, ugly kinda categorisation where you can then sort, assign, or set priority based on the customers' sentiment as detected in the comments' received.
- **Intent** is a bit more tricky. It basically replaces your typical Category dropdown with a set of \~100 predefined intents for specific industries. You can then use these intents to create specific views, or route tickets to specific agents. (If you're outside of these specific industries, you'll get sentiment and language, but no intents if I understand it correctly.). The intents are: Retail and e-commerce, Software platforms or applications and Finance services.
Whenever I set up a Zendesk instance I'm a big proponent of a *Work to be done* approach to views. Have one view with open tickets sorted by SLA with the most urgent one is at the top, and train agents to get that *inbox* to zero by hopefully solving inquiries, or replying and moving tickets to pending.
Intent based views are a completely different approach. Agents work in a categorised based inbox to handle tickets, instead of one sorted by priority. But I'm sure that, by combining both approaches, this new intent training will sure lead to benefits. Can't wait to play around with this one.
## Advanced bots with pre-trained intents

Source: Zendesk Help
> If you give a bot another name, does it still reply the same?
Zendesk used this Relate to [clean up its ticket deflection offerings](https://support.zendesk.com/hc/en-us/articles/5514903812762-Announcing-updates-to-Zendesk-bots-simplified-naming-admin-experience-pricing-and-new-enhancements-?ref=internalnote.com). All Zendesk customers get access to the s*tandard* Zendesk bot that includes a conversation bot (the old Flow Builder) and Autoreply (what used to be Answer Bot).
Customers that have the Advanced AI add-on get access the the a*dvanced* Zendesk bot that includes pre-trained intents and intent tagging.
These pre-defined intents allow you to create dedicated autoreply triggers for specific intents. E.g. if Zendesk AI detects an email about "How to I return a product", you can create a specific email with information that gets send as a reply to those customers. All other customers still get the three suggested articles reply we know from Answer Bot.
[Using pre-trained intents in answersPre-trained intents are a set of industry-specific topics that have been developed by Zendesk using our own anonymized customer service data. By using these pre-trained intents in your bot answers,…Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/5537827011994?ref=internalnote.com)
The advanced bot announcement has two main parts to it;
Part one, the rename, seems logical. The more bots are there on the market, the more having a platform-owned bot that's named Zendesk Bot makes sense. It's similar to Google Maps, Apple TV or Facebook Messenger. If your primary product is also your company name, it's free branding and removes confusion. It's the same reason why, personally, I don't have an issue with the [optional](https://support.zendesk.com/hc/en-us/articles/4408887194778-Hiding-the-Powered-by-Zendesk-logo?ref=internalnote.com) *Powered by Zendesk* footer in the Messaging widget.
The second part is a bit more complex. Where other companies like [Ultimate](https://www.ultimate.ai/?ref=internalnote.com) have intent training and reporting as a core part of the product, Zendesk makes it an add-on. Naturally, Zendesk AI will improve their bots' capabilities, but one might wonder why the standard bot doesn't come with this pre-trained set of intents.
## Conversational Commerce

Source: Zendesk Labs
Jonathan Aniano, SVP Product, started this section of the presentation showcasing a nice extension of the conversation bot which integrates Shopify into Messaging.
Whenever a customer inquires about a product, Zendesk AI interprets the conversation and, when applicable, will show a carousel of products to the customer instead of e.g. a list of Help Center articles.
Or, based on the customer sentiment, they can also automatically offer a discount, or make sure that, if an agent is needed, they can route the conversation to the right agent. That same agent then has the Shopify Zendesk integration running and can quickly update, refund or discount a customers' order.
As a technology demo of what should be possible today, this seemed like a pretty cool flow to have running inside your retail organisation.
However, just like other Messaging demo's we saw at Relate Events these last few years which showcased delivery services, shoe stores and other Sunshine Conversation integrations, I do wonder: how much of this works out of the box, and how much is complex code and how fast is this deployable?
The fact that Zendesk setup[ a new Labs](https://zendesklabs.zendesk.com/hc/en-us?ref=internalnote.com) experience for companies to book workshops makes me think this involves a *bit* more code than the demo let on. However, once it works, this seems really cool and nicely combines Messaging, bots and Agent Workspace.
## Add-ons and Pricing

Source: Relate Livestream screenshot
While writing Internal Note, I try to stay away from pricing and sales, since I'm a developer at heart, and I rather discuss value and impact, than dollars and margins.
But it seems a bit contradictory that, at the same time Zendesk shifted the focus of Zendesk as a product towards being *the intelligent heart of the customer experience*, in reality, everything announced related to Zendesk AI is gated behind a new add-on: *Advanced AI*which cost 50$ per agent/month. And this is **on top** of the just announced [price increase](https://support.zendesk.com/hc/en-us/articles/5555300573850-Announcing-the-Zendesk-2023-pricing-update-What-you-need-to-know?ref=internalnote.com) across all license types.
If have one piece of critique about last week's presentation, it's the fact that **price** was never mentioned, and the word **add-on** was only mentioned once, and even then, just barely.
Giving **every customer their own AI model,** that is continuously trained, gets expensive fast and probably not every customer needs these advanced AI capabilities. So a price increase across the board to cover these costs and give every customer these Advanced AI features might not be feasible or even necessary.
But it's a bit of a shame that "*available today*" means "as an add-on" and not "core part of our offering", and pricing or add-ons were not transparently mentioned in the presentation. One slide with the following would have been nice, and a bit more transparant I think:

Source: Zendesk Pricing
Regardless of pricing or the approach on how they market it, the new offering is pretty straightforward: Zendesk offers two levels of AI functionality to meet your business needs:
- **Zendesk AI**, included with Suite Professional and Enterprise plans
- **Zendesk Advanced AI**, available as an add-on for Suite Professional and Enterprise plans
### Zendesk AI
Nothing new to see here, these existing features are basically rebranded into Zendesk AI.
- Standard bots (formerly known as Answer Bot and Flow Builder)
- Suggested macros for agents
- Content Cues for content managers
### Zendesk Advanced AI
All the new goodies:
- Advanced bots with pre-trained intents
- Intelligence in the context panel
- Enhanced ticket comments
- Intelligent Triage
- Macro suggestions for Admins
# 🔒 Privacy
This slide was the best part of the entire presentation for me.

Source: Relate Livestream screenshot
> Shared commitment to lead the way with new AI trust and privacy standards based on choice, transparency and AI that enhances protection.
## Building Responsible AI
Zendesk outlines its approach to responsible AI in the article below. I'm glad a company takes the time to write about impact, instead of only hyping features.
[https://www.zendesk.com/newsroom/articles/building-responsible-ai/](https://www.zendesk.com/newsroom/articles/building-responsible-ai/?ref=internalnote.com)
What's especially cool is that, if I understand it correctly, the Zendesk AI models are partially powered by OpenAI's models, but run entirely within Zendesk's infrastructure and are (re)trained on a each customers' own dataset. Customers that don't want to contribute to the main models can opt-out, and Zendesk commits to being transparant on how and when it gathers anonymised data to train its AI.
## Advanced Data Protection
In a nutshell: if your company requires their own encryption keys (BYOK), there's now an Advanced Encryption add-on available in EAP that allows you to encrypt (part of) your Zendesk environment with your own keys and broker.
[https://www.zendesk.com/blog/advanced-encryption-zendesk/](https://www.zendesk.com/blog/advanced-encryption-zendesk/?ref=internalnote.com)
# ⚙️ Adaptable Agent Workspace
> What does the customer want? How do they feel?
> Who can help them the fastest?
This brings us to the last part of the presentation: Adaptable Agent Workspace.
In this section we were shown improvements in Agent Workspace that basically turned a set of existing capabilities to 11, empowered by AI.
## Intelligent Triage and Realtime Capacity

Source: Relate Livestream screenshot
The first announcement in this section combines all the development Zendesk has done these last years with regard to skill based routing, agent availability and -omnichannel routing and makes them more powerful thanks to Zendesk AI.
This new set of business rules will allow you to take a conversation and route it to the best agent to handle the case, based on a combination of intent/language/sentiment, SLA, user identity and routing rules.
Implementing this feature, or the current omnichannel routing for that matter, does require a mind shift for your CX team. Where FIFO or longest waiting customer, and assignment to "French team", or "Second Line" are how most teams are setup, this new flow breaks down these big flows and turns each conversation into a unique scenario that routes to agent based on weights and availability instead of groups and generic rules.
## Macro Suggestions for Admins
Suggested macros for agents. Macro suggestions for admins. Two sides of the same coin, and if you weren't confused by reading the sentence once, you can try again with Zendesk's own explainer below. Naming things is hard 😅
> **Tip:** Macro suggestions and suggested macros are different, though related, features:
> **Macro suggestions are suggestions made to admins** about new macros that could be created based on repeated content from all agent replies in your account.
> **Suggested macros are suggestions made to agents** about which existing macro to apply to a ticket based on the content of that specific ticket.
All kidding aside, this is a cool feature. Zendesk AI indexes all your tickets, and based on Intents that occur regularly, and agent comments on those tickets, Zendesk will suggest new macro's to your admins with pre-generated text (thanks OpenAI!) and they can approve and deploy these new macros with a click of a button.
It's not clear if these macro's are just text, or if they also include status or other custom fields.
## Sneak Peak: Admin Home

Source: Relate Livestream screenshot
To conclude the announcements for Agent Workspace we got a sneak peak at the new Admin Home and the new Spike Alert feature.
In a nutshell, whenever Zendesk AI detects a spike in tickets related to an issue (say: Shipping delays or server downtime), the Admin Home will show a list of proposed things the Admin can implement to deflect tickets, help customers and lower the load on your agents:
- **Al-generated workforce management**
Zendesk will automatically assign agents to specific channels and intents based on their skills so the best agents are assigned to those tickets to handle these tickets efficiently.
- **Al-generated knowledge base article**
Based on Agent replies on those tickets the system will not only suggest macro's but will also write a Help Center article to publish, powered by OpenAI
- **AI Generated Layout builder**
The Agent Workspace layout will adapt its UI to give agents looking at these kind of tickets the necessary apps and context. If you get a spike in order inquiries, the shopify app will be front and center. When user authentication goes down, your app to validate user profiles will be visible,...
It's clear that, at least for customers buying Zendesk Advanced AI, it's clear we're moving away from the old triggers and views based Zendesk to a more automated system that basically does for Admins and Agent with managing tickets, what Zendesk Guide and Self Service does for Customers: proactively offer the right information and tools to prevent and/or easily resolve issues before they escalate. I'm really curious where they take this.
Also, this UI looks and feels entirely different from what we know and recognise as Zendesk today. It's probably part of the new style and branding, and I'm curious how this will trickle down to the Agent Workspace and ticket interface.
## Sunshine Platform

Source: Relate Livestream screenshot
Bandar El-Eita, Senior Director of Product Marketing, started the Adaptable Agent Workspace section of the presentation with this overview of the Zendesk Platform.
I might be reading things that are not there, but I sure hope the fourth ring shown on the slide means that, sooner or later, we can developer against `https://subdomain.zendesk.com/api/ai` and use Zendesk' AI to build integrations and custom apps powered by a customers' own data and without sharing any of their data outside of Zendesk.
One can hope...
# 🥳 Conclusion
Three thousand and something words later, and I've barely scratched the surface of what Zendesk announced this Relate. As a fan of the product, I can't wait to play around with these new features. And as CTO of a [Zendesk Premier Partner](https://premiumplus.io/?ref=internalnote.com), I've already started mapping features to customers and see who could benefit from what.
The (lack of) clarity about price and value in the presentation will surely turn a few initial smiles into frowns. Nobody likes to be shown nice things without up front risks and costs, but once the dust settles and Zendesk AI becomes the new normal, these ML powered capabilities will change the way customers and agents interact and work.
Secondly, I do wonder how Zendesk as a product will evolve from here on after. It's clear that Zendesk is no longer the company of tickets and self service, but is now a company focussed on conversations and automations at a human level, deeply integrated with AI. But similarly to how an iPhone user has arguably a worse experience without an Apple ID, or without paying for iCloud storage, I wonder if Zendesk AI is the start of a similar schism. Customers with AI enhanced environments, and legacy customers' without. Clearly, Zendesk's argument here is that the former will deliver the better CX experience of the two.
But I wonder if, in the future, those Advanced AI customers will get a better Zendesk product experience too. How much product R&D focus will go to the old way of views, triggers and custom fields, and how much product attention will go to Zendesk AI? Only time will tell, and Zendesk AI is only a first big step into the larger world of Intelligent CX.
Really curious where they take it from here.
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### An in-depth overview of Proactive Messages for Zendesk
URL: https://internalnote.com/proactive-ticketing-for-messaging/
Last updated: 2024-08-19T20:36:26.000Z
Last month Zendesk [launched](https://internalnote.com/monthly-note-for-april-2023/) their Proactive messages for Zendesk Messaging. This new feature allows you to reach out to customers by showing a small popup on top of your Zendesk widget. If the customer clicks on the message or widget, you can then immediately route them to the right [intent](https://internalnote.com/flow-builder-dinosaurs/) and try to proactively offer them solutions to any questions they might have.
[Announcing Proactive Messages in MessagingRollout start Rollout end March 27, 2023 March 30, 2023 What’s changing and why? We are thrilled to announce, launch of Proactive messages for our messaging customers. It’s our latest additi…Zendesk helpArpan Nagdeve](https://support.zendesk.com/hc/en-us/articles/5540317327770-Announcing-Proactive-Messages-in-Messaging-?ref=internalnote.com)
Proactive messages basically offers the same functionality as the old Zendesk Chat [triggers](https://support.zendesk.com/hc/en-us/articles/4408842880282-Zendesk-Chat-triggers-conditions-and-actions-reference?ref=internalnote.com), albeit with a lot less options. The new feature misses visitor location, time stamps, page view count, tags or reacting to a customer initiating the chat.
What we lose in functionality, we win in ease of use. The new Admin UI is a breeze to use with a modern UI, a better flow to setup the messages and build-in reporting.
Proactive messages are currently available for the [Web Widget](https://support.zendesk.com/hc/en-us/articles/5511266103834?ref=internalnote.com) and [Mobile SDKs](https://support.zendesk.com/hc/en-us/articles/5511216991898?ref=internalnote.com).

In this article we'll dive into the main feature set, and then go into more advanced flows. One more advanced flow allows you to show proactive messages to customers that match a specific marketing campaign, based on UTM Campaigns tags.
We build a specific flow based on a customers' locale, and combine Messaging authentication and tags to offer a premier experience you your VIP users.
Let's dive in.
# Feature Preview
You can test out the flows described below on this page.
[https://demo.internalnote.com/proactive](https://demo.internalnote.com/proactive?ref=internalnote.com)
Some flows use specific code to make them work, especially the logged in user scenario. Take a look at the repository to see how it works:
[GitHub - verschoren/zendesk\_widget: Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand.Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand. - GitHub - verschoren/zendesk\_widget:…GitHubverschoren](https://github.com/verschoren/zendesk%5Fwidget?ref=internalnote.com)
# Let's start with a basic Setup
We'll start with a pretty straightforward example. A customer visits our sample page and looks at the homepage for 30 seconds.
They're greeting with a welcome message that then shows info about this website.
The way it's setup is as follows:
## Compose the message
1. We first create a new proactive trigger and assign it to the right brand and channel.
2. We then Set a proactive greeting and select the `Bot` option.
3. We already build an Intent "About Internal Note" which we can use for this trigger.
## Triggers
Next up we select a trigger. Triggers are basically the rules that define when a trigger will fire. We can select both Visitor based options (title, url, repeat visitor), or Device based rules (Language).
For this basic example we'll set a rule as follows: `Visitor.Page URL is https://proactive.internalnote.com` . This will match our homepage exactly, and will make sure it won't fire on subpages. If you change the trigger to `contains at least one of` the trigger will fire on any page.
## Frequency and Timing
Once we setup that trigger we can then choose when we want the message to appear.
- We can choose to show the message upon payload or after a delay
- We can choose between always and outside or inside business hours
- We can choose to show the message once per user, once per session or each time.
For this basic demo I chose to show the widget after 30 seconds, ignore business hours and show it once per session. You can test it out on [https://demo.internalnote.com/proactive](https://demo.internalnote.com/proactive?ref=internalnote.com)



# Advanced Flows
In this next section we'll build three advanced flows:
1. A way to target customers based on marketing campaigns.
2. A premier experience for your VIP customers build on top of Authentication.
3. Handle customer locale for better assignment and routing.
# Target based on URL Parameters
Sometimes just targeting based on the page path is a bit to generic. Luckily the `Visitor.Page URL` rule is flexible enough to even target specific tags and parameters in the URL. Which opens a world of possibilities:
- You can a marketing campaign and want to target users with a specific `?utm_source` or `?utm_campaign` tag.
- You run a webshop and want to target visitors that are looking at a very specific variant `?variant_sku=1977`
## Example
I have two example product pages on my demo environment:
- A regular Product page that most customers visit - [link](https://demo.internalnote.com/proactive-product.html?ref=internalnote.com)
- The same product page but tagged with an `utm_campaign=trex` tag. This tag is for example added when customers arrive at the page from a specific ad. - [link](https://demo.internalnote.com/proactive-product.html?utm%5Fcampaign=trex&ref=internalnote.com)
The regular page shows the proactive message on the left, whereas the customers matching my campaign get a specific promo message.

## Setup
If you only wish to target the `campaign` users, you can create a proactive flow that has the following rules:
- A rule to match the campaign tag: `Visitor.Page URL contains at least one of utm_campaign`
- A rule to restrict only to product pages: `Visitor.Page URL contains at least one of product`
If you want to create proactive message per campaign you can create multiple proactive messages which each exactly mapping to one campaign tag:
- Proactive Message #1: `Visitor.Page URL contains none of utm_campaign=trex`
- Proactive Message #2: `Visitor.Page URL contains none of utm_campaign=raptor`
In my demo I created a generic trigger for product pages that don't contain a campaign tag, and a custom one for the T-Rex campaign.


# Flow 3: Offer a premier experience to VIP Users
The next flow expands on the custom URLs flow but combines it with [Messaging authentication](https://internalnote.com/jwt-messaging/).
## Example
We have a website where customers can login with their account.
Once logged in we have two types of users:
1. Our VIP users - [link](https://demo.internalnote.com/proactive-contact?ref=internalnote.com#vip)
2. Our regular users - [link](https://demo.internalnote.com/proactive-contact?ref=internalnote.com)
Our webmaster made it so that whenever a VIP user logs in we get a unique hash added to the URL `#vip`. We can now setup a rule that checks for the `hash` in the URL and immediately shows a proactive message that will contact the VIP Customer to an Agent, instead of the Chatbot.

## Setup
This flow is a bit more complex though than just another URL rule.
The page also makes use of the [Authentication Flow](https://internalnote.com/jwt-messaging/) of Messaging. This makes it so that the logged in VIP users not only get a notification we're there to help them, we also:
- Add a tag to those tickets `VIP` so we recognise them in Support
- We authenticate so the user is not asked for a name or email
- If any conversation was already active, they can just resume their session.
⁉️
There's currently a bug where, if you select the `Agent` flow for a Proactive message, and have an authenticated user, the message will still asks for details but not show the fields for the user to fill in



Regular users have the benefit of being logged in too on this page, but aren't prompted for support and will have to pass the Chatbot first.


⁉️
It would be awesome if we could somehow have "Logged In" as a rule condition for Proactive Messages, this would remove the need for the `#VIP` tag.
# Flow 4: Assignment based on locale
This final flow will trigger a specific pro-active message for french speaking customers and will use a `Device.Language` trigger condition.
See [this page](https://demo.internalnote.com/fr?ref=internalnote.com) to test out this flow
## Landing Page
When you have a webpage that serves multiple countries you probably also have a language switcher somewhere on your website that sets the locale of your website. Most often this happens with a `https://domain.com/fr/` path.
Whenever you setup such a flow, it's also useful to force the Zendesk Widget to follow that locale too by adding to your website just below the widget embed code.
```javascript
zE('messenger:set', 'locale','fr')
```
## Setup the Proactive message
Once we have a website that is localised, and (optionally but advices) a widget that follows that translation, we can create a rule set that uses the `Device` conditions instead of the `Visitor` conditions to trigger a proactive message.
In this scenario we filter on `Device.Language is fr` to react to pages for the french market. Note that we also add a tag `Messaging_French` to these conversations.


## Setup an assignment Trigger
Thanks to the trigger, all conversations that start in french will now be tagged with a specific tag, and we can use a trigger to route them to a dedicated team.
🇫🇷
You could also ignore the proactive message tag and just route based on the requester language.


# Reporting and impact
The Proactive messaging feature in Zendesk has a nice overview in the Admin Panel to monitor the effectiveness of your campaigns. For each proactive message you can measure the sends, opened and replies in a nice overview.

Personally I find it a bit weird that this data is not (yet) a part of Explore, but thanks to the tags used on the tickets created, you can still pull in data into Explore and get some insights in your campaigns there:


# Limitations
The examples above show that there's quite a lot of complex flows that can already be build with Proactive messages.
However, while playing with the tool, some [limitations](https://internalnote.com/zendesk-messaging-feedback/) did come up.
⁉️
When using the [Custom Launcher for Messaging](https://internalnote.com/custom-launcher-for-zendesk-messaging-and-unread-counts/), proactive messages are ****not supported!** See [this](https://support.zendesk.com/hc/en-us/articles/5381304334234/comments/5575083752986?ref=internalnote.com) comment.
## Rules and Conditions
One item I would love is to get access to a users' logged-in state to trigger different messages. This would make the VIP flow above a lot nicer, or would prevent us from annoying logged in customers, while still targeting visitors. similarly, being able to reference the name of the logged in user would be nice too.
Alternatively, rules would benefit nicely from allowing regex matches for more complex parsing and the ability to read localStorage cookies to have more nuanced triggers.
## API
Another omission I find curious is the complete lack of any API or developer toolkits for this.
I would love to be able to trigger a proactive message or intent client side via e.g. `zE('messenger:proactive', 'message', 'type:intent','tag')`
Similarly, a way to create, update, (dis)able or delete proactive messages via API would make it possible for tools like Hubspot to schedule and deploy campaigns automatically.
Similarly, I'd love to be able to schedule messages. E.g. launch our proactive campaign next Monday.
## Tags
While exploring flows for this article one of the ideas I had was to create a few Proactive Messages tagged with distinct tags (e.g. apple, pear, orange).
My idea was to combine those tags with the new Conditional Step in Flow Builder to automatically select the right path based on the assigned tag.
Sadly, Tags are only applied once a conversation starts, so there is no way for pro-active messages to filter intents.
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### Zendesk Roundup for April 2023
URL: https://internalnote.com/monthly-note-for-april-2023/
Last updated: 2023-10-12T14:07:30.000Z
> Offline is just online with extreme latency.
This quote does a better job explaining Messaging and Conversations than any other quote ever could. I found it in someone's LinkedIn post a while back and it really resonated.
With social channels specifically, but similar to email or webforms, it doesn't really matter if your company is active 9/5, 24/7 or if it's a public holiday. Customers have questions 365 years a day, and with the combination of Self Service, Answer Bot and Intelligent Triage you can make sure that customers can find some answers always, and that *if* an agent is active, they get the right kind of tickets assigned.
Similarly, with the new Teams and Slack integrations, escalating to team members becomes async too. You can be sure someone sees and will reply to your question, but until they do, that ticket can be safely in an *On Hold* status. Out of sight, out of mind.
Anyhow, on to the updates!
📥
I send out this overview of Zendesk Related News every month. If you don't want to miss it, please [subscribe](https://internalnote.com/#/portal/signup/free) to the blog. It's free. (Or optionally paid if you really like it)
Every new subscriber motivates me to keep putting in the effort.
Thanks,
Thomas
# 🎉 New Releases
## Proactive Messages for Messaging
Already mentioned in [What's New March 2023](https://internalnote.com/link-list-for-march-2023/), and now available: proactive conversations. I've got the featured enabled for all [Flow Builder](https://internalnote.com/tag/flow-builder-and-chatbot/) articles on this website. When you look at an article, Messaging will offer you the intent the article describes as a suggested conversation.
The fact that the feature combines both a dashboard to get insights, the ability to select specific intent and tag the conversations makes targeting the right customers and assigning to the right teams a breeze.
[Announcing Proactive Messages in MessagingRollout start Rollout end March 27, 2023 March 30, 2023 What’s changing and why? We are thrilled to announce, launch of Proactive messages for our messaging customers. It’s our latest additi…Zendesk helpArpan Nagdeve](https://support.zendesk.com/hc/en-us/articles/5540317327770-Announcing-Proactive-Messages-in-Messaging-?ref=internalnote.com)
## Custom Headers in Webhooks
Webhooks now support custom headers and API key authentication. This makes it [possible](https://internalnote.com/custom-authentication-for-webhooks-update/) to integrate Zendesk with a lot more platforms, like Zendesk's own Sell, Asana, Cloudflare or other APIs that require very specific headers.
[Announcing API key authentication and custom headers for webhooksAnnounced on Rollout starts March 30, 2023 March 30, 2023 Zendesk is excited to announce that you can now use API key authentication and define additional headers when configuring webhooks.…Zendesk helpZach Anthony](https://support.zendesk.com/hc/en-us/articles/5532092885658-Announcing-API-key-authentication-and-custom-headers-for-webhooks?ref=internalnote.com)
## Webhooks for Guide
Last year Zendesk announced *event based triggers* for Webhooks that focussed on users, organisations and groups. Now they've expanded these events to also include Help Center and Community items like article published, comment posted,..
This allows for some cool use cases like [announcing new articles on Slack](https://internalnote.com/webhooks-for-guide/).
[Announcing webhooks for help center and community eventsAnnounced on Rollout on April 26, 2023 April 26, 2023 After launching the ability to set up webhooks that can receive Zendesk events last year, we’re excited to release support for initiating…Zendesk helpZach Anthony](https://support.zendesk.com/hc/en-us/articles/5590028739738-Announcing-webhooks-for-help-center-and-community-events?ref=internalnote.com)
## Lookup relationship fields available in Explore
[Lookup relationship fields](https://internalnote.com/lookup-fields-and-ticket-escalation/) were introduced last year as a way to link Zendesk Tickets, Users and Organisations. You could assign an Account Manager to an organisation, link customers to a Sales Rep, or link a Vendor to a specific ticket.
These mappings are now available in Explore so you can create reports based on these mappings.
[Announcing general availability of the Agent Availability APIsAnnounced on Rollout on July 21, 2023 July 21, 2023 Zendesk is excited to announce general availability of the Agent Availability API. What is changing? Previously, agent statuses could…Zendesk helpVolkan Akdugan](https://support.zendesk.com/hc/en-us/articles/5518158586522-Announcing-general-availability-of-the-Agent-Availability-APIs?ref=internalnote.com)
## Custom Objects EAP
This might be the biggest news this month. The new Custom Objects Early Access Program (EAP) is active, and if you've signed up, chances are you have access.
The new Custom Objects are basically Lookup Fields on steroids and allow for some very cool and extensive custom flows right within your Zendesk. I played around with earlier and managed to [build a full Pokédex](https://internalnote.com/creating-a-pokedex-with-zendesk-custom-objects/) inside of my Zendesk account. Take a look at the video if you've missed it!
[What is the new Custom Objects EAP?Zendesk provides many types of native data objects for storing and managing your customer data, including tickets, users, organizations, and more. We call these standard objects. However, standard…Zendesk helpAshwin Raju](https://support.zendesk.com/hc/en-us/community/posts/5359269969178-What-is-the-new-Custom-Objects-EAP-?ref=internalnote.com)
Since the EAP is still in active development, I've started compiling a list of remarks. Most of them also link to a Zendesk Community Post so if you agree with some of these, please add a comment or upvote the post!
[Custom Objects EAP FeedbackBelow is a list of feature request and remarks for the Custom Objects EAP.Internal NoteThomas Verschoren](https://internalnote.com/custom-objects-eap/)
## All the small things
- You can now search and filter on images in the account level gallery for content blocks. - [link](https://www.google.com/search?client=safari&rls=en&q=zendesk+guide+filter+saarch+images&ie=UTF-8&oe=UTF-8&ref=internalnote.com)
- Views introduced a [new pagination experience](https://support.zendesk.com/hc/en-us/articles/4420490020890?ref=internalnote.com)
- The Developer Portal now has a [Beta and EAP](https://developer.zendesk.com/api-reference/betas/introduction/?ref=internalnote.com) section.
# 💡Insights
Zendesk posted a nice insight in [Build vs Buy](https://www.zendesk.com/blog/build-vs-buy/?ref=internalnote.com) on their website. As CTO and Developer I also find this a difficult balance to strike. Do I let one of my developers develop an internal tool? Or do we buy of the shelve. It's a balance between long term maintenance cost vs short term investment.
> **Zendesk adds OpenAI integration to expand AI-powered customer experiences**
> Combining the industry leading capabilities of the Zendesk Suite with the power of OpenAl helps businesses deliver a more intelligent customer experience while saving time and money - [Link](https://www.zendesk.com/newsroom/articles/zendesk-openai/?ref=internalnote.com)
Next month it's [Zendesk Relate](https://event.zendesk.com/zendeskrelate2023broadcast1?partner%5Fcontact=0038000002FnSkNAAV&partner%5Faccount=0018000001RVSYfAAP&utm%5Fmedium=partner%5Femail&utm%5Fsource=Verschoren&utm%5Fcampaign=internalnote) time, and I feel Zendesk has shifted even more of their communication about the event towards AI. And what I find really curious is the way they're leaning into OpenAI. They already had a lot of ML knowhow in house thanks to the purchase of [Cleverly](https://techcrunch.com/2021/08/26/zendesk-acquires-ai-automation-startup-cleverly-to-advance-customer-service/?guccounter=1&guce%5Freferrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce%5Freferrer%5Fsig=AQAAAIeIAgFSxaWe00swk-r9zjCwY0Qp3Q0iPLfMyn7-uuHFfm4a4MclNCVpNZ4unlaYa-O8hLaoAOwq483KRGzXu53d3fFVFzqpzxEkLcq090QgtNGEUUC%5Fom9c-Rx1qVXjoS1Ux5qIt698vgetuqCVDc-YvKYDjI1AOcrpGVnusMFo&ref=internalnote.com) last year, so I feel the mention of OpenAI is more a way to spark interest in the event and to catch the attention of everyone following the AI Hype, than an actual "O-o we better start doing something with this too"
I'm really curious about the full picture of new capabilities they will announce at Relate, but from what I've seen it's going to be pretty cool. 😉
# ⚠ Major Changes
## Messaging API connections
Starting May 31, 2023, you can only use API connections to authenticate REST API calls from a messaging bot. This article walks you through the process of updating your bots to use API connections. See [Updating messaging bots to use secure API connections for API calls](https://support.zendesk.com/hc/en-us/articles/5469553859866?ref=internalnote.com).
## Announcing the removal of legacy Slack integration notifications
If you’re using the existing Slack channel notifications, you’ll need to [migrate](https://support.zendesk.com/hc/en-us/articles/5494222584346-Announcing-the-removal-of-legacy-Slack-integration-notifications?ref=internalnote.com) these to triggers by September 18, 2023\. After that date, these notifications will cease to notify Slack channels.
## Announcing plan-based product limits for images in Guide
The introduction of [plan-based product limits](https://support.zendesk.com/hc/en-us/articles/5603632694042-Announcing-plan-based-product-limits-for-images-in-Guide?ref=internalnote.com) for images in Guide means that the number of images you can upload and use in Guide now depends on the Guide plan you are on:
# 🎥 Videos
# 🗺️ Ecosystem
Not only Zendesk (and the entire world) is playing around with ChatGPT these days. Ultimate, a major player in the Ticket Automation space, showed off a demo of their new *UltimateGPT* Chatbot.
[Meet UltimateGPT: The LLM-Powered Bot to Revolutionize Your SupportIntroducing UltimateGPT, a groundbreaking new product that integrates the power of ChatGPT into your support center and simplifies support automation.ultimate.aiUltimate](https://www.ultimate.ai/blog/ultimate-life/meet-ultimategpt-the-llm-powered-bot-to-revolutionize-your-support?ref=internalnote.com)
# 📝 Articles this month
- [Deep-dive into issues related to Messaging Authentication and JWT User Mapping](https://internalnote.com/deepdive-into-messaging-profiles/)
- [Learn how to build a full-featured Flow Builder Bot for Zendesk.](https://internalnote.com/flow-builder-dinosaurs/)
- [Preview: Creating a Pokédex with Zendesk Custom Objects](https://internalnote.com/creating-a-pokedex-with-zendesk-custom-objects/) (Online only, not mailed)
- [Improve Your Content Discoverability with a Linked List in Zendesk Guide](https://internalnote.com/linked-list-for-guide/)
- [Expanded API Support via Custom Authentication for Zendesk Webhooks](https://internalnote.com/custom-authentication-for-webhooks-update/)
- [Publish new Articles to Slack via the new Webhooks for Zendesk Help Center](https://internalnote.com/webhooks-for-guide/)
# And finally...
Do you know the power of `:` in Zendesk?
If you use it in a Macro title, it'll break up the title into a Category and Title and Macros will show up as a menu with subsections in your Agent Workspace. Like this: `Ticket Closings::Glad it worked`
Similarly, doing the same in a Dynamic Content will activate a hidden `type` filter in the UI. And Typing `:` in any comment field will trigger an emoji dropdown! 🤯

🥳
Thanks for reading this article and the blog. If you liked this content, please consider [****subscribing**](https://internalnote.com/#/portal/signup) and ****share** this article to your colleagues.
### Publish new Articles to Slack via the new Webhooks for Zendesk Help Center
URL: https://internalnote.com/webhooks-for-guide/
Last updated: 2025-09-08T06:42:53.000Z
Zendesk announced webhooks for their Help Center this week. A pretty cool new expansion on the existing Zendesk Event Webhooks feature introduced last year. Building on top of the existing users, agent, groups and organisation events, you can now get notified for changes in your articles (or community).
[Announcing webhooks for help center and community eventsAnnounced on Rollout on April 26, 2023 April 26, 2023 After launching the ability to set up webhooks that can receive Zendesk events last year, we’re excited to release support for initiating…Zendesk helpZach Anthony](https://support.zendesk.com/hc/en-us/articles/5590028739738-Announcing-webhooks-for-help-center-and-community-events?ref=internalnote.com)
You can get notified on the following Help Center events:
- Any help center article events
- Article published and/or unpublished
- Article subscription created
- Article vote created/changed/removed
- Article comment published/unpublished/created/changed
And for each event you get a POST request to a webhook endpoint of your choice:
```json
{
"account_id": 10168721,
"detail": {
"brand_id": "224348602",
"id": "7005414006398"
},
"event": {
"author_id": "225859532",
"category_id": "7005437869694",
"locale": "en-us",
"section_id": "7005437870078",
"title": "James Bond Gadgets"
},
"id": "01GX4P86AC7T0AFF86QGAHTEFR",
"subject": "zen:article:7005414006398",
"time": "2023-04-03T23:11:49.571545199Z",
"type": "zen:event-type:article.published",
"zendesk_event_version": "2022-11-06"
}
```
# What's possible now?
I used to follow all sections on my Help Centers with a dedicated end-user and then monitor that users' mailbox for changes. I wuld then use Zapier or Cloudflare Workers for Email to automate flows based on received emails to monitor and then automate based on changes in Guide.
These new webhooks allow me to tear down that Rube Goldberg Machine of an automation flow and use cleaner and more efficient code.
Examples:
- Notify your teams via Slack about article publications
- Post new articles to Twitter, Facebook or other socials via Zapier
- Notify your Marketing team so they can add it to release notes
- ...
In this article we'll build a quick example that pushes any new article to Slack to notify your internal teams.

☕
If you like these kind of implementation demos of new Zendesk features, please consider [subscribing](https://internalnote.com/#/portal/signup) to this newsletter. It's free. (Or optionally paid if you really like it)
Every new subscriber motivates me to keep putting in the effort.
Thanks,
Thomas
# Webhook JSON Payload
The payload you receive contains a few elements:
- `"type": "zen:event-type:article.published"` defines the type of event pushed.
- `"event": {...}` contains the author, category, section, locale and title of the article.
- `"detail": {...}` contains the brand (useful for multibrand environments) and article ID
# Post new articles to Slack
## Setup a new Slack app
Any integration that posts messages to Slack requires a Slack App.
[An introduction to the Slack platformThe Slack platform allows you to you extend and automate your workspaces to cultivate conversation, inspire action, and synergize services.Slack APISlack](https://api.slack.com/start/overview?ref=internalnote.com#creating)
Start by going to [https://api.slack.com/apps](https://api.slack.com/apps?ref=internalnote.com) and create a new app.
- You need to configure the **Webhook** Feature and create a new Webhook that points to a channel of your choice.
- In the **Basic Information** settings you can give the app a Name, Logo and description.
Once you setup a Webhook you'll get an URL you can use in the next step:
```
https://hooks.slack.com/services/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
```





## Create Message Payload
To create a nicely formatted message you can use Slack's [Block Builder](https://app.slack.com/block-kit-builder/?ref=internalnote.com) to build a nice message with buttons and text.

```json
{
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "New article published on our Help Center"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "Title"
},
"accessory": {
"type": "button",
"text": {
"type": "plain_text",
"text": "View Article",
"emoji": true
},
"value": "article",
"url": https://internalnote.com,
"action_id": "button-action"
}
}
]
}
```
## Setup a Cloudflare Worker
You could handle the incoming webhook in a variety of platforms, but I prefer to use Cloudflare Workers since they are free, fast and easy to use (and can be run in a [Carbon Neutral Green mode](https://internalnote.com/webhooks-for-guide)).
You can find the full code in the Repository below, or follow along to learn how it works.
[GitHub - verschoren/helpcenter\_webhooks: Capture incoming Help Center Webhooks and push them to SlakcCapture incoming Help Center Webhooks and push them to Slakc - GitHub - verschoren/helpcenter\_webhooks: Capture incoming Help Center Webhooks and push them to SlakcGitHubverschoren](https://github.com/verschoren/helpcenter%5Fwebhooks?ref=internalnote.com)
⚠️
If you're not familiar with Cloudflare Workers you could setup the same flow with Zapier. The downside is that Zapier Webhooks (needed to capture the webhook from Zendesk) are a Premium feature.
The worker is pretty straight forward. We first retrieve the `POST` JSON payload Zendesk sends to the Worker.
Next we retrieve the `article ID`, `title`, and `locale` from the payload. We then build a full `url` for the article.
```javascript
export default {
async fetch(request, env) {
const { url } = request;
const article = await request.json();
var article_id = article.detail.id;
var article_title = article.event.title;
var locale = article.event.locale;
var base = 'https://support.internalnote.com/hc/';
var full_url = `${base}${locale}/articles/${article_id}`
var slack = await postToSlack(full_url,article_title);
return new Response('pushed to Slack');
}
}
```
Once we have all the variables we need, we insert them into our message payload and post our message to Slack using the `webhook URL` we got from creating a Slack App earlier.
```javascript
async function postToSlack(full_url,article_title){
var message = JSON.stringify({
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "New article published on our Help Center"
}
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": article_title
},
"accessory": {
"type": "button",
"text": {
"type": "plain_text",
"text": "View Article",
"emoji": true
},
"value": "article",
"url": full_url,
"action_id": "button-action"
}
}
]
});
const url = "https://hooks.slack.com/services/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";
const init = {
body: message,
method: 'POST',
headers: {'content-type': 'application/json',},
};
const response = await fetch(url, init);
return response;
}
```
## Webhook
Now we can finally link all items together and start using the new Webhook functionality in Zendesk:
1. Go to the Admin Center and choose *Apps and Integrations*. Click on Webhooks
2. Create a new webhook by clicking the button top right
3. Choose *Zendesk Events* and select *Article Published* from the list of options
4. Press Next
5. Enter a Name, Description, and the URL of your Worker. Ignore all other settings.
6. Press Test. You should get a Slack Notification.
7. Once the test runs successful press *Create Webhook* to enable the flow.





## Result
Every published article in Guide will now become a Message in a Slack Channel of your choice!

# So, what's next?
I really like these kind of additions to the Zendesk platform. They make integrating Zendesk into a company or workflow way easier than before. You could imagine flows where a downvoted article generates an alert for a Guide Admin to take a look, or where comments ping a moderator to take a look.
Looking further I'd really love to see the Zendesk Enterprise [approval flows](https://support.zendesk.com/hc/en-us/articles/4408829231770-Reviewing-approving-and-publishing-articles-with-Team-Publishing?ref=internalnote.com) be available as Events too. Instead of emailing an author about approving changes, you could ping them in Slack, or add a task in Asana for them to take a look at the article.
There's always a [wishlist](https://internalnote.com/zendesk-wishlist/) for these new features ;-)
So what are you building?
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** via email or ****share** the article to your colleagues.
### Automatic Ticket Categorisation and Sentiment Analysis via ChatGPT
URL: https://internalnote.com/chatgpt-categorization/
Last updated: 2025-09-08T06:42:49.000Z
These last few months ChatGPT and Generative AI have been all the hype and new use cases for this fun API have been popping up left and right.
Zendesk itself has also picked up these new capabilities and has been actively blogging about its possibilities [here](https://www.zendesk.com/blog/generative-ai/?ref=internalnote.com) and [here](https://www.zendesk.com/blog/zendesk-ai/?ref=internalnote.com).
And last week they also promised some major announcements in this space on their [Relate Event](https://mc.zendesk.com/mc/zendesk-relate/?ref=internalnote.com) in May.
Even though there is a lot of noise and hype around this tool, in the end it is an API, and like any technology, it's more important thinking about how it can fit in your processes and improve them than to think about the technology itself.
> “The question you have to ask yourself is, what is your application designed to do? What problem are you looking for the LLM to solve? Different applications have different requirements and different risks."
> *Jaakko Pasanen, Chief Science Officer, Ultimate*
According to Ultimate, a leading ChatBot and Automation provider, there's four ways Generative AI like ChatGPT can assist in Customer Care, as highlighted in a recent article they posted on their website.
[How to Use ChatGPT for Your Customer Support: Challenges to OvercomeThe challenges and opportunities of LLMs and generative AI in customer service, based on real examples.ultimate.aiGesche Loft](https://www.ultimate.ai/blog/humanized-ai-how-to-use-chatgpt-for-your-customer-support-challenges-to-overcome?ref=internalnote.com)
## The four main impact points
1. **📝 Summarise** support tickets
2. **🔀 Sort and categorise** customer data into intents
3. **💬 Craft example replies** for conversation designers to use as is or as inspiration to brainstorm dialogue
4. **🧙♀️ Transform factual replies** to customer requests into a specific tone of voice
In this article we'll do a deep-dive into two flows that build on top of the Summarise and Sorting powers of ChatGPT and Zendesk.

# 📝 Summarise
The first impact point has been nicely explained by Zendesk itself in a tutorial on the Zendesk Developer website. They published a full how-to on how to create a sidebar app that summarises a conversation each time a ticket is updated.
This makes it easy for anyone looking at a ticket to get the conversation at a glance.
[View Tutorial](https://developer.zendesk.com/documentation/apps/build-an-app/using-ai-to-summarize-conversations-in-a-support-app/?ref=internalnote.com)
# **🔀** Set Ticket Category and Sentiment
The focus of this article lies on the second impact point: Sorting tickets.
The tutorial below will show you how to build a flow that takes any incoming ticket and assigns a category and sentiment to the ticket, which can then be used to set SLA, priority e.a. in your environment.
## Concept
This flow uses a Cloudflare Worker to set the sentiment and category of any created ticket upon ticket creation.
It runs as follows:
1. We have a trigger that notifies a webhook whenever a ticket is created
2. The webhook submits the ID of the created ticket to a Cloudflare Worker
3. The worker uses OpenAI to define a category and sentiment for the ticket and maps it to existing custom field values in your instance.
4. We update the ticket with the sentiment and category value.

Read on for the full tutorial.
# How to build this flow
## Custom Fields
We need two custom fields for this. They can be new Fields, or your existing Category field already in use in your instance.
- **Category**, a dropdown list of categories you want to map your tickets to.
- **Sentiment**, a dropdown with Positive, Neutral and Negative sentiments. Or whichever you prefer for your use case.

You can tweak these drop-downs to your liking or use case, the important thing is that they have a few values.
Note down the Ticket Field ID for both of these Custom Fields
## Worker
The major work of this flow will be done by the Cloudflare Worker. To set it up you can use the repository and copy the `worker.js` code to a new worker via [https://workers.new](https://workers.new/?ref=internalnote.com).
Mine runs at `https://chatgpt-category.internalnote.com`
[GitHub - verschoren/chatgpt-category-worker: A Cloudflare Worker that updates a Zendesk Ticket Category and Sentiment TagA Cloudflare Worker that updates a Zendesk Ticket Category and Sentiment Tag - GitHub - verschoren/chatgpt-category-worker: A Cloudflare Worker that updates a Zendesk Ticket Category and Sentiment TagGitHubverschoren](https://github.com/verschoren/chatgpt-category-worker?ref=internalnote.com)
Once you've initialised your worker, go to the Deployment Settings and add the following five Environment variables:

- `CATEGORY` and `SENTIMENT` are the Custom Fields IDs from the previous step.
- `DOMAIN` is the subdomain of your Zendesk instance
- `OPENAI` is your [OpenAI API Key](https://platform.openai.com/account/api-keys?ref=internalnote.com) (This requires a subscription)
- `TOKEN` is the [Base64 Encoded](https://www.base64encode.org/?ref=internalnote.com) `admin@example.com:token/zendesk_token` of your Zendesk instance with `admin@example.com` any admin in your instance, and `zendesk_token` a [Zendesk API Token](https://support.zendesk.com/hc/en-us/articles/4408889192858-Generating-a-new-API-token?ref=internalnote.com).
### Get Info
The script starts by extracting the `ticket_id` from the URL the worker is triggered from.
We then load the category and sentiment values from your custom fields, as well as the ticket description.
```javascript
export default {
async fetch(request, env) {
const path = new URL(request.url).pathname;
var ticket_id = path.split('/')[1];
var categories = await getCustomField(env,env.CATEGORY);
var sentiments = await getCustomField(env,env.SENTIMENT);
var conversation = await getTicketDescription(env,ticket_id);
// ...
}
}
```
Since the API has a limit of \~4K tokens, we use a bit of code to cleanup the description first:
var description = results.ticket.description;
```javascript
var description = results.ticket.description;
//Remove HTML Code to trim description
const regex = /<[^>]*>/g;
const cleaned = description.replace(regex, " ");
//The limit is 4097 tokens for the API with ~4 characters per token.
//So let's trim the description to 10k characters to be safe.
const trimmed = cleaned.substr(0, 10000);
return trimmed;
```
### Prompt
Once we've got the basic information, we generate two prompts we'll send to OpenAI. These prompts include the ticket field values and ticket description.
> Map the conversation below to this JSON list of categories and return only the value (but not the name or raw\_name) of the best matching category.
You can tweak this prompt to your liking but for me this one worked the most stable.
```javascript
var category_prompt = categoryPrompt(categories,conversation);
var sentiment_prompt = sentimentPrompt(sentiments,conversation);
function categoryPrompt(categories,conversation){
return `
Map the conversation below to this JSON list of categories and return only the value (but not the name or raw_name) of the best matching category.
${conversation}
Categories:
${JSON.stringify(categories)}
`
}
function sentimentPrompt(sentiments,conversation){
return `
Map the conversation below to this JSON list of sentiments and return only the value (but not the name or raw_name) of the best matching sentiment.
${conversation}
Sentiments:
${JSON.stringify(sentiments)}
`
}
```
### Get OpenAI Response
Once we have two good prompts to get the sentiment and category for a ticket, we'll forward those to OpenAI to get the AI to return the best match for the categories and sentiments for the given description.
Note we're using the `text-davinci-003` [model](https://platform.openai.com/docs/models/gpt-3-5?ref=internalnote.com) here since we only need a single text prompt to be returned and don't require a conversation with ChatGPT and require deeper understanding of long text.
```javascript
var category = await openAIRequest(env,category_prompt);
var sentiment = await openAIRequest(env,sentiment_prompt);
async function openAIRequest(env,prompt){
const request = {
model: "text-davinci-003",
prompt: prompt,
temperature: 0.6,
max_tokens: 200,
}
const url = "https://api.openai.com/v1/completions";
const init = {
body: JSON.stringify(request),
method: "POST",
headers: {
"content-type": "application/json;charset=UTF-8",
"authorization": "Bearer " + env.OPENAI
},
};
const response = await fetch(url, init);
const results = await response.json();
return results.choices[0].text.trim();
}
```
### Update Ticket
And finally, once we got a `category` and `sentiment` we can update the Zendesk Ticket with the new values of the Category and Sentiment dropdown fields.
```javascript
if (category && sentiment){
await updateTicket(env,category,sentiment,ticket_id);
return new Response("Ticket updated: " + category+' '+sentiment)
} else {
return new Response('Nothing could be mapped');
}
async function updateTicket(env,category,sentiment,ticket_id){
const url = `https://${env.DOMAIN}.zendesk.com/api/v2/tickets/${ticket_id}.json`;
const ticket = {
"ticket": {
"custom_fields": [
{"id": env.CATEGORY, value: category},
{"id": env.SENTIMENT, value: sentiment},
]
}
}
const init = {
body: JSON.stringify(ticket),
method: "PUT",
headers: {
"content-type": "application/json;charset=UTF-8",
"authorization": "Basic " + env.TOKEN
},
};
const response = await fetch(url,init);
const results = await response.json();
return results;
}
```
🤔
Note, we only check on existance of a value for those two fields, if the value is a non-existing value the API randomly invented the API call will fail.
You can finetune the script to handle those scenario's, or, ignore it like it did. In the case the AI can't figure out a category or sentiment we'll let the agent handle those tickets when they update the ticket.
## Webhook
Create a new Webhook that reacts to a Trigger.
Set the Endpoint URL to the url of your worker, followed by the Ticket ID: `https://chatgpt-category.internalnote.com/{{ticket.id}}`
Leave the other Authentication and Headers options as is. If you've setup the worker correctly you'll get a `200 OK` status and a `Ticket Updated` message after testing the Webhook.




## Trigger
To finalise the setup we need to notify the webhook each time a ticket is created. You can do this by adding a new Trigger that fires when a ticket is created.
Set the Actions to *Notify Active Webhook* and select your Webhook. Remote any URL parameters and leave the rest of the options as is.


## Next Steps
Now that every incoming ticket gets automatically assigned to the right category and sentiment you could use this data to:
- Create triggers that respond to changes in Category and assign the right priority or group to a ticket
- Update ticket priority based on the sentiment
- Have a trigger that calls the webhook each time the customer replies to keep the sentiment updated to the right one
- Create a report that maps sentiment and SLA
# Conclusion
This article showed one (or thanks to Zendesk, two) use cases for ChatGPT to automate and improve your Zendesk Workflows.
This are, on purpose, two flows where we only have an internal impact without any text going to the customer.
When using ChatGPT to generate replies and comments I'm still hesitant. Making sure the facts, tone of voice and quality of the replies aligns with your company values and processes is complex, and I feel it's still early days for fully automated customer interactions.
However, for a future article I'm exploring a flow on summarising Guide Articles in Agent replies.
Also keep an eye on the [YouTube channel](https://www.youtube.com/watch?v=6sSZNSsQQZg&list=PLiM5KikPhEoUiVBLvSER7cf7ToMpn8u7J&ref=internalnote.com) from Premium Plus. My team there has been building some pretty cool apps with ChatGPT too!
### Deep-dive into issues related to Messaging Authentication and JWT User Mapping
URL: https://internalnote.com/deepdive-into-messaging-profiles/
Last updated: 2025-09-08T06:42:58.000Z
⁉️
Apparently old Zendesk accounts can be tagged with an internal flag that prevents External ID matching to work. Zendesk Support removed the flag from my account and External ID tagging now works as expected.
This means Email matching is still an issue, but External IDs do work!
Currently the authentication for Zendesk Messaging as described in my article below has some weird behaviours when it comes to matching to existing Zendesk User Profiles. There's also a rather long thread about these issues on the [Zendesk Community](https://support.zendesk.com/hc/en-us/articles/4411666638746-Authenticating-end-users-in-messaging-for-the-Web-Widget-and-mobile-SDK?page=4&ref=internalnote.com#comments).
[Authenticate Zendesk MessagingZendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.Internal NoteThomas Verschoren](https://internalnote.com/jwt-messaging/)
## What you would expect is:
If a user logs into Messaging and already exists in Zendesk with the same email or external ID, the resulting conversation is mapped against the existing user.
So let's test a few scenario's and log their outcomes:
1. **New user that's never interacted with Zendesk**
A new user uses Messaging for the first time and is logged in via JWT.
Result: --> A new end-user is created without an associated email address in Zendesk.
2. **An authenticated existing user with an email address that exists in Zendesk**
An existing end-user logs into Messaging and starts a conversation. Even though the email address matches an existing user, a new user is created in Zendesk.
3. **An unauthenticated existing user with an email address that exists in Zendesk**
An existing user uses messaging and is **not** logged in. They enter an email address in the *Ask for Details* step. This conversation is added as a ticket linked to the existing user in Zendesk that has a matching email address. (🥳 Finally a good result!)
4. That **same** existing user that has now both messaging and email address linked, now logs into Messaging and starts chatting. This creates a new user without an email, unlinked from the existing user. 🤯
As you can see, none of the scenario's fully match the behaviour one would expect.
Only when you merge a *newly created logged in Messaging user* and the *existing email user profile*, you can achieve a mapping to the same user for any following tickets. But since Zendesk does not show the email address of the logged in Messaging anywhere in the interface, there is no way for an agent to know who to merge too.
## Conversation API
⚠️
****If you have access to Sunshine Conversations,** you can use the Smooch API to do some lookups and retrieve the required values afterwhich you're able to merge the users.
Zendesk also enabled customers to generate a Sunshine Conversation API via de Admin Panel for Suite users.

Below are some example flows that show the actual data and API calls made for these tests.
If you encounter these same issues, please upvote or add a comment to this [Community Post](https://support.zendesk.com/hc/en-us/articles/4411666638746-Authenticating-end-users-in-messaging-for-the-Web-Widget-and-mobile-SDK?page=4&ref=internalnote.com#comments), so we can get this fixed.
# Scenario 1: Test with a new user
## Authenticated Messaging Flow via JWT
This is an example of the JWT token I generate. Note the External ID I use has the email address as part of it to make it show up *somewhere* in the UI for agents. IN real scenarios you'd use an actual ID here from your user database.
```json
{
"alg": "HS256",
"typ": "JWT",
"kid": "app_62965da0ae721700f5743234"
},
{
"scope": "user",
"name": "Peter Parker",
"email": "peterparker@spiderman.example",
"external_id": "user_peterparker@spiderman.example",
"exp": 1682149431
}
```

## Get User Identities in Zendesk
Since the Messaging account info doesn't show up in the interface, I dove into the Identities API to see if something would show up. More info in [this](https://developer.zendesk.com/api-reference/ticketing/users/user%5Fidentities/?ref=internalnote.com#show-identity) Developer article.
```bash
curl --location 'https://d3v-verschoren.zendesk.com/api/v2/users/11109600149778/identities/11109600154130' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic zendesk_token'
```
And yes, there is a `messaging` type in the profiles for these users. No UI in Agent Workspace, but retrievable via API.
```
{
"identity": {
"url": "https://d3v-verschoren.zendesk.com/api/v2/users/11109600149778/identities/11109600154130.json",
"id": 11109600154130,
"user_id": 11109600149778,
"type": "messaging",
"value": "425a9d0b802f5f2ca9cc7463",
"verified": true,
"primary": true,
"created_at": "2023-04-21T07:44:07Z",
"updated_at": "2023-04-21T07:44:07Z"
}
}
```
## Get User in Sunshine Conversations
At first glance this information is not really handy. The `value` on these profiles does not show up on the users, profiles or identities objects in Zendesk. It's only because I have Sunshine Conversations active that checking the `value` against user IDs in SunCo that actual information on the user showed up.
More info on this API can be found in the [Smooch](https://docs.smooch.io/rest/?ref=internalnote.com#operation/getUser) documentation.
🤔
This requires a user to have an active SunCo subscription for its account
```bash
curl --location 'https://api.smooch.io/v2/apps/5f8ecbf276da07000cb2a456/users/425a9d0b802f5f2ca9cc7463' \
--header 'Authorization: Basic sunco_token'
```
```json
{
"user": {
"signedUpAt": "2023-04-21T07:39:09.052Z",
"hasPaymentInfo": false,
"identities": [],
"id": "425a9d0b802f5f2ca9cc7463",
"externalId": "user_peterparker@spiderman.example",
"profile": {
"surname": "Parker",
"givenName": "Peter",
"email": "peterparker@spiderman.example",
"locale": "en-GB"
},
"metadata": {}
}
}
```
# Scenario 2: Start with an existing user that has a external ID
My previous article wrongly noted that creating an Authenticated Messaging user with an External ID that matches an existing Zendesk user would have the system match those users and correctly map the conversation.
Let's test this.
## Create Test User
```bash
curl --location 'https://d3v-verschoren.zendesk.com/api/v2/users.json' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic zendesk_token' \
--data-raw '{
"user":{
"name":"Green Goblin",
"email": "greengoblin@spiderman.example",
"external_id": "user_greengoblin@spiderman.example"
}
}'
```
```json
{
"user": {
"id": 11109844978962,
"name": "Green Goblin",
"email": "greengoblin@spiderman.example",
"external_id": "user_greengoblin@spiderman.example",
...
}
}
```

## Authenticated Messaging Flow via JWT
I then did a new authenticated API call via https://jwt.internalnote.com with a user that matches the name, email and external ID of this new test user.
This still does not work, I still have two users. One with a Messaging Identity, and a regular Zendesk user.


# A temporary solution
If you have Sunshine Conversations this could be a temporary solution:
- Create a sidebar app that runs next to your tickets.
- Have the app look up the identities of the current requester and get the `type:messaging` identity
- Retrieve the `value` of that identity
- Do a lookup in Sunshine Conversations for that user
- Retrieve the `email` of that user with the information from its `profile:{}` payload
- Search for a user in Zendesk with that same email, and if found merge into that user
- If not found, update the profile of the Zendesk user with the information from its `profile:{}` payload.
You can find a repository that contains a proof of concept of this flow in the following GitHub repository:
[GitHub - verschoren/messaging\_user\_merger: An app that merges Messaging and Email users in ZendeskAn app that merges Messaging and Email users in Zendesk - GitHub - verschoren/messaging\_user\_merger: An app that merges Messaging and Email users in ZendeskGitHubverschoren](https://github.com/verschoren/messaging%5Fuser%5Fmerger?ref=internalnote.com)

# Other remarks
There's also a weird bug: Any regular end-user with an `external_id` set, regardless of them having logged in or not, get a green checkmark with shows "Authenticated" when you hover over it 🤷♂️.

### Learn how to build a full-featured Flow Builder Bot for Zendesk.
URL: https://internalnote.com/flow-builder-dinosaurs/
Last updated: 2025-09-08T06:43:03.000Z
Zendesk Flow Builder has been available for over two years now, and since that time it evolved from a basic flow builder (pun intended) to a complex tool that allows for advanced logic, API calls, authentication and a lot more.
I've [written](https://internalnote.com/tag/flow-builder-and-chatbot/) about how to work with Flow Builder in the past, but since the latest set of releases during the [What's New](https://internalnote.com/whats-new-march-2023/) in March most of the last remaining big ticket items are now available, which means it's time for a deep-dive into Flow Builder.
This article will show you how to build a complete bot and will touch upon every available feature available in Flow Builder. You can find an overview video below, and then you can choose to either watch the full 45min tutorial later in this article, and/or read the article to learn more about the specifics steps used.
# 🦖 Jurassic Park Flow Builder Bot
Tutorials are only as fun as the subject it teaches, so for this how-to will build a bot for Jurassic Park.
We'll start with setting up a few intents and show Help Center articles, before we dive into the really fun stuff with API calls to check on Dinosaur escapes, and use the new authentication metadata to check upon bookings for the park.
Welcome to Jurassic Park. 😎
# How to build a complex Flow Builder Bot
## Customer Intents
As I'll also mention in the tutorial video below, the first step to build a good Chatbot is to define the issues the bot should help the customer with.
In my scenario here, I'm trying to solve four scenarios that will lower agent workload:
1. **How to buy tickets**
Deflect tickets about ticket purchases so that most customers can self-serve and agent only need to handle the complex cases.
2. **Info on Dinosaurs**
Although the Customer Care team should be able to give information about the animals in the park, most of these questions are generic and easily satisfied with a good [article](https://support.internalnote.com/hc/en-us/sections/10793749626514-Jurassic-Park?ref=internalnote.com) or video.
3. **Status of the park**
When things break, you should inform customers in an automated way so that your agents can handle the real emergencies and focus on one to many communication.
4. **Order Information**
Most people that need information on orders either want confirmation or lost their booking emails. Offering that info up front gives agents time to handle real issues with payments or erroneous bookings.
## Mapping it all out
I always start with a flow chart that maps out a rough overview of the flows you expect your customers to follow. This will serve as a guideline for building your Flow Builder bot, and allows for quick iteration before you commit on building the bot.
💡
Since these are four specific flows a customer can take, it's best to build those as four separate intents. This way you can show the intents to the customer upon opening the widget, you can directly launch an intent if a customer searches for it (e.g. I want to buy a ticket), or you can use the intent for [Pro-Active Messaging](https://support.zendesk.com/hc/en-us/articles/5381304334234-About-proactive-messages?ref=internalnote.com).
## Answer Flow Step Types
Flow Builder has around a dozen different Step Types you can use to build your bot. We'll use all of them to build our different flows and intents.
[Understanding answer step typesWhat’s my plan? Tip: Zendesk has renamed our bot capabilities. Answer Bot is now Zendesk bots, Flow Builder is bot builder, and Article Recommendations are autoreplies. Some older features still…Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/4408836323738-Understanding-bot-flow-step-types?ref=internalnote.com#topic%5Fzqr%5Fgwc%5Fk4b)
# Intent #1: Ticket Info

Our first Intent is the *Buy a Ticket* intent. It's a pretty basic flow that offers the customers a set of preselected Guide articles, ask if the issue is resolved and if not, escalates to an Agent.

## Show Help Center Articles
This [step](https://support.zendesk.com/hc/en-us/articles/4408836323738-Understanding-answer-flow-step-types?ref=internalnote.com#topic%5Fgrj%5Fgwc%5Fk4b) allows you to show up to six public articles to your customers. Articles will be shown in the locale the Widget is loaded in and articles are always shown in a carousel in the same order.
Once a customer clicks an article, they'll be redirected to your Help Center. But no worry, if they open the Widget again it'll remember their actions. Any read article will show up in the Context Panel in Agent Workspace [if you've enabled](https://support.zendesk.com/hc/en-us/articles/4408829170458?ref=internalnote.com#topic%5Fnq1%5Fqnm%5Fxsb) those events.
## Ask if question is resolved
Once we've shown the articles we'll ask the customer if the question is now resolved. The answers to this question will be stored in [Explore](https://support.zendesk.com/hc/en-us/articles/4408829761690-Analyzing-your-Flow-Builder-activity?ref=internalnote.com) so you can measure your success-rate. If the customers answers negatively, we'll escalate to an Agent.
## Business Hours
Zendesk Messaging can take your Support schedule into account and can show a different reply inside or outside of Business Hours.
## Authentication Info 🆕
If you allow your users to [login](https://internalnote.com/jwt-messaging/) to your Messaging Widget you can use that information to pre-fill their name and email and make escalation to an Agent easier. You could even have different experiences for VIP users vs regular users, or assign logged in users to a separate support tier.
[Announcing Flow Builder - Messaging Authentication MetadataRollout start Rollout end March 17, 2023 March 20, 2023 We’re excited to announce that you can now build more personalized experiences for authenticated users by using Messaging Authentication…Zendesk helpLisa Tam](https://support.zendesk.com/hc/en-us/articles/5492040520474-Announcing-Flow-Builder-Authentication-Metadata?ref=internalnote.com)
## Transfer to Agent
Once we've offered a few Self Service solutions in attempt to deflect the question, and got confirmation that, yes, the customer does need help, we can transfer the conversation to an Agent in Support.
For unauthenticated users we can use the Ask for Details step (see below) to ask for their name and email, before we attempt to find an available agent.
[Zendesk helpLogo](https://support.zendesk.com/hc/en-us/articles/5378287266586-Announcing-updates-to-Flow-Builder-Transfer-to-Agent-step-?ref=internalnote.com)
# Intent #2: Dinosaur Info

Similar to the basic deflect or escalate flow in our first Intent, this second Intent will follow a similar path.

## Carousel
When the customer chooses the *Dinosaur Info* option we'll use the Carousel step to show them information on three Dinosaurs. Each carousel element included an image (loads an externally hosted photo), a short description, and a button that links to a Help Center (or external) article with information about the Dinosaur.
## Escalate to Agent
Here also, when the customer lets the bot know that they need more information, we escalate to an Agent.
💡
Did you know a right click on any step allows you to copy the step and all steps below? You can then paste that logic anywhere else in your bot and reuse it, instead of recreating a flow from scratch.
# Intent #3: Fence Status

Our third intent introduces some more logic based on API calls and handling the returned data.

## API Call
When a customer chooses the *Status of the Fences* intent we immediately fire an API call. This API call checks an external API resource `https://jurassic-park-bot.internalnote.com/status` and gets a payload back.
```json
{
"status": ["all_good","unlocked_raptor","unlocked_trex","evacuate"]
}
```
We make use of the recently announced [Custom Webhook Headers](https://internalnote.com/custom-authentication-for-webhooks-update/) to reach a protected API resource, and store the returned `payload.status` in to a variable `status`
If the API call fails we'll try to reach an agent for the user by once again copying those steps from the previous Intent.
[GitHub - verschoren/jurassic-park-bot: Cloudflare Worker with API Endpoints for the Jurassic Park Widget IntentCloudflare Worker with API Endpoints for the Jurassic Park Widget Intent - GitHub - verschoren/jurassic-park-bot: Cloudflare Worker with API Endpoints for the Jurassic Park Widget IntentGitHubverschoren](https://github.com/verschoren/jurassic-park-bot?ref=internalnote.com)
## Branch By Condition 🆕
If we do get a valid payload back we use the new Conditional Flows step to show different results based on the `status` value. For each status we show a Bot Message step that includes an externally linked image and a button that links to a Help Center article. And since this Intent often ends with disasters and escaped Dinosaurs, we do not escalate to an Agent for this flow.
[Zendesk helpLogo](https://support.zendesk.com/hc/en-us/articles/5378419926426-Announcing-Flow-Builder-Conditional-Flows?ref=internalnote.com)
💡
You'll notice we use a nested branch condition for this step. We could have used only one, but since this step only supports up to 5 conditions, it's useful to showcase this nested scenario. It's a simple hack that allows you to circumvent the five conditions limitation.
# Intent #4: Order Info

Our final intent is a variation on the previous one. We once again make an API call to an external service, but instead of a hardcoded URL with results that are the same for all visitors, we'll make an API call that contains unique information provided by the customer and returns personalised responses.

## Ask For Details
We use the *Ask For Details* step to ask for an Order Number. This value is stored in a custom field for easier retrieval by an Agent if escalation is needed, and is also automatically stored in a variable `Order Number` we can use anywhere in our Bot Logic.
## API Call with POST/Details
Where the previous Intent did a GET request, we will now make a POST request to `https://jurassic-park-bot.internalnote.com/order` with a JSON Payload:
```json
{
"order_id":"{{Order Number}}"
}
```
The API call either fails, or successfully returns our order data. We store all returned data in variables, and use the *Send a Message* step to return the data in a nicely formatted way.
```json
{
"items": [
{
"name": "Jurassic Park Adventure Park",
"quantity": 2,
"ticket_price": 150,
"ticket_type": "1-Day Park Hopper",
"type": "attraction"
},
{
"name": "Jurassic Park Hotel",
"nights": 3,
"room_price": 350,
"room_type": "Deluxe Room",
"type": "hotel"
}
],
"order_date": "June 2nd",
"order_id": "ORD1002",
"order_status": "confirmed"
}
```
💡
Sadly, Flow Builder does not support looping through arrays to store API call responses into variables. So in a scenario like this one where we get an array of items we need to manually store each `items[i]` as a unique array and the API call will fail if we store e.g. a variable `items[3]` and the next API call only responds with 1 element.
# Conclusion
What started as a fairly simple Flow Chart to handle four clearly defined intents, ended up in a complex tree of over a hundred steps, including links to Help Center articles, external APIs and hosted images.
I really hope the video above, and the documentation in this article helps you to build your own Flow Builder Bot.

## A small ask
Building this bot and tutorial took a lot of preparation. If this **free** **article** was useful to you, share it with a friend or colleague and ask them to subscribe.
If this really offered value, please consider subscribing to a paid tier to make this blog and project viable and allow me to write more of this content in the future.

#### ☕️ Supporter
Most popular way to support this website
[Subscribe Now](https://internalnote.com/#/portal/signup/63ff05d99deb9e003d619e70/yearly)
### Creating a Pokédex with Zendesk Custom Objects 2.0
URL: https://internalnote.com/creating-a-pokedex-with-zendesk-custom-objects/
Last updated: 2025-07-31T08:33:59.000Z
The awesome people at Zendesk just made the [Custom Objects v2 EAP](https://support.zendesk.com/hc/en-us/community/posts/5359269969178-What-is-the-new-Custom-Objects-EAP-?ref=internalnote.com) available.
So why not build a Pokédex inside Zendesk to get to know the APIs 😉
I'll publish a full tutorial soon on [https://internalnote.com](https://internalnote.com/), so subscribe if you want to know more!



I've also started a Wishlist of missing features and improvements:
[Custom Objects EAP FeedbackBelow is a list of feature request and remarks for the Custom Objects EAP.Internal NoteThomas Verschoren](https://internalnote.com/custom-objects-eap/)
## More info:
- [What is the new Custom Objects EAP?](https://support.zendesk.com/hc/en-us/community/posts/5359269969178-What-is-the-new-Custom-Objects-EAP-?ref=internalnote.com)
- [Custom Objects Set-up Guide for Admins](https://support.zendesk.com/hc/en-us/articles/5392409465370?ref=internalnote.com)
- [Developer documentation](https://developer.zendesk.com/api-reference/custom-objects/introduction/?ref=internalnote.com)
### Improve Your Content Discoverability with a Linked List in Zendesk Guide
URL: https://internalnote.com/linked-list-for-guide/
Last updated: 2025-09-08T06:44:41.000Z
As mentioned in last weeks' article on [Federated Search](https://internalnote.com/federated-search/), as businesses grow, their knowledge base expands too. From FAQs to product or marketing pages, there's an abundance of information available to help customers find what they're looking for. By default, the content indexed via Federated Search is only searchable, and not easily discoverable for your users.
In this article, we'll explore how to use Zendesk Federated Search and [Custom Guide Pages](https://support.zendesk.com/hc/en-us/articles/4409012911770-Creating-custom-pages-in-the-help-center?ref=internalnote.com) to create a custom page that provides a curated list of links for end-users. What sets this solution apart is that the added links are browsable just like regular Guide articles in the same UI as Article sections. This approach allows businesses to make even more content available to their customers, not just traditional FAQ articles.
With our custom page, end-users will, for example, have access to App Store install pages, marketing pages, and more. Moreover, we'll also build an admin interface that allows team leads to manage the links indexed on the Help Center and giving them the ability to add or delete links as needed. This new feature provides a more personalised experience for customers, making it easier for them to find the information they need.
In summary, by using Zendesk Federated Search to create a custom landing page, businesses can make more content available to their customers in the same UI as Article sections. This personalised experience enables customers to browse and search through a curated list of links, not limited to traditional FAQ articles. So, let's dive in and explore how to build this custom page and admin interface.
# Tutorial
As always you can find the full code on GitHub:
[GitHub - verschoren/linked-list: Linked List for Zendesk GuideLinked List for Zendesk Guide. Contribute to verschoren/linked-list development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/linked-list/?ref=internalnote.com)
# Prerequisites
Use the Federated Search API or the Search Settings in Guide to:
1. Add a source: "Linked List" and note down its ID
2. Add a few types, eg: "Interesting Articles", "Product Pages".
3. Add one record for each type via the Federated Search API. This makes sure once we retrieve records to show we can at least show one or two articles.
You can refer to my [earlier article](https://internalnote.com/federated-search/), or use the [Zendesk Documentation](https://developer.zendesk.com/api-reference/help%5Fcenter/federated-search/introduction/?ref=internalnote.com)
# Worker
As usual on this website, we'll first build a Cloudflare Worker that handles the API site of our solution. This way we can remove any API keys and complexity from the client side code rendered on your Help Center, and make use of Cloudflare's build-in caching to speed up the page rendering.
Our worker has three end-points:
- `/get` responsible for returned all Federated Search records
- `/add` responsible for adding a record
- `/delete` responsible for deleting a given record
You can copy the example in `worker.js` just make sure to change the top three variables:
```javascript
//your Zendesk subdomain
const subdomain = 'yourdomain'
//Base 64 encoded admin@domain.com/token:{Zendesk API token}
const auth = '123457890qwerty='
//The Source you want to display, "Linked List" in my example
const source_id = '01GT1VEVYWJ10HMZKMR5YRXQHB';
```
You can find the Source ID via [this API call](https://developer.zendesk.com/api-reference/help%5Fcenter/federated-search/external%5Fcontent%5Fsources/?ref=internalnote.com).
The script is pretty straight forward. The only tricky part is filtering the returned records on the `get` call to only show those of the chosen Source and handling pagination correctly:
```javascript
async function getRecords(url,federated_items){
url = url != ''? url : 'https://'+subdomain+'.zendesk.com/api/v2/guide/external_content/records?page[size]=10';
var init = {
method: 'GET',
headers: {
'content-type': 'application/json;charset=UTF-8',
'Authorization': 'Basic ' + auth,
},
};
const response = await fetch(url, init);
const results = await response.json();
merge(federated_items,results.records);
//Check if the results are paginated and if so, call the function again
if (results.meta.has_more == true){
return await getRecords(url + '&page[after]='+results.meta.after_cursor,federated_items);
} else {
//filter federated_items to remove all records with a different source.id
federated_items = federated_items.filter(function(item){
return item.source.id == source_id;
});
return federated_items;
}
}
```
💡
Since these are example pages my scripts do not have any API limiter or security headers. You should make use of e.g. Cloudflare Access or a custom header to protect your scripts!
## Custom Page
Once we have a script that allows us to get, add or delete records, we can start working on the Help Center Page.
To start, create a new Custom Page on your Help Center and copy the code from the GitHub repository in [linked-list.html](https://github.com/verschoren/linked-list/blob/main/linked-list.html?ref=internalnote.com). If you use the default Copenhagen theme, you'll end up with a page that looks exactly like your section pages.

For the page to work you'll need to replace `worker_url` with the URL of your worker.
## Permissions
The script starts with a small section that checks what role current user has and hides the admin interface if they aren't an agent or admin.
```javascript
var admin = false;
if (HelpCenter.user.role != "agent" && HelpCenter.user.role != "manager"){
$('#addlink').remove();
$('.linkform').remove();
} else {
admin = true;
}
```
## Rendering the layout
The page runs on a `getLinks()` function that
- gets all records from the Worker
- creates a section for each `type` it finds
- adds `articles` to that section and adds a delete button if the user is an admin/agent for that article
- adds each unique `type` to the Types dropdown in the form to create new links.
```javascript
function getLinks(){
var settings = {
"url": worker_url + "/get",
"method": "GET",
};
$.ajax(settings).done(function (links) {
$('#main-content').html('');
var sections = [];
links.forEach(function(link) {
if(sections.indexOf(link.type.name) === -1) {
sections.push(link.type.name);
$('#type').append(`${dropdown_option})
$('#main-content').append(`${section}`)
}
$('.article-list[data-articles="'+link.type.name+'"]').append(`${linkeditem});
});
});
};
```
## Adding Records
The HTML page has a form that asks an agent/admin for a title, url, description and type. Based on that info we can ask the worker to create a new record.

Note that records require a unique `external_id`. Since manually added records don't really have a good use for these, we just generate one based on the current timestamp.
We then call the `/add` endpoint of our worker via a POST.
```javascript
$(document).on('click', '#submit', function(event){
var json = {
"record": {
"body": $('#body').val(),
"external_id": 'abc' + Date.now(),
"locale": "en-us",
"title": $('#title').val(),
"type_id": $('#type').val(),
"url": $('#url').val()
}
}
var settings = {...};
$.ajax(settings).done(function (response) {
getLinks();
/*empty form*/
});
});
```
## Deleting Records
To remove a record we have a `data-target` element on each link we display with the record id. Clicking the delete button for a respective element asks the worker to delete that element via `/delete/id`
```javascript
$(document).on('click', '.delete', function(event){
var id = $(this).attr('data-target');
var settings = {
"url": worker_url + "/delete/"+id,
"method": "POST",
"headers": {
"Content-Type": "application/json",
},
};
$.ajax(settings);
getLinks();
});
```
# Home Page
Since Custom Pages don't show up on Guide by default we can update the `home_page.hbs` on your Guide Theme and append an extra category button like so:

Just make sure to replace `/hc/p/linked_list` with the actual link to your Custom Page.
```html
```
💡
Power Tip:
Create a Federated Search Record that indexes your Custom Page. That way your users can find it easily via search. It's a bit like Inception, but does the trick.
# Conclusion
There you have it. We created a custom page that shows a bunch of links for your End-Users, and makes your Help Center even more powerful.
### Expanded API Support via Custom Authentication for Zendesk Webhooks
URL: https://internalnote.com/custom-authentication-for-webhooks-update/
Last updated: 2025-09-08T06:43:08.000Z
Zendesk announced Custom Headers and API Key support for its Webhooks. Where they already supported `Username/Password`, you can now add up to 5 custom headers to your webhook configuration, expanding its support to way more platforms.
[Announcing API key authentication and custom headers for webhooksAnnounced on Rollout starts March 30, 2023 March 30, 2023 Zendesk is excited to announce that you can now use API key authentication and define additional headers when configuring webhooks.…Zendesk helpZach Anthony](https://support.zendesk.com/hc/en-us/articles/5532092885658-Announcing-API-key-authentication-and-custom-headers-for-webhooks?ref=internalnote.com)
I wrote about [Shortcomings of Webhooks](https://internalnote.com/shortcomings-of-zendesk-webhooks/) last fall, and mentioned three scenarios that weren't possible with webhooks at that time:
1. Use webhooks to send data to Zendesk Sell, due to lack of `Accept: application/json` header
2. Access resources behind Cloudflare Zero Trust, due to lack of custom authentication headers
3. Accessing the Asana API, due to lack of `bearer: token` support.
Let's see how this new release changes things.
# Add Sell Lead from Zendesk Support
My first example was a scenario where I wanted to create a lead in Sell each time a ticket was assigned to Sales. You can use it to add leads for tickets you assign to the Sales group, or create tasks in Sell for your Sales team,..
There obviously is a very nice integration for Sell and Support already, but sometimes doing things automatically via triggers is just a bit easier.
## Step 1: Creating a Webhook
Step one in our flow is creating a new webhook.
Use `https://api.getbase.com/v2/leads` as the Endpoint URL, `POST` as the method, and `JSON` as the format.
Next choose `Bearer token` as the authorisation method and enter your [Access Token](https://developer.zendesk.com/documentation/sales-crm/first-call/?ref=internalnote.com#1-generate-an-access-token).
Finally, add a **new** Header with `Accept` as the name, and `application/json` as the value.


## Step 2: Adding a Trigger
Next up, calling our Webhook. For this we'll use a trigger which, each time a ticket is assigned to Sales, will create a new Lead in Sell with the relevant information, and solve the ticket.
The ticket will dissappear from the Inbox of your Support Team, and a new Lead will appear in Sales' Pipeline.
Create a new trigger that looks for:
- group is changed to Sales
And add the following conditions:
- Status is solved
- Notify Webhook (the one you just created) and add the following JSON payload.
```json
{
"data": {
"first_name": "{{ticket.requester.first_name}}",
"last_name": "{{ticket.requester.last_name}}",
"organization_name": "{{ticket.organization.name}}",
"description": "{{ticket.description}}",
"email": "{{ticket.requester.email}}"
}
}
```


## Result
And, if all goes well, each time we now assign a ticket to sales, the ticket will be resolved, and a new lead will show up in Zendesk Sell.


# Protect Cloudflare Worker
As you've probably already noticed on this blog, I'm a big fan of using Cloudflare Workers to handle complex API actions outside of Zendesk.
For example, in the flow below, I use a Worker combined with Zendesk Webhooks to update a newly user with a proper signature, alias and profile picture.
[Webhooks for User and Organisation eventsZendesk recently launched an expansion on their webhooks functionality that allows you to subscribe to changes in Users and Organizations and act upon those actions. In this article we’ll show how you can auto-complete agent profiles with a signature, alias and profile image upon creation.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-user-events/)
Up till now, these workers had to run "unprotected" since Zendesk was not compatible with the way Cloudflare Access works. Now, with this release, I can finally protect these workers by adding these two custom headers to my webhooks.
```html
CF-Access-Client-Id:
CF-Access-Client-Secret:
```





For more information on creating Access Tokens for Workers, take a look at the article below.
[Service tokens · Cloudflare Zero Trust docsYou can provide automated systems with service tokens to authenticate against your Zero Trust policies. Cloudflare Access will generate service tokens …Service tokens · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/service-tokens/?ref=internalnote.com)
# Adding a task to Asana
So far, that's two out of three issues resolved. Let's check the final one, Asana. In this example we're going to create a new task in Asana whenever a ticket is updated and the ticket type is changed to, you guessed it, Task.
## Step 1: Create a Webhook
First off we create a new webhook that calls the `ttps://app.asana.com/api/1.0/tasks` endpoint.
We use type `JSON` and action `POST` as the option and select `Bearer Token` as our authentication type. See [this article](https://developers.asana.com/docs/personal-access-token?ref=internalnote.com) on how to get a token.
To complete the setup, add a custom header with name: `accept` and value: `application/json` and save your webhook.


## Step 2: Create a trigger Trigger
Create a new trigger that runs when a :
- Ticket is updated
- Type is changed to Task
- Tags does not contain `asana` (this prevents multiple tickets being created)
Set the actions to:
- Alert Webhook (the one you just created)
- Add tag `asana`
In the Alert Webhook action, add the following JSON payload. Don't forget to replace the [project](https://developers.asana.com/reference/goal-relationships?ref=internalnote.com) and [workspace](https://developers.asana.com/reference/workspaces?ref=internalnote.com#workspace) IDs with your own. The result will be an Asana task with the latest comment as the description and the ticket subject as the title.
```json
{
"data": {
"resource_type": "task",
"name": "{{ticket.title}}",
"html_notes": "Zendesk Ticket #{{ticket.id}}: {{ticket.latest_comment}}",
"projects": [
"1204303360323625"
],
"workspace": "1201829988571356"
}
}
```


## Result
And if all goes well, each time we now change a ticket to type 'Task" a new task in Asana is created!
Naturally the native [Asana for Zendesk](https://asana.com/apps/zendesk?ref=internalnote.com) integration is way more useful, but this example shows that the Webhook authentication updates allow for a lot more API integrations now!


# Conclusion
3 out of 3\. I think one of my [wishes](https://internalnote.com/zendesk-wishlist/) came true.
A seemingly small update to the Webhooks feature, makes three otherwise impossible scenarios now possible.
What kind of webhooks will you build next?
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** via email or ****share** the article to your colleagues.
### What's New for Zendesk in March 2023
URL: https://internalnote.com/whats-new-march-2023/
Last updated: 2023-11-28T10:55:50.000Z
Every quarter Zendesk releases their big What's New online Keynote presenting the newest features for customers, support teams, admins and your business overall.
This time the event focusses on four big themes, which closely align with a few trends from their Trends Report for 2023: namely *Keeping up with advances in AI*, *Personalisation* and *Breaking down Silos.*
The four key elements this time were:
1. AI-powered conversational experiences
2. Intelligent operations at scale
3. Open and flexible platform
4. Trust and security
Notably, there's not a lot about Sentiment Analysis in this release. Fingers crossed for some more ML releases for Q2 2023 that might tackle this aspect of CX.
You can get a full recap of the event [here](https://www.zendesk.com/whats-new/?ref=internalnote.com), or read on for my analysis.
As a side note, I have a [running list](https://internalnote.com/zendesk-wishlist/) of wishes and complains, and I managed to remove a whopping 9 items from the list this time 🥳
#### Zendesk releases I could scratch from my Wishlist
1. Security - Groups and organization bug — [documentation](https://docs.google.com/document/d/1NKvTOtQQP5RZUbIJUQVlP2d8mkwDS2S4vdW8OiK9WM4/edit?ref=internalnote.com)
2. Security - Better search in Audit Log
3. Agent Workspace - Enable Followers by default
4. Messaging - Allow settings tags and other metadata.
5. Messaging - Allow access to Authenticated User info for API Call step
6. Guide - Allow for both SSO and Social logins side by side (e.g integrate product accounts and social logins)
7. Allow for both SSO and Social logins side by side (e.g integrate product accounts and social logins)
8. API Support - Deleted Users Add `deleted_users/delete_many?ids=`
9. Messaging Widget - Pro-Active Popup managed serverside
# 🤖 AI Powered Conversation Experiences
Apparently, AI is the new OmniChannel, or the new Self Service if the Marketing of most modern CX tools are to be believed. Leaving the discussion of fad vs feature for another time, one has to admit that since launching Messaging two years ago, the advances in Flow Builder and Conversational Experience across web and social has improved drastically since the old days of Chat and Social DMs as tickets. And the releases of this quarter keep that momentum going.
## Proactive Messages
The biggest release of this What's New was already teased a while back in a [press release](https://www.zendesk.com/blog/proactive-messages/?ref=internalnote.com). Zendesk is adding a way to send messages via the Messaging Web Widget to end-users based on specific actions they take while browsing a website.
#### 📝 Feature Overview
- New Admin section that allows Admins to create triggers for Web Messaging
- Triggers can run based on page title, visitor actions, duration of visit, tags,..
- Target specific customers who've authenticated
- You can choose when it runs based on schedules or agent availability
- Dashboard that shows your running campaigs and where and when a trigger has fired, and what the next actions of the end-user was
- You can choose between an agent or a bot as the first responder
- Available by end of March on all Suite plans
> By adopting a solution of self-service, automation and agent assistance, customers get immediate answers while agents can focus on more complex tasks. Zendesk comes pre-configured so it is easy for admins to schedule when and how often messages will be sent from an agent or bot.
This new feature combines a lot of legacy Chat Triggers but wraps them in the modern and clean UI of Messaging. Sadly it's not live (yet) with no EAP for Partners or customers, but from the short demo we've seen and the screenshots floating around it seems like a powerful tool tool both from a Marketing standpoint (product awareness), Sales (you can interrupt or assist a potential customer in their journey) or Support (pro-active alerts for downtime or issues).

There's a few caveats though. It currently only works for the Web Widget, and it only can only be configured via the Admin Panel. If you want to create alerts via API, or do complex targeting based on data that lives in your CRM, or if you want to target WhatsApp or other social Channels, you'll still need a license for Sunshine Conversations.
When the tool comes available we'll publish a deep-dive on this blog, and 🤞 find some way to interact with this via API. To conclude, CX Today wrote a nice overview from a Business standpoint.
[Zendesk Debuts Proactive Messages, a Conversational Experience ToolCX Today reports on the latest customer experience technology news from around the globe. Read similar CRM news hereCX TodayRory Greener](https://www.cxtoday.com/crm/zendesk-debuts-proactive-messages-a-conversational-experience-tool?ref=internalnote.com)
## Authenticated Metadata in Flow Builder
#### 📝 Feature Overview
- Use metadata of logged in users in Flow Builder
- Build custom paths via the Conditional Flow step for logged in users
- Personalise responses by prefilling the users' name
- Assign logged in users, or VIP users to separate Agent (groups)
This release deserves a big *finally*.** Having the information of the logged in user programatically available makes it easier to give a more personal experience (Hey John!), or preload relevant information for your end-user upon launch of the widget.
I can already imagine flows where a logged in user conditionally triggers an API call, and we serve them with the status of their latest order or their repair as part of the inquiry steps when a bot launches.
This release should also fix the issue where an authenticated Messaging User doesn't always map to an existing Email User with the same email in Zendesk, so overall, a very nice feature addition.
For more information on authenticating Messaging, take a look at this article.
[Authenticate Zendesk MessagingZendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.Internal NoteThomas Verschoren](https://internalnote.com/jwt-messaging/)
## Web Widget Customisation
#### 📝 Feature Overview
- Position anywhere on page
- Accessibility prompts
- Shape Modifier: square, circle, or rounded corners with custom radius.
- Sound on/off
- Disable attachments (security)
A few years ago I wrote the original [Zendesk Widget Configurator](https://widget.guide/?ref=internalnote.com). It turned the extensive Classic Web Widget API into a native UI and made customising that widget (slightly biased here) way easier.
When Messaging arrived I was glad to see that it came with a native interface very similar to my tool, and sad that the new widget seemingly did not have a lot to change or tweak. Over the last two years this has gradually changed, and a lot more features that used to be available to the Classic Widget are now available to the Messaging Widget.
The major items [missing](https://internalnote.com/zendesk-wishlist/) for me now are a Javascript API to tweak behaviour on a per website basis, and a way to pre-fill or skip the *Ask for Details step* in a Flow Builder flow.
If you're interesting in customising the widget even more, take a look at this article:
[Custom Launcher for Zendesk Messaging and Unread CountsZendesk recently added the ability to their Messaging Widget to use Custom Launchers. This article shows you how to easily implement it.Internal NoteThomas Verschoren](https://internalnote.com/custom-launcher-for-zendesk-messaging-and-unread-counts/)
# ⚙️ Intelligent operations at Scale
## Zendesk Explore Improvements
#### 📝 Feature Overview
- Dashboard restrictions: make only a subset of data available to an agent or group.
- Create variants of the same dashboard to dynamically change the data shown based on the selected group.
- Better agent productivity reporting
I'll be the first to admit: Zendesk Explore is not my forte. But these improvements are items I've seen lots of customers request. I've heard from customers who, thanks to the dynamic restrictions, can now turn 25 copies of the same dashboard (one for each of their groups) into 1 dashboard with just a few restrictions configured. Which also means: instead of changing 25 dashboards when a new metric is required, is not turned into 1 dashboard. Sweet.
## Custom Ticket Status
#### 📝 Feature Overview
- Turns the classic Zendesk statusses into Status Categories
- Each category can have multiple custom statusses assigned
- You can have an On Hold - Internal, On Hold - Supplier, On Hold - Development, or Pending - Waiting for Confirmation vs Pending - Waiting for Information
- Comes with full API parity
This is one of those big ticket items that removes a lot of frustration from Zendesk Admins. We're we used to use combinations of Custom Fields and Status to get insights on why a ticket was On Hold, this "new" release turns a few fixed statuses in a flexible and extensible feature in Zendesk. I say "new" since this has been available as a public beta for a few months now. If you haven't tested it yet, here's a few articles to get you started!
[Custom Status API exploringExploring the technical side of Custom StatussesInternal NoteThomas Verschoren](https://internalnote.com/custom-status-api-exploring/)
[Better Pending Ticket flow with Custom StatusesNot every ticket can be solved with a single reply. Agents often need more information from customers in order to get the full context and reply with an answer. Or, even if all info is there, they need confirmation that their suggestions worked before the ticket can be solved.Internal NoteThomas Verschoren](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/)
[Build a Task Manager in Zendesk Support via Custom StatusesTask Manager to snooze tickets in Zendesk via the new Custom Statuses.Internal NoteThomas Verschoren](https://internalnote.com/custom-status-triggers/)
# 🗺️ Open and Flexible Platform
#### 📝 Feature Overview
- ****Side conversations for Microsoft Teams**
Similar to the existing Slack integration, you can now directly escalate tickets to your colleagues in Microsoft Teams. Useful for escalations to e.g. DevOps, IT or Finance. Still in Early Access
[More Info](https://support.zendesk.com/hc/en-us/articles/5191537451290?ref=internalnote.com)
- ****Zendesk for Google Chat**
Get notified and take quick actions on Zendesk tickets right from Google Chat. Notifications can happen in batch.
[Install the App](https://www.zendesk.com/marketplace/apps/support/913140/zendesk-for-google-chat/?ref=internalnote.com)
- ****Shopify Premium app**
More complex and extensive integration to Shopify then the free default integration.
[Install the App](https://www.zendesk.com/marketplace/apps/support/867416/shopify-premium-for-zendesk/?ref=internalnote.com)
- ****Quick Setup for Sandboxes**
Allows for sandbox creating in minutes instead of hours. You can start working once the setup has been copied, no reason to wait for all (sample) data to be cloned.
- ****New Unity SDK**
Same experience as the Web Widget and Zendesk SDK, but now written for Unity and easier to implement into Games.
- ****Flexible Webhooks**
Use Zendesk Events like creation or modification of users, organizations, groups as a trigger for external API actions.
The Open platform section of the event started with a nice overview of how you can integrate with Zendesk and built on top of it. Most customers start with the Marketplace or play around with Zapier or Workato to automate some processes.
Readers of this newsletter and website know I love to focus on the other end of the platform, by leveraging the what Zendesk calls "Pro-Code" side of integrations. I personally prefer Custom Development as a term but yeah..

This being a customer facing event, most of the releases are focussed on On The Shelf and Low-Code with some a few new Marketplace Apps and a few prebuilt integrations.
Teams for Side Conversations (not to be confused with the [Teams for Support](https://www.zendesk.com/marketplace/apps/support/767198/microsoft-teams-for-support/?ref=internalnote.com) app) complements the existing Slack integration nicely and helps integrating Zendesk into both Google/Slack, and Office365/Teams environments.
This combined with the upcoming UI change where Side Conversations get a nice new location in the Context Panel on the right side of Agent Workspace will makes this an often used solution that "breaks silos".
The only real low-level code feature we got this time was Flexible Webhooks. It's a bit weird this feature got stage time, since its' been around since late last year already. Nevertheless it's a good feature. Instead of needlessly parsing `created_at` dates or listening to an Incremental Export stream, you can now subscribe to a specific Zendesk event (like User Creation) and have your CRM react to it to e.g. augment data and fill in some custom fields. See an exam article below:
[Webhooks for User and Organisation eventsZendesk recently launched an expansion on their webhooks functionality that allows you to subscribe to changes in Users and Organizations and act upon those actions. In this article we’ll show how you can auto-complete agent profiles with a signature, alias and profile image upon creation.Internal NoteThomas Verschoren](https://internalnote.com/zendesk-user-events/)
Would I have loved to see more custom development tools? Sure. Sunshine Events could use some love, Custom Objects desperately need some UI integrations and bulk APIs and ways to programmatically interact with Explore Reports or the Web Widget are sorely missed.
# 🔐 Trust and Security
#### 📝 Feature Overview
- Separate Group and Organization permissions for a more granular permissions and roles.
- Audit Log allows for filtering by type: specific settings, users, and business rules. You can also filter by the name of an object.
- Deleted users are automatically permanently deleted after 30 days
- Multiple SSO sign-in options for end-users and agents - [More Info](https://support.zendesk.com/hc/en-us/articles/5380943678106?ref=internalnote.com)
- Advanced Encryption (BYOK)
This section often feels like the "Let legal also have something to say", but it's impressive to see how Zendesk keeps shoring up their walls while keeping the interface and admin experience easy to use and understandable.
Where other tools have layers of IAM management and permission models, setting up Zendesk roles and permissions still feels fairly simple, even though it's compatible with more and more complexer models over time.
The complex and direct language used in the Advanced Encryption announcement makes me think this feature will differ from what we're used to, but hopefully it comes with that same "beautiful and simple" experience.
As far as User Deletion goes, the new Auto-Delete feature feels more like a way for Zendesk to improve their storage usage than a way to make GDPR easier, and even though the new automation is easy, I still need to resort to the `/search` and `/delete_many` API endpoints or Partner apps like [GDPR Search-And-Destroy](https://www.zendesk.com/marketplace/apps/support/206749/gdpr-search--destroy/?ref=internalnote.com) for easy deletion (not sponsored) for any bulk deletion or compliance automations.
And finally, the multiple SSO feature is one of those, you'll like it when you need it releases. I've seen a few customers with multibrand environments, or with logins on both legacy and migrated platforms who used hacks like [multiple](https://support.zendesk.com/hc/en-us/articles/4408820843802-How-can-I-set-up-multiple-Zendesk-SSO-integrations-in-separate-help-centers-?ref=internalnote.com) Help Centers or multiple [routes](https://support.zendesk.com/hc/en-us/articles/4408886711066-Multibrand-Using-multiple-JWT-single-sign-on-URLs?ref=internalnote.com) to fix this, who can now use this new native release.
# Conclusion
Looking back at Zendesk's Trends Report and this first big What's New of the year it's clear that Zendesk keeps focussing on Conversations and Breaking Silo's.
Messaging, Ticketing and Self Service are still core parts of the Zendesk experience. Although we keep seeing the trench lines moving from Webforms and Help Center articles to Chatbots and Conversations, the first line of defence is still good ticket deflection and self service and Zendesk seems to keep investing in it.
Where Customer experience is one side of the coin, Agent productivity is the other. And by investing in the Agent Workspace, escalation tools like Teams, insights via Explore or the Shopify app, Zendesk keeps giving Agents more context and more tools to give personal support to their customers.
I do feel this is not the entire story yet. The Zendesk Trend Report also focussed on AI Automations and Sentiment, and we haven't seen any major advances of that yet in Zendesk this year.
The [Zendesk-Cleverly](https://www.zendesk.com/newsroom/articles/zendesk-welcomes-cleverly/?ref=internalnote.com) purchase promised a lot with regards to automation, and concepts build on top of ChatGPT promise a lot, but I really hope we see some build-in solutions for content discovery, sentiment analysis, answer assist etc this year.
### Zendesk Roundup for March 2023
URL: https://internalnote.com/link-list-for-march-2023/
Last updated: 2023-05-01T17:45:39.000Z
March started slow with only a few updates, but luckily we had a major What's New in the middle of the month with a LOT of new releases focussing on Conversational ineractions, cross-departemental collaboration, security and.. pro-active messaging for the web widget!
This last one will only go live at the end of the month, but from what Zendesk has shown, it'll be an awesome feature addition.
📥
I'll be publishing my in depth overview of these new releases later this week, so if you don't want to miss it, don't forget to [subscribe](https://internalnote.com/#/portal/signup/free) to the blog. This article will be a members only article!
It wasn't mentioned in Zendesk's Whats New, but the word this month has to be ChatGPT. Zendesk published a full overview on how their ready for AI, ChatGPT's API became finally available, and [every](https://youtu.be/75hvpxLErvU?ref=internalnote.com) [Zendesk](https://www.linkedin.com/feed/update/urn:li:activity:7044631879802650624/?ref=internalnote.com) [Partner](https://www.linkedin.com/posts/robert-cwicinski-15929740%5Fcustomerservice-chatgpt-openai-activity-7041789437780848640-Q0F1?utm%5Fsource=share&utm%5Fmedium=member%5Fdesktop) under the sun announced concepts or early looks on ChatGPT.
Zendesk also announced their **Relate 2023** event for May 11th. It'll be an online event, so don't forget to subscribe! and if you're a Zendesk developer you'll probably want to join the **Zendesk Developer User Group** on March 31st!
[Zendesk Relate 2023Zendesk invites you to our global flagship conferenceOpenform](https://event.zendesk.com/zendeskrelate2023broadcast3?ref=internalnote.com)
[Zendesk Developer User Group: Initial Meeting | Zendesk User Groups & Community EventsVirtual Event - Hello! If you are curious about Zendesk development, such as ZIS, ZCLI, Python, Liquid Markup, Zendesk Sunshine, etc, then you are in the right place! This is our first meeting and the intention is to meet each other and find out what the hot topics may be and what interests there ar…Zendesk User Groups & Community Events](https://zdsk.co/42BHrqp?utm%5Fcampaign=611beb0329938d00016c5537&utm%5Fcontent=641dfcf8348e4700015082bb&utm%5Fmedium=smarpshare&utm%5Fsource=linkedin)
# 🎉 New Releases
## Flow Builder improvements
Zendesk's bot keeps getting better month by month. This month we got an The *[Branch by condition](https://support.zendesk.com/hc/en-us/articles/5280598023450?ref=internalnote.com)* step which allows more complex logic based on parameters or choices made by the user. An example flow: If you use *Ask for Details* to ask the customer which country they live, you can then use the new conditions to automatically show a different branch for US, UK or EU users. Or, combined with authentication you can show a more personalised path for known customers, and a more generic one for guests.
🔈
I'm working on a big example bot flow that combines all new Flow Builder features in one both. [Keep your eyes](https://internalnote.com/#/portal/signup) open early april for this one!
## Branded Widget
From time to time new releases create some controversy. And when Zendesk announced their Messaging widget would show a branded footer for all non-Enterprise plans, that did create some negative feedback. I'm a big proponent of: If you use a tool you like you shouldn't hide it, but apparently some Zendesk customers didn't agree. Luckily the choice has already been reversed and Professional users can also hide this footer now.

## ZIS Playground
> [ZIS Playground](https://www.zendesk.com/marketplace/apps/support/651210/zis-playground/?ref=internalnote.com) is a tool for developers, so you can quickly learn to use Zendesk Integration Services capabilities, resources, and syntax. ZIS Playground walks you through the setup process and comes with a simple default Flow, so you can run your first test in just a couple of minutes.
🤔 I **really** should write about [ZIS](https://developer.zendesk.com/documentation/integration-services/?ref=internalnote.com). Although it's pretty early and not completely full featured yet, it's Zendesk's newest integration service that allows easy integration of Zendesk and external platforms via a low-code solution. This new Marketplace place app from Zendesk allows you to explore this new tool and get to know the syntax.
## The rest
- Small tweak in the way [Agent Workspace tabs](https://support.zendesk.com/hc/en-us/articles/5439612833562-Announcing-improved-Agent-Workspace-ticket-tabs?ref=internalnote.com) work.
- You can now merge one or more content tags in [Guide](https://support.zendesk.com/hc/en-us/articles/5000652575898-Creating-and-managing-content-collections-with-content-tags?ref=internalnote.com).
- Merging tickets has a [new alert](https://support.zendesk.com/hc/en-us/articles/5478155610522-Announcing-a-new-ticket-merge-warning-message?ref=internalnote.com) when merging tickets with requester or organisation mismatch. Good for Privacy breached, bad for agents. That flow really should be less complex, not more complex.
# 💡Insights
## ChatGPT
We're seeing more and more useful content about generative AI and ChatGPT as relating to Customer Care and Zendesk. Zendesk itself put a nice overview [on their blog](https://www.zendesk.com/newsroom/articles/generative-ai/?ref=internalnote.com), as well as did the Chatbot [Ada](https://www.ada.cx/posts/new-webinar-preparing-your-cx-organization-to-adopt-generative-ai?ref=internalnote.com).
> The biggest opportunity lies in using AI to eliminate much of the manual workload that can be low value and incredibly time consuming. Imagine an agent going from having to read through pages of text to get a summary of a customer’s previous issues, to getting an accurate, customised summary allowing them to solve customer issues much more quickly. That is the type of scenario LLMs enable and a Zendesk and ChatGPT partnership will provide to businesses. - **Cristina Fonseca**

And if you want to see how the above could work in Zendesk, there's a very good tutorial [on the Zendesk Developer website](https://developer.zendesk.com/documentation/apps/build-an-app/using-ai-to-summarize-conversations-in-a-support-app/?ref=internalnote.com) that shows how to build such an app.
# ⚠ Major Changes
> Important: Starting in May 2023, customers on Zendesk Suite plans will have a new usage-based pricing model for Article Recommendations and custom bots built in Flow Builder that will be based on **Monthly Active Users (MAU)**. The exact date for this change, along with other details, will be communicated to users in the coming weeks.
Since its arrival Answer Bot has always been a paid feature where you're paying Zendesk for each resolved inquiry. Now, Zendesk is also moving Flow Builder to a paid model. For each unique user (MAU) that contacts you over Messaging and interacts with Flow Builder, you're paying Zendesk for that assist. This is not necessary a bad thing. Customer inquiries resolved via Self Service lead to better CSAT and less Agent work.
[About Monthly Active Users for Zendesk botsImportant: Starting in May 2023, customers on Zendesk Suite plans will have a new usage-based pricing model for Article Recommendations and custom bots built in Flow Builder that will be based on M…Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/5352026794010-About-Monthly-Active-Users-for-Zendesk-bots?ref=internalnote.com)
However, this could lead to surprises if you're not prepared. Luckily the change won't happen tomorrow, but the article below has some good suggestions on how to reduce the amount of MAU. Long story short: authentication is the way to go here. The more users authenticate, the less users you're counting double.
[Authenticate Zendesk MessagingZendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.Internal NoteThomas Verschoren](https://internalnote.com/jwt-messaging)
# 🎥 Videos
# 📝 Articles this month
- [Cleaning up Zendesk Organisations with a sidebar app](https://internalnote.com/cleaning-up-organisations-with-a-sidebar-app/)
- [Improve ticket deflection by enabling Federated Search](https://internalnote.com/federated-search/)
- [Make Protected Zendesk Help Center Articles available in Search](https://internalnote.com/zendesk-guide-membersonly/)
# And finally...
Ever needed to do [Account Assumption](https://support.zendesk.com/hc/en-us/articles/4408894200474-Assuming-end-users?ref=internalnote.com) for an Agent?
1. Go to [https://subdomain.zendesk.com/users?role\[\]=4&role\[\]=2](https://d3v-verschoren.zendesk.com/users?role%5B%5D=4&role%5B%5D=2&ref=internalnote.com)
2. Hover right next to the edit button
3. Click Assume

🥳
Thanks for reading this article and the blog. If you liked this content, please consider **subscribing** and **share** this article to your colleagues.
### Cleaning up Zendesk Organisations with a sidebar app
URL: https://internalnote.com/cleaning-up-organisations-with-a-sidebar-app/
Last updated: 2025-09-08T06:44:16.000Z
Are you a Zendesk admin struggling with managing organizations and their associated user data? If so, you're not alone.
Two common issues that Zendesk admins face are organisations being created after their users already exist, and not all users being a part of those organizations. Additionally, organizations can contain bad data and users who don't belong to the organization.
Zendesk has a longtime feature where you can automatically assign users to an organization by mapping its custom email domain. Any user that matches that domain will be added to the organization. And while creating organizations witha [ mapped email domain](https://support.zendesk.com/hc/en-us/articles/4408882246298-Creating-organizations?ref=internalnote.com#topic%5Fnxl%5Fvdt%5Fbc) resolve this issue, it only works for users created after the fact and doesn't always update existing users.
In this blog post, I'll explain how to build/use a new sidebar app that runs in Zendesk Agent Workspace and cleans up your organisations one at a time by leveraging the ZAT and Zendesk APIs. With this app, you'll be able to easily manage your organisation data and improve your customer service workflows.

# The Fix
In this article I'll show you how to use/build **Organisation Cleaner,** a sidebar app designed to help Zendesk admins manage their organisation data more effectively. This app leverages a few APIs to allow admins to quickly clean up any organisation based on the domains setup for that organisation.
The app's primary function is to add missing users or remove bad ones that don't match the domain. This helps to ensure that your organisation data is clean and accurate, which in turn helps to improve your customer service workflows.
To use the app, you can download the latest release from [GitHub](https://github.com/verschoren/organization%5Fmanager/releases/tag/v1.0.0?ref=internalnote.com) and install it as a [private app](https://developer.zendesk.com/documentation/apps/getting-started/uploading-and-installing-a-private-app/?ref=internalnote.com) in your Agent Workspace. From there, you can select the organisation you want to clean up and run the app. The app will then cleanup the organisation in browser so no data is shared with external sources.
[GitHub - verschoren/organization\_manager: This app will help you clean up your organizations in ZendeskThis app will help you clean up your organizations in Zendesk - GitHub - verschoren/organization\_manager: This app will help you clean up your organizations in ZendeskGitHubverschoren](https://github.com/verschoren/organization%5Fmanager?ref=internalnote.com)
🤔
****Why is this a downloadable app and not a Marketplace app?**
The purpose of this blog is explaining how Zendesk works and empower Zendesk Admins and Developers. You can take this app as a starter to make it work specifically for your organization, or use it as is.
If it really provides value for your company, consider subscribing to a [paid tier](https://internalnote.com/#/portal/signup/63ff05d99deb9e003d619e70/monthly) of this blog to make more of these tools possible. And if you need help building this, there's always a [Zendesk Partner](https://www.zendesk.com/marketplace/partners/?query=premium&ref=internalnote.com) nearby!
# The App
The application runs as a sidebar app in the Organisation View of Agent Workspace. Navigate to any organisation and toggle the Apps Panel to get started.
## Test Mode
The app has a build-in test mode . By default we only compare data, but don't update anything in your instance yet.
```javascript
$('#test_mode').change(function() {
if(this.checked) {
test_mode = true;
} else {
test_mode = false;
}
});
```
Similarly, if you want to look at the results in depth, each user logged in test mode has a clickthrough to the user profile, and we show real updates with a notification top right.
```javascript
//show user profile
client.invoke('routeTo', 'user', $(this).data('target'));
//show notification
client.invoke('notify', 'Users added!');
```
## General Logic
The app has two options: **Remove Bad Users** and **Add Existing Users.**
Both use `ZAT` to get info on the current location the user is looking at in our main `handleFlow()` logic.
```javascript
client.get('organization').then(function(organization) {
var domains = organization.organization.domains.split(' ');
var organization_id = organization.organization.id;
//Handle app logic
});
```
## Cleaning up an existing organisation
When we want to clean up an existing organisation we use the `removeUsers()` function.
It uses the `/api/v2/organizations/${organization_id}/users` endpoint to get all users in the organisation you're looking at. It then takes the Domains you added to that organisation and compares it to the Users in the organisation.
```javascript
let options = {
contentType: "application/json",
url: `/api/v2/organizations/${organization_id}/users`,
type: "GET",
};
client.request(options).then((users) => {
var users = users.users;
jQuery.each( users, function( i, val ) {
var domain = val.email.split('@')[1];
if (domains.indexOf(domain) == -1) {
//update user
}
});
});
```
For all users where the domain doesn't match ( `indexOf == -1` ), we add the user to an `unmatchedUsers` array and print the output to a log via `printOutput()`
### Example: removing unmatched users
In the example below I scanned the organisation **Avengers** for any user that didn't have an `@avengers.example` email-address and remove the bad **Hydra** agent `winter.soldier@hydra.example`



## Adding missing users
Adding missing users works similarly. Since an organisation has potentially multiple domains we run the search for each domain setup in our `handleFlow()` function.
```javascript
domains.forEach(function(domain) {
addUsertoDomain(domain,organization_id);
});
```
We first use the search API to search all users that match the domain and aren't part of the organisation via `/api/v2/search.json?query`. Note the `-organization` which excludes users in the organization.
```javascript
function addUsertoDomain(domain,organization_id){
let options = {
contentType: "application/json",
url: `/api/v2/search.json?query=type:user ${domain} -organization:${organization_id}`,
type: "GET",
};
client.request(options).then((users) => {
var users = users.results;
//update users
});
}
```
Once we find our users, we add the user to an `unmatchedUsers` array and print the output to a log via `printOutput()`
### Example: adding missing users
In the example below I had seven dwarfs in Zendesk already, but never bothered to create an organization for them. Once I created the organization **Seven Dwarfs** with email @`sevendwarfs.example` the app found our seven friends, and added them to the organization



## Handling the update
If our `test_mode` is false and we have an `unmatchedUsers` array, we can handle updating the users via `createOrUpdateMany()`. This does a basic POST to the Zendesk endpoint that allows us to update up to 100 users at once.
The reason we want to use the `create_or_update_many` endpoint is since this a single API call that ends up on a Job in Zendesk. We don't need to wait for multiple calls to succeed, and we don't overload the API limits.
```javascript
function createOrUpdateMany(unmatchedUsers,message){
let options_nomatch = {
contentType: "application/json",
url: `/api/v2/users/create_or_update_many`,
type: "POST",
data: JSON.stringify(unmatchedUsers)
};
client.request(options_nomatch).then((update_many) => {
client.invoke('notify', message);
});
}
```
However, since this all happens in the background, we do want to show some output. This happens with our `PrintOutput()` function. It adds a list of log lines to our app nicely formatted with an icon (✅/❌) and the users name/email.
[GitHub - verschoren/organization\_manager: This app will help you clean up your organizations in ZendeskThis app will help you clean up your organizations in Zendesk - GitHub - verschoren/organization\_manager: This app will help you clean up your organizations in ZendeskGitHubverschoren](https://github.com/verschoren/organization%5Fmanager?ref=internalnote.com)
# A few caveats
Zendesk returns paginated results. This app only takes into account the first page of results.
For cleaning up an organization I figured chances of organizations having more than 100 users is slim. If you want, you can always update the app to add pagination and add a pull requests [here](https://github.com/verschoren/organization%5Fmanager/issues?ref=internalnote.com).
To add missing users you're in luck. Each time you press the button we'll pull in the next 100 missing users (if there are any) since the API search excludes already added users.
The `readme.md` on GitHub also comes with a sample payload to import. You can use these two user sets to easily test and validate the app.
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### Improve ticket deflection by enabling Federated Search
URL: https://internalnote.com/federated-search/
Last updated: 2025-09-08T06:44:20.000Z
Federated Search lets your customers seamlessly search across multiple platforms and websites simultaneously.
In a Zendesk context, federated search enables customers to search for the information they need across the website, blog, and FAQ. This means that customers can easily find the answers they need without having to submit a ticket. One key advantage of federated search is that it allows customers to search for blog articles and website sales content within the same search experience as regular FAQ articles.
This can greatly benefit customers as they can access a wider range of information in one go, without having to switch between different search interfaces or platforms. By including blog articles and website content in the search results, customers can also benefit from a more holistic understanding of the company's products and services. Furthermore, by providing customers with more relevant information, they are more likely to find the answers they need and reduce the likelihood of submitting a ticket and improve CSAT.
Federated search can also help to reduce the workload of customer support teams. By enabling customers to find the information they need on their own, support teams can focus on more complex tickets that require their expertise. This can improve the efficiency of the support team, as they can allocate their time and resources more effectively and reduce their workload.
[About Zendesk Federated SearchWhat’s my plan? Help center federated search lets your end users see content in your help center search results that is external to your help center. This means that when an end user searches in…Zendesk helpNova Dawn](https://support.zendesk.com/hc/en-us/articles/4408830243482-About-Zendesk-Federated-Search?ref=internalnote.com)
🔒
Note: Federated Search is only available for Zendesk (Suite) Enterprise users.
# Federated Search in Zendesk
There's a two ways you can enable Federated Search in Zendesk:
## Search crawler
This is the easiest way to setup Federated Search. Zendesk looks at your website's sitemap and indexes all publicly available content on a nightly basis.
It has the benefit of being an almost no-code integration with the exception of one verification tag to be added to your websites ``
## Federated Search API
This API endpoint lets you manually add records to the search database of your Zendesk instance. You can do this one article at a time, or you can use a tool like Zapier or a custom script to update the database whenever a new page/article/item is added to your website.
# Demo
The Demo Help Center on support.internalnote.com has Federated Search enabled. It indexes this website and also has a bunch of loose websites added to its index.
If you search for e.g. LEGO it'll show support articles from the FAQ, an article from this Blog, and a few external links in its results.
[DEMO: Search for LEGO](https://support.internalnote.com/hc/en-us/search?utf8=%E2%9C%93&query=lego&ref=internalnote.com)

# Automatic Search Crawler
Most customers I've seen have a lot of duplicate content on both their website and Help Center. The website explains the what/how of their offerings from a commercial standpoint, and the help center has almost identical article so that customers contacting them via web/email/social can find that same content via search or Answer Bot. For this reason I recommend to index at least your website inside your Help Center so you can remove a lot of this semi-duplicate content.
## Setup
Setting up an automatic Search Crawler is five easy steps:
1. Add Website Sitemap to Crawler (e.g. `https://internalnote.com/sitemap.xml`)
2. Validate ownership by adding ` ` to ``
3. Add a Content Source Name (e.g. Website) and Type (e.g. Article) for the indexed items. These show up in the search sidebar.
4. Wait for the first indexation (up to 24h)
5. Enable the new Source and Type on your Help Center.
[Setting up the search crawlerThe search crawler lets you implement federated search in your help center without developer resources. You can set up multiple crawlers in your help center to crawl and index different content in…Zendesk helpElizabeth Williams](https://support.zendesk.com/hc/en-us/articles/4593564000410-Setting-up-the-search-crawler?ref=internalnote.com)
# Setup the Federated Search API
Sometimes you don't want to index your entire website but make a specific landing page for a product or issue available for search within your Help Center.
Or, if the website has no sitemap, you might want to add all useful pages manually to your Help Center for indexing. This is where the API comes in.
In this Example we'll add `lego.com` as a record available for searches.
## Source and Type
Similar to how the Crawler needs a Source and Type, manually added records also need to have this associated metadata. You can do this via the [Admin Panel](https://support.zendesk.com/hc/en-us/articles/4890968422298-Managing-search-sources?ref=internalnote.com), or via API. Note that you can associate multiple type with one source, and that you can reuse existing ones you already created earlier.
```json
// Creating a source
// POST /api/v2/guide/external_content/sources
{
"source": {
"name": "Useful Links"
}
}
// Status 201 Created
{
"source": {
"id": "01GSWVD7FMC6QQ4YPVS4K2BFHF",
"name": "Useful Links",
"created_at": "2023-02-22T15:20:56Z",
"updated_at": "2023-02-22T15:20:56Z"
}
}
```
```json
// Creating a type
// POST /api/v2/guide/external_content/types
{
"type": {
"name": "Link"
}
}
// Status 201 Created
{
"type": {
"id": "01GSWVEFWB9ERZYPSA1SCC0ETV",
"name": "Link",
"created_at": "2023-02-22T15:21:37Z",
"updated_at": "2023-02-22T15:21:37Z"
}
}
```
## Adding a record
Once we've created the source and type objects, we can start adding Records to our Help Center.
There's a few items of note:
- External ID: this has to be an unique 12-characters or longer string. Can be related to a record ID in your existing CMS, or something you randomly generate.
- The `source_id` can be found in the results from the API call to create a Source. Or do a `GET /api/v2/guide/external_content/sources` to find the right ID.
- The `type_id` can be found in the results from the API call to create a Type. Or do a `GET /api/v2/guide/external_content/types` to find the right ID.
[Read API Documentation](https://developer.zendesk.com/api-reference/help%5Fcenter/federated-search/external%5Fcontent%5Frecords/?ref=internalnote.com#create-external-content-record)
```json
// POST /api/v2/guide/external_content/records
{
"record": {
"body": "The LEGO website is a hub for all things LEGO, offering a wide variety of resources and content...",
"external_id": "360046759835",
"locale": "en-us",
"source_id": "01GSWVD7FMC6QQ4YPVS4K2BFHF",
"title": "LEGO Website",
"type_id": "01GSWVEFWB9ERZYPSA1SCC0ETV",
"url": "https://lego.com"
}
}
```
💡
The API also has a `segment` object. If you [specify a segment](https://developer.zendesk.com/api-reference/help%5Fcenter/help-center-api/user%5Fsegments/?ref=internalnote.com#list-user-segments), e.g. Agents and Admins, you can add internal resources and only make them available to Agents. These articles show up for logged in Agents on the Help Center, or in the Knowledge Panel in Agent Workspace
## Updating Records
You can update an existing record by doing a `PUT` with the new data to `/api/v2/guide/external_content/records/{id}` . Note that the Automatic Search Crawler updates records regularly if it detects a change in the sitemap. For manually added items you can update e.g. the Body to improve searchability.
# Enabling Sources
Once you added sources via either the Crawler or API, you can make them available in the Search Results. Note that this also makes them available for Agents.
[Including external content in your help center search resultsWhat’s my plan? If you set up federated search in your help center, you can configure your search settings to include external content sources in your help center search results. In search resul…Zendesk helpElizabeth Williams](https://support.zendesk.com/hc/en-us/articles/4593607942298-Including-external-content-in-your-help-center-search-results?ref=internalnote.com)

# Customise Help Center
Once you enable the different new Sources and Types in Federated Search your Help Center Search results will display some new options in its sidebar to allow users to filter based on type.
Personally, I find this list a bit to plain for my taste, so below is a bit of code you can add at the bottom of `search_results.hbs` in your Guide Theme Editor that adds a custom emoji before each filter. You can replace this with a favicon, icons,..
```javascript
var sourcesArray = [
{"name": "Help Center", "icon": "🔎"},
{"name": "Blog", "icon": "🌎"},
{"name": "FAQ Pages", "icon": "📑"},
{"name": "Linked List", "icon": "🔗"}
]
var typesArray = [
{"name": "Posts", "icon": "📥"},
{"name": "Articles", "icon": "📑"},
{"name": "Custom Page", "icon": "⚙️"},
{"name": "Zendesk Blog", "icon": "💬"},
{"name": "Games", "icon": "🕹️"}
]
sourcesArray.forEach(function(source) {
$('ul.multibrand-filter-list > li > a:contains("' + source.name + '")').prepend(source.icon + ' ');
$('ol.search-result-breadcrumbs > li > a:contains("' + source.name + '")').prepend(source.icon + ' ');
});
typesArray.forEach(function(type) {
$('ul.multibrand-filter-list > li > a:contains("' + type.name + '")').prepend(type.icon + ' ');
});
```
💡
Your Help Center might be too old and not have the filter code yet for Search Results. Take a look [here](https://support.zendesk.com/hc/en-us/articles/4408832681626-Help-center-templating-cookbook?ref=internalnote.com#topic%5Ftn4%5Fsgw%5Ffrb) on how to add it



# Conclusion
The above steps should give you the information you need to get started to enable Federated Search yourself, and see results in increased efficiency, reduced ticket and higher CSAT scores.
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** via email or ****share** the article to your colleagues.
### Make Protected Zendesk Help Center Articles available in Search
URL: https://internalnote.com/zendesk-guide-membersonly/
Last updated: 2025-09-08T06:44:45.000Z
Zendesk Guide has a built-in feature to make [articles visible](https://support.zendesk.com/hc/en-us/articles/4408824005914-Setting-view-permissions-on-articles-with-user-segments?ref=internalnote.com) to everyone, logged in users, agents only or, if you've got an Enterprise license, specific user segments. This is a useful feature for anyone who wants to have one Help Center but make content available based on who's looking at the content.
Traditionally you'd see Zendesk environments with approaches like this:
- All articles are public, but some articles are agent only. (The default)
- Some articles are public, but most are for logged in users only (Software with paid licenses, companies that offer membership perks,...)
- A Help Center that is fully locked down with no public access.
These scenario's work, but they come with some caveats though:
If you make articles available to logged in users only it makes them invisible for e.g. Google Search, but also prohibits discovery for users. They'll only know these articles exist if they login, and until they do that information remains invisible!
Similarly, articles that are available to agents only are nice, but that often results in two articles: one with public information, and another with internal information.
So the question arises: can we solve this somehow?
# Show excerpts for segmented articles.
Zendesk's Help Centers are highly customisable of you know a little bit of HTML and CSS. And thanks to their extensive [library](https://developer.zendesk.com/documentation/help%5Fcenter/help-center-templates/helpers/?ref=internalnote.com#signed%5Fin-helper) of `helpers` most customisations can be done with little to no code at all.
So imagine you can have a Help Center that shows an excerpt of articles for anyone, but the full article body whenever a user is logged in. Cool no?
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** via email or ****share** the article to your colleagues.
# How to build this
The demo above can be explored via these [Help Center articles](https://support.internalnote.com/hc/en-us/sections/10247058710162-Paywall-Articles?ref=internalnote.com).
It works by modifying the following snipped in `article_page.hbs` based on the logged in status of the current user and if the user is not logged in, we show an excerpt of the first 300 characters.
*Why 300? Cause this is similar to the length of Answer Bot and Flow Builder snippets.*


## Code Sample 1: Make use of custom article layouts.
The easiest way to build is, is by leveraging the [Article Templates](https://support.zendesk.com/hc/en-us/articles/4408828878106?ref=internalnote.com) available in **Suite Enterprise.** (If you don't run Enterprise, no worries, I've got code below for other license types).
1. Go to your Zendesk Guide Admin Center, and go to the Code Editor of your current template. (Or make a copy if you want to test).
2. Add a new Article Template `members_only`
3. Look for the line `{{article.body}}
`
4. Replace it with the code below.
```html
{{#if signed_in}}
{{article.body}}
{{else}}
{{excerpt article.body characters=300}}
This article is for members only.
{{link 'sign_in' class='submit-a-request'}}
{{/if}}
```
This code first checks if a user is logged in. If they are we show the regular article. If they aren't we show an excerpt of the first 500 characters. (modify to suite your needs). And we append a small disclaimer that asks the user to login.
Once saved you can create new articles, or modify existing ones to make use of this new template. Any template where you apply the template will use the filter above to show excerpts or full articles. All other articles use the regular articles without filtering.



## Code Sample 2: Make use of article labels.
If you're not running Suite Enterprise, you can approach this idea in a different way. Instead of assigning a custom template that contains the article, we use `article labels` to differentiate between regular articles, and articles that should show an excerpt.
1. Go to your Zendesk Guide Admin Center, and go to the Code Editor of your current template. (Or make a copy if you want to test).
2. Open `article_page.hbs`
3. Look for the line `{{article.body}}
`
4. Replace it with the code below.
```html
{{#each article.labels}}
{{#is identifier 'preview'}}
{{#if ../signed_in}}
{{../article.body}}
{{else}}
{{excerpt ../article.body characters=300}}
This article is for members only.
{{link 'sign_in' class='submit-a-request'}}
{{/if}}
{{else}}
{{../article.body}}
{{/is}}
{{/each}}
```
This code first checks all the article labels. If they contain the label `preview` we run our code. If they aren't we show the full article.
If we do have to show a preview, we check if the user is signed, if they aren't we show an excerpt of the first 500 characters. (modify to suite your needs). And we append a small disclaimer that asks the user to login.
⚠️
Due to a limitation in Zendesks liquid syntax this code only works if articles have ****one** label. Otherwise it will output the article body for each label, resulting in a lot of duplicate text.
Once saved you can create new articles, or modify existing ones to make use of this filter. Just make sure to add the label `preview` to each article that you want to show excerpts instead of full articles.


## Where to take it from here.
The code above is a very basic example. You can expand the `div` that shows the login notification to contain more text, or you could expand the code to show different alerts based on different labels or templates.
⚠️
This code is rendered server-side within your Guide Theme. This means that as long as you use Zendesk Guide, Messaging or the Zendesk SDK the full article contains remains obscured since they all show snippets.
If you use the Classic Zendesk Widget this will not work. That widget renders full article contents wihout obfuscation.
# Bonus: Filter on User Role
The Excerpt example above makes no use of any Javascript or code. This means the code is rendered serverside and there's no real risk of smart customers seeing the article contents. If you want, I've also written code that makes use of Client Side Javascript to filter article contents based on the logged in user-type.
The code below can be added to add the bottom of any `article_page.hbs` template and will:
- Show the full article for any agent or admin
- Will show all text up to the first delimiter `---agentonly---.` for all other users.


⚠️
Note that this will show the full article content in Messaging, Flow Builder and Answer Bot if your article is short and the delimiter falls within the snippet length. Also since this is client-side code, any smart user can circumvent this code. As such I wouldn't recommend using it in production environments, but it's a nice proof of concept. If you know a safer way to accomplish the same result, please let me know.
```javascript
//Filter on User Role
$(document).ready(function(){
if (
HelpCenter.user.role=="anonymous" ||
HelpCenter.user.role=="end_user"
){
var article = $(".article-body").html();
var pre_array = article.split('---agentonly---');
$(".article-body").html(pre_array[0]);
}
if (
HelpCenter.user.role=="agent" ||
HelpCenter.user.role=="manager"
){
//show article
}
})
```
### Zendesk Roundup for February 2023
URL: https://internalnote.com/linked-list-for-february-2023/
Last updated: 2023-05-01T17:46:34.000Z
> These are software hands - Adrian McDermott
The biggest news of this month has to be the announcement of **Layout Builder**. This new feature, once released will allow you to rebuild the Zendesk interface with modular elements and organise the Agent Workspace to fit your needs.
After adding flexible sidebar apps, resizing the ticket field panel and moving a lot of elements around this last year, Layout Builder will, for the first time, allow you to really move big blocks around. Apps can alway be visibler, you can hide/show ticket fields, or even keep Customer Context and Side Conversations side by side for more context.
Really curious where this is going! Sign-up for the EAP is available [here](https://support.zendesk.com/hc/en-us/community/posts/5436589947930-What-is-layout-builder-?ref=internalnote.com).

🤔
This post type is a try-out of a new concept. Not sure how it will evolve in the future, so feedback is welcome!
If you want to get this content in your mailbox, I'm writing articles weekly and this kind of list monthy, so feel free to subscribe!
# 🎉 New Releases
February was a quiet month for releases. They announced [Google Analytics 4](https://support.zendesk.com/hc/en-us/articles/5368881354138-Announcing-Google-Analytics-4-for-Help-Center?ref=internalnote.com) support, [unified](https://support.zendesk.com/hc/en-us/articles/5370116867354-Announcing-a-unified-look-for-the-Requester-field-in-tickets?ref=internalnote.com) the design of the ticket sidebar and allow for redaction in [Side Conversations](https://support.zendesk.com/hc/en-us/articles/5436776543898-Announcing-Side-conversation-redaction?ref=internalnote.com).
[What’s new in Zendesk: February 2023Click Follow in the What’s New section to be notified each month when the What’s New is published.Check out what’s new in the last month: SupportPeopleBots and automationExploreGuide Also do…Zendesk helpRob Stack](https://support.zendesk.com/hc/en-us/articles/5362838861338-What-s-new-in-Zendesk-February-2023?ref=internalnote.com)
## Upgraded Slack Integration
It slipped under my radar, and our Slack integration at the office broke last week, so take note: Zendesk migrated their Slack setup flow to Admin Panel last fall.
[Announcing the updated Slack for Zendesk Support integrationAnnounced onRollout startsRollout ends November 8, 2022November 8, 2022November 16, 2022 We’re excited to announce the release of significant improvements to the Zendesk Slack integration!…Zendesk helpSean Bourke Edited November 08, 2022 22:50 Zendesk Product Manager](https://support.zendesk.com/hc/en-us/articles/5060268147738?ref=internalnote.com)
## New Flow Builder steps
Flow Builder keeps getting better one step (sorry..) at a time. After the API flow, and Ask for Details step, we now get some more logic by adding a conditions. I'm working on a full tutorial for March, but take a look at the article below for more info.
[Understanding the Branch by condition step in Flow BuilderThe Branch by condition step can be configured to evaluate data stored in variables and then determine which branch the conversation should go down based on the condition it meets. In this article,...Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/5280598023450?ref=internalnote.com)
## Multiple SSO Options
[Announcing multiple sign-in methods for team members and end usersAnnounced onRollout startsRollout ends February 23, 2023February 23, 2023March 2, 2023 We are excited to announce that Zendesk now gives you the flexibility to allow multiple sign-in metho…Zendesk helpBarkha Bhatia](https://support.zendesk.com/hc/en-us/articles/5369977909786-Announcing-multiple-sign-in-methods-for-team-members-and-end-users?ref=internalnote.com)
# 💡Insights
## Slack Collaboration in Zendesk
Insightful blogpost that shows a nice set of use cases for Slack + Zendesk
[Link](https://www.zendesk.com/blog/slack-integration-improves-collaboration/?ref=internalnote.com)
## Zendesk Customer Service Professional Certificate via LinkedIn
Might be interesting for those following LinkedIn closely. After listening to this episode of [Decoder](https://www.theverge.com/23517319/tomer-cohen-linkedin-chief-product-officer-business-management?ref=internalnote.com), I'm certainly more interested in the platform than before.
## Support Tech Landscape
[The 2023 Support Tech LandscapeIn this article, we’ll explore some of the solutions that exist for customer support teams in 2023\. To avoid any bias and remain as objective as possible, we asked Support leaders NOT affiliated with Zingtree - not current customers - to write the article.](https://zingtree.com/blog/the-2023-support-tech-landscape?ref=internalnote.com)
## Backblaze
[Backblaze](https://www.backblaze.com/cloud-backup.html?ref=internalnote.com#af9ptx) is an awesome backup tool for your Mac or PC. On their blog they shared a fun little detail: the entire support branch runs of Zendesk, offering both chat and email support via Zendesk. (I wonder if they’ll ever implement the Zendesk SDK in their mobile app?)
> The Support team uses Zendesk, a customer service management application, to handle their workload. When a customer submits a ticket, it gets distributed to the next available Support Technician. Same with chat—as users reach out, they get routed to whoever is available for a response. What this means is that new challenges flow into each of the Tech’s queues all day long. They address the issues as they arrive and work to close out each one in turn.
[How to Solve 500,000 Problems: Ask the Backblaze Support TeamAt Backblaze, we’re exceedingly proud of our on-site, US-based Support team. With a staff of just 14, they quietly solve thousands of problems on a weekly basis, all while keeping things impressively fun. So we wanted to take a moment to offer a little “support” to Support.Backblaze Blog | Cloud Storage & Cloud BackupRamya Ramamoorthy](https://www.backblaze.com/blog/how-to-solve-500000-problems-ask-the-backblaze-support-team/?utm%5Fsource=hs%5Femail&utm%5Fmedium=email&utm%5Fcontent=82548217&%5Fhsenc=p2ANqtz-8CnTmBeFB6ApL9jSgMdXKwyv1spr-8Ltiv1AXWi8M01GFY2rYs2rF2%5FgonnIfwR64GUzvC4-CAl0hqzuNsDqBwiUVhsA&%5Fhsmi=82548217)
# ⚠ Major Changes
## Social Messaging add-on
If you're still using the old Social Messaging add-on, you should move to Messaging asap. (Though luck for non-Suite users, they lose access to socials all together it seems..)
[Removal of the Zendesk Social Messaging AppAnnounced on Removal November 16, 2021 (Suite and Support + Chat customers) Jun 22, 2022 (All customers except Sunshine Conversations integration users) April 15, 2023 Zendesk is…Zendesk helpKristal Lam Edited February 01, 2023 22:47 Zendesk Product Manager](https://support.zendesk.com/hc/en-us/articles/4408824766618-Removal-of-the-Zendesk-Social-Messaging-App?ref=internalnote.com)
## Flow Builder Authentication
If you use Authentication in Flow Builder to make API calls, take note, the authentication credentials moved to their own spot in the Admin Panel. Rumour has it that Webhooks will also use this in the future, so you might want to explore these feature already to prepare.
[Announcement: Migrating authentication information for Make API call stepZendesk is making some changes in Flow Builder to improve your account security and bot experience.With the first release of the Make API call step in Flow Builder, admins had to manually enter au…Zendesk helpLisa Tam](https://support.zendesk.com/hc/en-us/articles/5362842598426-Action-required-Migrating-authentication-information-for-Make-API-call-step?ref=internalnote.com)
# 🎥 Videos
# And finally...
Nice demo from [Ultimate](https://ultimate.ai/?ref=internalnote.com) on how they can leverage ML to automate ticket categorisation and tagging. Zendesk [launched](https://support.zendesk.com/hc/en-us/articles/4550640560538-Automatically-triaging-tickets-based-on-intent-and-language-Closed-EAP-?%5Fga=2.197116780.1164426458.1676731809-2124089583.1676731809&%5Fgac=1.153275082.1675256222.CjwKCAiAuOieBhAIEiwAgjCvcs7-s%5FdGCSRt0jX-%5FOm%5F2T2o6vhnH6nkKCmQ2rx-HlzU77P9BAUvOxoC7c0QAvD%5FBwE&%5Fgl=1%2A1idn6q1%2A%5Fga%2AMjEyNDA4OTU4My4xNjc2NzMxODA5%2A%5Fga%5FFBP7C61M6Z%2AMTY3NjczMTgwOC4xLjEuMTY3NjczMjYwNy4xMi4wLjA.&ref=internalnote.com) a similar flow for Retail in a private beta last year, but Ultimate offers similar capabilities for any type of company or industry.
[Ultimate on LinkedIn: Want to tag tickets automatically? There’s a bot for that. Want to…Want to tag tickets automatically? There’s a bot for that. Want to prioritize tickets automatically? There’s a bot for that. Want to extract valuable data…LinkedInUltimate](https://www.linkedin.com/posts/ultimate%2Eai%5Fwant-to-tag-tickets-automatically-there-activity-7026549751202349056-n8F3?utm%5Fsource=share&utm%5Fmedium=member%5Fdesktop)
🥳
Thanks for reading this article and the blog. If you liked this content, please consider **subscribing** and **share** this article to your colleagues.
### Lookup Relationship Fields and Ticket Escalation
URL: https://internalnote.com/lookup-fields-and-ticket-escalation/
Last updated: 2025-09-08T06:44:24.000Z
Lookup Relationship fields are a recently added features that expands the existing user, organisation and ticket fields with a new type. This new field type allows you to interlink Zendesk objects and create relationships.
💡
A ticket can have an approver. A user can have a manager. An organization has an account manager, or a parent organization. Or a ticket can be linked to a third party responsible for resolving it. Similarly when an account manager looks at Zendesk, he sees as a list of the customers he manages and can quickly jump to their timeline.
However you turn it, `Lookup Fields` allows for linking users, organisations and tickets in new ways independent from the old ticket, requesters organisation hierarchy.
# Automatic Ticket Escalation
The video below shows an example flow that leverages `Lookup Fields` to find an organisation's' account manager, and add them as a [Follower](https://www.google.com/search?client=safari&rls=en&q=zendesk+flllowers&ie=UTF-8&oe=UTF-8&ref=internalnote.com) to the ticket.
## The flow runs as follows:
1. Organisations in our instance have an Account Manager stored in a `Lookup Field`.
2. An agent uses the Escalate to Account Manager macro.
3. That macro adds a tag to the ticket.
4. A trigger runs and it adds the Account Manager of the organisation as a follower to the ticket.
5. From now on, the account manager stays in the loop of the ticket.
# Admin Panel
## Create Lookup Field
The first step of this flow is the creation of the `Lookup Field`. Since we want to store an Account Manager on our Organisation we need to create a new Organisation Field.
1. Go to the Admin Panel > People > Organisation fields and add a new `Lookup Relationship`
2. Give it a logical name like *Account Manager* and set the type to User.
3. Add a filter to exclude End-Users, so we can only select Agents in our instance.
💡
End-Users can't be a follower, and this makes finding the right user a lot easier. (Note: you can add your account managers as light agents if you don't want to buy more licenses)





## Link Account Manager to Organisation
The next step is a manual step, but you can use the [API](https://developer.zendesk.com/documentation/ticketing/using-the-zendesk-api/retrieving-lookup-relationship-fields-with-the-api/?ref=internalnote.com) to automate this process. (A future article will explain potential automations in more depth).
To link Account Managers to Organizations you:
1. Open an organisation profile by searching for them or finding them in the new Organisation View
2. Select our Account Manager field and search for an Agent
3. Select the Agent and they will now be stored in the Organisation Profile
Similarly, if you open the Agents' profile, the Organisations they manage, will show up as related items.




## Macro
The Macro is pretty straight forward. Just make sure it adds a Tag `add_account_manager` to the ticket. In my case I also set the ticket to On Hold and a Public Comment to the customer.


# The technical stuff
This blog is a blog about APIs and development, so naturally, the next step in this process will involve some code.
We need to create three things:
1. A Cloudflare Worker that handles an incoming POST request and updates our ticket
2. A Webhook in Zendesk that calls our worker
3. A Trigger that initiaties the Webhook
## Cloudflare Worker
⁉️
I tried using native Zendesk Webhooks to update the ticket directly via the API, but sadly, the `{{ticket.organization.custom_fields.account_manager}}` placeholder returns the name of the Agent, and not the User ID
Since the above approach currently doesn't work, we need to resort to external tools to make the update happen. Luckily, Cloudflare Workers are free, fast, easy to deploy.
Our Worker does the following things:
1. It reads a POST from an incoming webhook and parses the JSON data within
2. For the `Organisation ID` in the JSON data we lookup the Organisation via `api/v2/organizations/{organization_id}}.json`
3. We use the `account_manager` value in the `organization_fields` to retrieve its ID and we [update](https://developer.zendesk.com/documentation/ticketing/managing-tickets/creating-and-updating-tickets/?ref=internalnote.com#setting-followers) the ticket accordingly to add a Follower.
4. We add an internal note to the ticket so the Account Manager immediately gets notified.
### Get Organisation Data
```javascript
// GET /api/v2/organizations/{{organization_id}}.json
{
"organization": {
"id": 4112492,
"organization_fields": {
"account_manager": "1234567890"
}...
}
}
```
### Update Ticket
```javascript
//PUT /api/v2/tickets/{{ticket_id}}.json
{
"ticket": {
"followers": [
{ "user_id": account_manager, "action": "put" }
],
"comment": {
"body": "You should take a look at this ticket.",
"public": false
}
}
}
```
### Example Code
[GitHub - verschoren/internal-note-lookup-fields: Example Code for Lookup FieldsExample Code for Lookup Fields. Contribute to verschoren/internal-note-lookup-fields development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/internal-note-lookup-fields?ref=internalnote.com)
## Webhook
We talked about creating [webhooks](https://support.zendesk.com/hc/en-us/articles/4408839108378-Creating-webhooks?ref=internalnote.com) in an [earlier article](https://internalnote.com/zendesk-user-events/). For our use case we need the following webhook:
1. A Webhook that reacts to a Trigger or Automation
2. Set the `Endpoint URL` to the url of your Worker
3. Choose `POST` with a `JSON payload`
Best practice is adding a security header, for demo purposes we omit this.
## Trigger
The final piece of the puzzel is a trigger that gets triggered by the macro, and activates the webhook.
- Conditions:
Ticket is Updated
Tags contain `add_account_manager`
Organization is not `-` (So we don't needlessly run the trigger)
- Actions:
Remove tag `add_account_manager` (So we only run once)
Notify active webhook: (the one you just created) with the following payload
```javascript
{
"ticket":"{{ticket.id}}",
"organization":"{{ticket.organization.id}}"
}
```



# Result
Combining the above steps together creates an easy flow for your Agents to escalate tickets to the right Account Manager.






If you want you can tweak the above steps to get slightly different behaviour:
- Escalate to a specific vendor via[ **Side Conversation**](https://developer.zendesk.com/api-reference/ticketing/side%5Fconversation/side%5Fconversation/?ref=internalnote.com#create-side-conversation) by replacing the API endpoint with `POST /api/v2/tickets/{ticket_id}/side_conversations` and using the `email` instead of the `id` of the user linked in the `Lookup Field`
```
{
"message": {
"subject": "You should read this!",
"body": "{{ticket.description}}",
"to": [
{ "email": account_manager.email }
],
}
}
```
- Add the Finance Contact of a customer as **CC** by slightly tweaking the Update Ticket payload in the worker via [Adding CCs](https://developer.zendesk.com/api-reference/ticketing/side%5Fconversation/side%5Fconversation/?ref=internalnote.com#create-side-conversation)
How will you organisations these Relationship Lookup Fields? Let me know in reply to this email, or as a comment on the blog!
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### Sunshine Events via Zapier or Webhooks
URL: https://internalnote.com/sunshine-events-via-webhooks/
Last updated: 2025-09-08T06:44:30.000Z
Zendesk Sunshine is a set of Zendesk platform toolkits that allow you to track more data in Zendesk than the standard user/organization/ticket matrix.
It has a few elements:
- **Profiles:** create additional identities on top of user profiles similar to how a user can have an email, phone, social identity. Useful for e.g. tracking membership IDs or account numbers
- **Custom Objects:** A database of object records you can store in Zendesk and link against users, ticket, organizations or other profiles and objects. Think of it of a Lookup Field on steroids.
- **Custom Events:** Interactions that happen outside of a ticket but are important for a customers' journey can be logged in Zendesk on the end-user profile and made visible for agents.
For this article we'll focus on **Events.**
# Zendesk Events
Your Zendesk instance comes with a [preset of Event types](https://support.zendesk.com/hc/en-us/articles/4408828663322-Adding-Sunshine-user-profiles-and-events-to-customer-context-in-a-ticket?ref=internalnote.com#topic%5Fcjq%5Fxrb%5F5mb) out of the box for Answer Bot and Guide to show Suggested Articles, Answer Bot, Help Center Search and Article Views. And if you use the [Shopify integration](https://support.zendesk.com/hc/en-us/articles/4408821228442-Setting-up-Shopify-profiles-and-events-for-Sunshine-in-Support?ref=internalnote.com) you can easily see customer actions on your website too.
This is quite useful for agents cause you can see what the customer was doing before he submitted a ticket.
Similar, any website with the Web Widget enabled (and cookies accepted) will also log page views in the interaction timeline. This way a customer going to your webshop, looking at a product, looking at size information and creating a ticket gives your agents context: they want a product, have already seen the size matrix, but need more help.
# Custom Events
Aside from the predefined Zendesk Events, you can easily add your own events to the timeline by leveraging the Zendesk API and webhooks.
Examples you can add as events:
- User added to Mailchimp list - [link](https://mailchimp.com/developer/marketing/api/list-webhooks/add-webhook/?ref=internalnote.com)
- User became a Ghost member - [link](https://ghost.org/docs/webhooks/?ref=internalnote.com) (Yep, that's live for me!)
- New order in WooCommerce - [link](https://woocommerce.com/document/webhooks/?ref=internalnote.com)
- And a personal favorite of mine: create a trigger in Zendesk that creates an event whenever the user gives good or bad CSAT feedback on a ticket. (I'll leave that one as an exercise for the reader 😎)
[See Documentation](https://developer.zendesk.com/api-reference/custom-data/events-api/events-api/?ref=internalnote.com#track-event-against-zendesk-user-and-given-profile)
## Cloudflare Worker
The repository below contains a sample worker that takes an incoming webhook and creates an event for the relevant user.
You can use this worker to receive an incoming webhook from your platform of choice, and convert it to an event in your customers' timeline.
[GitHub - verschoren/sunshine-events: Example Worker to generate Zendesk Events via WebhooksExample Worker to generate Zendesk Events via Webhooks - GitHub - verschoren/sunshine-events: Example Worker to generate Zendesk Events via WebhooksGitHubverschoren](https://github.com/verschoren/sunshine-events/tree/main?ref=internalnote.com)
## Zapier
We can make it easier by removing custom code and leveraging Zapier for this flow. Benefit is that instead of relying on webhooks you can use any of the hunderds of Zapier actions as input, but you'll need to pay for a Premium subscription.
Whatever option you choose, the steps are almost identical.
# Our Setup
This basic demo will capture a webhook from our application, parse the fields, and create an event for the involved user.
Since this is a demo, there's a few caveats:
- We use `email` as the identifier of our user. You can use others like name, external ID or phone, but for convenience sake we'll use email.
- Our webhooks' input has nicely formatting data. Your application might send out more complex data and some parsing/reformatting might be required.
## Step 1: Catch Webhook
We create a new ZAP of type **Catch Hook in Webhooks by Zapier**. This will give us an URL to send our payload too: [https://hooks.zapier.com/hooks/catch/1237760/3yd0uuw/](https://hooks.zapier.com/hooks/catch/1237760/3yd0uuw/?ref=internalnote.com)
We then use Postman to test the webhook by sending an example payload:
```json
{
"name": "James Sullivan",
"email": "james@monsters.inc",
"booking_id": "1345",
"date": "04/05/2023"
}
```


Catch Webhook
## Step 2: Find or Create User
Now that we got an incoming webhook, we need to find our user in Zendesk. Since Events are stored against Users in Zendesk, we need the `ID` of our end-user.
We use the Premium Zendesk step in Zapier to **Find a User in Zendesk** and choose the `email` key from our JSON payload from Step 1 to search.
If you want you can enable the **Create user if it doesn't exist yet?** option so you have a guaranteed event created.




Find User
## Step 3: Custom Request via POST
Now comes the fun part. By combining the data from the Webhook and Search steps we can create the following payload.
For this we use once again the **Webhooks** step in Zapier, but pick a **Custom Webhook** event. Note the values {{in between brackets}}. Those are parameters taken from prior steps in the Zap.
- Choose POST as the type
- Add `https://{{domain}}.zendesk.com/api/v2/users/{{user_id}}/events` as the URL. Note that `{{user_id}}` is the ID of the user found in Step 2.
- Header: `Authorization: basic base_64_encoded(admin@domain.com/token:zendesk_api_token)`
- Header: `content-type:application/json`
```json
{
"event": {
"source": "Website",
"type": "Booking",
"description": "✈️ New Booking",
"properties": {
"booking_id": "{{181856201__booking_id}}",
"date": "{{181856201__date}}"
}
},
"profile": {
"identifiers": [{
"type": "email",
"value": "{{181856201__email}}"
}],
"name": "{{181856201__name}}",
"source": "website",
"type": "customer"
}
}
```
The values for `source`, `type` in both the `event` and `profile` arrays are yours to choose. Source refers to the place the event came from, type is useful if you want to log e.g. returns, refunds, orders, deliveries all from the same source. They will show up in the Timeline filter of your end-user.
💡
All events have the same plain text layout in Zendesk. You can make the interface nicer and events easier to recognize by prefixing them with an emoji!
Once you've got the payload setup you can test it to create an example event. Since events **can not be deleted**, be careful which user you test on ;-)





Custom Request via POST
## Result
If all goes well, your test-user will see a nice event show up its timeline once you [enable them](https://support.zendesk.com/hc/en-us/articles/4408828663322?ref=internalnote.com#topic%5Fgq2%5Fs11%5Fwkb) in the Admin Panel.

✅
Annoyingly, the first time you create an event of a certain type you have to toggle its visibility in the admin panel.
If you want you can use this [private Zendesk API ](https://github.com/verschoren/sunshine-events/blob/main/api%5Fcalls/readme.md?ref=internalnote.com)to enable them via API.
### Zendesk Answer Bot API
URL: https://internalnote.com/answer-bot-api/
Last updated: 2025-09-08T06:44:35.000Z
One of the lesser known and used APIs in Zendesk's arsenal is the Answer Bot API. It allows platforms to replicate the behaviour of AnswerBot in any app or website. Or an Apple HomePod, but more on that later.
Use cases where this might be useful are for example:
- Show three suggested articles below a contact form not hosted on Zendesk Guide.
- Based on the product the customer is looking at, load some support suggestions dynamically
- Load Zendesk Articles in a third party bot that's not natively connected to Zendesk.
# Overview
The API flow runs as follows:
1. Get a query from your end-user and `POST` it to the Answer Bot recommendations endpoint.
2. That endpoint returns an array of 3 `articles` and an `interaction_access_token`
3. You can then use one of two endpoints to either confirm a resolution, or reject the suggestions with a reason.
4. It's up to your app to then handle the reject with an escalation to a webform, suggest more articles...
# Example flow
Exploring an API is only fun if we have a good use case to test it on.
For this example we'll create a small webpage that allows you to get recommendations and reject/accept them.
But first, the demo. This small website allows you to enter a search query. It then pulls in data from our [Demo Help Center](https://support.internalnote.com/hc/en-us/sections/9913338409746-Demo-Section?ref=internalnote.com) and returns the three recommended articles.
You can then mark them as good or bad to train the data set.

You can use this sample website to e.g. embed Answer Bot on your own website. All sample code is provided below.
[View Demo](https://demo.internalnote.com/answerbot?ref=internalnote.com)
# Taking this one step further.
While playing around with the Answer Bot API I remembered that Siri can also do API calls.. so I build a little demo. Just for the fun of it. 😎
You can download the Apple Shortcut below.
# Answer Bot API Tutorial
In our demo we handle the connection to AnswerBot via a separate script running on [Cloudflare Workers](https://cloudflare.com/?ref=internalnote.com). This makes it possible to hide the API tokens from end-users and add some [caching](https://developers.cloudflare.com/workers/runtime-apis/cache/?ref=internalnote.com) to the returned data, meaning you don't hit your API limits on Zendesk as fast.
The full source code is available in the repository below.
[GitHub - verschoren/zendesk\_widget: Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand.Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand. - GitHub - verschoren/zendesk\_widget:…GitHubverschoren](https://github.com/verschoren/zendesk%5Fwidget?ref=internalnote.com)
## Get Article Recommendations
The first step in setting up this flow is accessing the [Article Recommendations](https://developer.zendesk.com/api-reference/answer-bot/answer-bot-api/article%5Frecommendations/?ref=internalnote.com) `/api/v2/answer_bot/answers/articles` endpoint.
This endpoint requires an `enquiry` , or the search parameters from the customer. You can restrict the results further by adding a `locale` or `label` parameter.
Important here is the `reference` . It allows you to make these enquiries visible in Zendesk Explore and measure how often customers resolve issues via this new Channel.
```html
POST https://internalnote.zendesk.com/api/v2/answer_bot/answers/articles Authorization: Basic abc123def456ghi789
Content-Type: application/json
{
"enquiry": "how to clean Lego",
"locale": "en-us",
"reference": "internal-note-demo"
}
```
When successful, the API returns an array of `articles` and an `🔑 interaction_access_token` . You'll need this token to give feedback on the recommended articles. If no articles are found, you get an empty array of `articles`
```
{
"id": 9942024815634,
"interaction_access_token": "123456789abc",
"auth_token": "qwertyuiop1234",
"articles": [
{
"title": "Cleaning your LEGO® bricks",
"article_id": 9913419783442,
...
},
...
]
}
```
## Getting user input on the presented articles.
💡
Did you know that each time an Agent recommends an article via the [Knowledge Panel](https://support.zendesk.com/hc/en-us/articles/4408836451610-About-Knowledge-in-the-context-panel-and-the-Knowledge-Capture-app?ref=internalnote.com) or a customer interacts with Answer Bot, these actions are used to train the recommendation engine behind Answer Bot? The more your agents or end-users use these tools, the better your result will get!
Now that we can show our customers a set of recommended articles, you can leverage this to train your Answer Bot data by letting your customers mark these articles as ✅ *Yes! They solved my problem*, or ❌ *No didn't help*.
In the demo page we added buttons to the articles to allow users to vote up/or down. Note that each article can get its own vote since they're all scored independently of each other.
### Accept an article
This is the best-case scenario. It let's Zendesk know this is a good article and should be recommended more for similar enquiries. Since Zendesk only returns three articles, the better its score, the more often an article will be recommended for that query.
Accepting the article as a resolution is as easy as a `POST` to `/api/v2/answer_bot/resolution` with the payload below. You use the `🔑 interaction_access_token` and the `ID` of the relevant article.
The API returns a simple `STATUS:200`
```
{
"article_id": 12345, //the article ID
"interaction_access_token": "123456789abc"
}
```
### Reject an Article
Rejecting an article is similar. It tells Zendesk this is a bet recommendation. By default you can just reject an article, but you can also send a reason ID along to tell the system why it's bad.
#### Reason ids
| Value | Reason | Description | |
| ----- | --------------------------------------- | --------------------------------------------------------------------------------------------------------- | |
| 0 | Unknown | No reason given, this just lowers the score | |
| 1 | Not Related | Plenty of these removes the article from the recommendations for that query | |
| 2 | Related, but didn't answer the question | This is a good article but needs more info to help the customer. This feedback will trigger Content Cues. | |
```
{
"article_id": 12345, //the article ID
"interaction_access_token": "123456789abc",
"reason_id": 2
}
```
Here also the API returns a simple `Status:200`
# Answer Bot Shortcut
You can install the Shortcut via the link below.
Just remember to:
- Add a [Base64 Encoded](https://www.base64decode.org/?ref=internalnote.com) `admin@domain.com/token:zendesktoken` in the *Get Contents of URL* step
- Replace `internalnote.zendesk.com` with your Zendesk domain in the *Get Contents of URL* step.
[Install the Apple Shortcut](https://www.icloud.com/shortcuts/2c076761b2b7482aba436332215eab12?ref=internalnote.com)


# Roundup
As mentioned, Answer Bot is one of the more hidden APIs. Most Zendesk users only encounter it via the Chat Widget, and more rarely it's enabled for [webforms](https://support.zendesk.com/hc/en-us/articles/4408820951450?ref=internalnote.com#topic%5Fplc%5Fxjt%5Fkcb) or [email](https://support.zendesk.com/hc/en-us/articles/4408833721498?ref=internalnote.com#topic%5Fllx%5F14k%5Fjhb), but as a way to deflect incoming suggestions and allow for more context-aware self-service for end-users it's powerful.
Implementing the API on your platform might seem farfetched at first, but anywhere where you can replace static content in a list of suggested articled with dynamically generated suggestions you'll win two ways: the suggested list is maintained automatically and you have an extra point we're users can give feedback which will improve your Help Center content and search!
### Zendesk Roundup for January 2023
URL: https://internalnote.com/links-for-january-2023/
Last updated: 2023-05-01T17:46:08.000Z
In January I had the chance to go to Zendesk's Sales kickoff and see/learn what their focus for 2023 will be, including a sneak peak of their roadmap for 2023\. In short: it looks good! So good.
From a product standpoint January was mostly wrapping up releases from end of last year. Some UI items got a redesign, Flow Builder got some small improvements and we saw the release of a major new update for Statuses.
We can also see the first steps of Zendesk tidying up it's offering. They're shutting down some old add-ons, and pointing customers' to partner software as a replacement. I like this. Focus on the core CX offering, and leave distractions like NPS to others who do it better. A healthy ecosystem is better for everyone.
Some customers also got alerts that they will see a mandatory move to Agent Workspace in February. Can I say: FINALLY? I really hope we'll see full feature parity for Messaging in 2023, so they can finally kill Zopim Chat, the Classic widget and the old agent interface. Having two versions of Zendesk running parallel is confusing and annoying to implement as a consultant.
Now on to the stuff I found interesting this month!
🤔
This post type is a try-out of a new concept. Not sure how it will evolve in the future, so feedback is welcome!
If you want to get this content in your mailbox, I'm writing articles weekly and this kind of list monthy, so feel free to subscribe!
# 🎉 New Releases
The full list of releases is found here:
[What’s new in Zendesk: January 2023Click Follow in the What’s New section to be notified each month when the What’s New is published.Check out what’s new in the last month: SupportMessagingAdmin CenterZendesk SuiteSellGuide ...Zendesk helpAimee Spanier](https://support.zendesk.com/hc/en-us/articles/5248314388506-What-s-new-in-Zendesk-January-2023?ref=internalnote.com)
## Custom Ticket Statuses is now GA.
This is the biggest update this month for me. Finally being able to break away from the classic set of statuses opens a world of possibilities for Zendesk customers, and was a major reason why some chose Freshservice over Zendesk.cFor more information, see the [announcement](https://support.zendesk.com/hc/en-us/articles/5305380278810-Announcing-custom-ticket-statuses?ref=internalnote.com).
I also wrote a few tutorials on the subject:
- [Build a Task Manager in Zendesk Support via Custom Statuses](https://internalnote.com/custom-status-triggers/)
- [Custom Status API exploring](https://internalnote.com/custom-status-api-exploring/)
- [Better Pending Ticket flow with Custom Statuses](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/)
## Flow Builder Updates: Add carousel and API Authentication
You can add a carousel with up to ten informational panels for the customer to scroll through, each with a link to an external URL. Currently text only, I hope we get images soon. The Get API Details step also got a better UI and way to store credentials.
[Link](https://support.zendesk.com/hc/en-us/articles/4408836323738-Understanding-answer-flow-step-types?ref=internalnote.com#topic%5Fil3%5Fpmj%5Ftvb)
# 💡Insights
## Zendesk Customer Experience Report
From the key take aways in this report two that seem the most important for me are "Breaking down silos" and "Lean into personalisation". Both are about giving context and sharing input to get to a solution quickly and efficiently. This is something we're Zendesk's Sunshine tools can deliver results quickly and easily.
[The Zendesk Customer Experience Trends Report 2023Learn how to create immersive customer experiences and compare how your business is performing with industry peers.CX Trends 2023](https://cxtrends.zendesk.com/?utm%5Fsource=smarp&utm%5Fmedium=organic%5Fsocial&utm%5Fcampaign=OS%5Fsmarp%5FAM%5FUS%5FEN%5FA%5FAll%5FAW%5FFAN-cx-trends-2023-Report-All-NonBoosted-Haiilo--NoEX%5FT3%5FA%5FH&utm%5Fterm=&utm%5Fcontent=Report%5F%5F&%5Fga=2.177957157.1667343801.1675256072-306646955.1671028890&%5Fgac=1.116091508.1675256222.CjwKCAiAuOieBhAIEiwAgjCvcs7-s%5FdGCSRt0jX-%5FOm%5F2T2o6vhnH6nkKCmQ2rx-HlzU77P9BAUvOxoC7c0QAvD%5FBwE&%5Fgl=1%2A5q2sdr%2A%5Fga%2AMzA2NjQ2OTU1LjE2NzEwMjg4OTA.%2A%5Fga%5FFBP7C61M6Z%2AMTY3NTI3ODAyMC44LjAuMTY3NTI3ODAyNC41Ni4wLjA.)
## Zendesk Engineering Blog
Not many people know that Zendesk's Engineering team has a pretty good Medium blog that gives insight on how the platform is built and run.
[etcd: getting 30% more write/sUndertaking performance analysis on our etcd clusters, I ended up with a 30% performance increase, and learnt lots about databases & disk…Zendesk EngineeringSam Lockart](https://zendesk.engineering/etcd-getting-30-more-write-s-318bcdbf7774?ref=internalnote.com)
## Conversational Interface
A [nice overview](https://www.zendesk.com/blog/conversational-interface/?ref=internalnote.com) of the different bots and conversational interfaces available in Zendesk. They discuss the technology behind chatbots, voice assistants, and interactive voice routing.
## The ultimate checklist to optimise your Zendesk
A community written overview of the best tips to clean up and configure your Zendesk. It includes gems like "Activate the 'Include attachments in emails' setting" and "Auto-close Solved tickets".
[The ultimate checklist to optimize your ZendeskPrefaceToday, mid-March 2020, when COVID-19 is on the rise and many companies are affected, we need to support each other even more than usual. We all are facing very special management and produc...Zendesk helpAndrei Kamarouski](https://support.zendesk.com/hc/en-us/community/posts/4409515183770-The-ultimate-checklist-to-optimize-your-Zendesk?ref=internalnote.com)
# ⚠️ Major Changes
I don't know a lot of customers who used the old NPS add-on, but if you do, it's going away this spring. If you look for an alternative, you can try out [Sweethawk's Survey app](https://sweethawk.com/zendesk-survey-app?ref=internalnote.com) or [Surveypal](https://www.zendesk.com/marketplace/apps/support/102763/surveypal/?queryID=7ffe6d43761837b76ef3827d5a315765&ref=internalnote.com). (Links are not sponsored).
[Announcing the removal of Net Promoter Score (NPS)Announced onRemoval January 17, 2023April 30, 2023 Zendesk is removing Net Promoter Score (NPS) survey functionality on April 30, 2023.This article contains the following sections: What ...Zendesk helpJulian Bartlett](https://support.zendesk.com/hc/en-us/articles/5217969243930-Announcing-the-removal-of-Net-Promoter-Score-NPS-?ref=internalnote.com)
Zendesk had a rough roadmap with social messaging and Whatsapp. We've gone from Social Messaging to Messaging, their custom on-premise flow to Smooch. I hope this marks the end of mandatory migrations. I've seen some customers migrate 3-4 times already now.
[Announcing the retirement of Zendesk’s On-Premise WhatsApp HostingAnnounced onRollout on January 31, 2023October 31, 2023 Zendesk’s On-Premise WhatsApp hosting will be removed on October 31, 2023\. All of Zendesk’s WhatsApp usage will leverage WhatsApp’s ...Zendesk helpStephanie Langlois](https://support.zendesk.com/hc/en-us/articles/5363728688026-Announcing-the-retirement-of-Zendesk-s-On-Premise-WhatsApp-Hosting?ref=internalnote.com)
# 🎥 Videos
# And finally...
A customer asked me why he was missing tickets. Turns out, there's no guarantee every ticket ID will exist.
[Why are there ticket IDs missing?QuestionI noticed that the ticket IDs aren’t perfectly sequential, some of them are missing. How might this happen?AnswerThere are a number of ways that ticket IDs might not show as having a tic...Zendesk helpDwight Bussman](https://support.zendesk.com/hc/en-us/articles/4408827553690-Why-are-there-ticket-IDs-missing-?ref=internalnote.com)
### Crisis Management via Zendesk
URL: https://internalnote.com/crisis-management-via-zendesk/
Last updated: 2025-09-08T06:45:32.000Z
Imagine a major part of your service breaking down, users can't login and tickets are being created in volume. Or due to external factors shipments of orders are delayed and a lot of customers get angry.
In most of these scenario's a few things happen at once:
- Customers create a lot of tickets for the same issue.
- Agents get overwhelmed by the amount of backlog being created.
- You can't get info out fast enough to customers.
- Unrelated tickets from other customers get late replies due to the above backlog, resulting in even more bad customer feedback.
Luckily Zendesk can remedy most of these issues by leveraging Pro-Active support and Self Service via the Help Center, Answer Bot and Incident/Problems.
---
# There's a couple of steps to take
## 1\. Deflection
The most important step to handle such an influx of tickets is deflection. Make sure the problem is front and center on your FAQ. Have Answer Bot enabled to reply withlinks to the article when customers email.
This way, customers see that you are aware of the issue and are working on it, hopefully encouraging at least part of your customer base to not contact you.
### 2\. Bundling
If tickets about the question do come in, make sure to categorise them and link them together, so instead of updating thousands of incident reports, you only need to update one problem ticket.
It's important here to note that in crisis scenarios a *one to many* communication is much more effective than a *one to one*. Sending out updates every hour to all customers with a generic status update is more effective then deep-diving into each ticket individually. There's time to handle unique cases once the crisis is averted.
### 3\. Smart Routing
It's important to still have a good overview of your support inbox. Since the tickets related to the crisis are all categorised and bundled together, it's trivial to separate them from other tickets in your queue.
Assign some agents to handle the crisis tickets, and keep other agents available to handle your regular support queue. This way you help both affected customers, and other users with different issues like bugs, usage questions,...
### 4\. Keep your FAQ and macros up to date
Deflection and automation are the way to go for large influx of tickets.
Make sure you keep the support article(s) related to the incident up to date with the latest info so new inquiries get the latest info via Answer Bot or search.
Similar, make sure your agents have a macro available for both acknowledging the issue and sending out the latest status update. This way, any ticket that's created and hasn't been deflected, gets the latest info without the agent needing to write a custom reply each time.
---
# How to set this up
Now that we have the basics defined, let's dive into how we can actually build this in Zendesk.
For this example we'll be handling the following crisis:
🔐
Users can't login to our platform anymore due to an unknown issue. Engineers are working on the issue and they expect an update within the hour. They assured the company that they've not been breached and no customer data was lost.
## 1\. Deflection
### Help Center
Deflecting incoming inquiries involves using Zendesk Guide. The first step is to create an [article](https://support.internalnote.com/hc/en-us/articles/9731670265874?ref=internalnote.com) that explains the issue.
Make sure it's public to everyone and promoted so it's highlighted on your Help Centers' homepage.
It's always useful to clearly note when an update has been made so the customer gets a nice chronological timeline of the actions taken.
And end the article with a clean CTA to point customers to a place to ask for help that you control.


### Email: Use answer Bot
If you've got Answer Bot enabled on your instance, a customer that emails you will get suggested articles and can auto resolve their issue.
In our example here, a customer that emails you about not being able to login, will get a reply back with the Outage Report article.


### Request forms
Aside from email your webform is another powerful tool to deflect incoming requests.
A customer that goes to your contact form and submits a request for e.g. *can't login* will get a suggested article list that also contains your support article.
But we can do one better. Zendesk Webforms support pre-filled fields. So instead of having your Support Article link to your request form, we can create a specific CTA in the article that links to your form **but** also sets a predefined subject. This way you can more easily triage those inquiries and show the customer you know what their issue is, providing more trust.
#### Creating a pre-filled link is easy:
1. *Copy* the URL of your request form `https://your.helpcenter.domain/hc/en-us/requests/new`
2. Append the following parameter `?tf_subject=text` where `text` is whatever you decide the subject to be, in our case `Login Outage 2023-01-24`
3. Use this as a link in your article. For example: [https://support.internalnote.com/hc/en-us/requests/new?tf\_subject=Login+Outage+2023-01-24 ](https://support.internalnote.com/hc/en-us/requests/new?tf%5Fsubject=Login+Outage+2023-01-24&ref=internalnote.com)
If you've got trouble creating pre-filled links, take a look at the article below or use the [Pre-filled Ticket](https://www.zendesk.com/marketplace/apps/support/406490/pre-fill-ticket-forms/?ref=internalnote.com) forms app from the Zendesk Marketplace.
[https://support.zendesk.com/hc/en-us/articles/4408839114522-Creating-pre-filled-ticket-forms#:\~:text=(Multiple%20ticket%20forms%20only)%20In,URL%20in%20your%20text%20editor.](https://support.zendesk.com/hc/en-us/articles/4408839114522-Creating-pre-filled-ticket-forms?ref=internalnote.com#:~:text=%28Multiple%20ticket%20forms%20only%29%20In,URL%20in%20your%20text%20editor.)
## 2\. Bundling
Zendesk has an old feature that allows you to link multiple incidents into one problem ticket. This gives agents the benefit of having one ticket to look at and have all related tickets linked. And solving the Problem ticket will send the comment to all Incidents als close them too.
[Working with problem and incident ticketsWhat’s my plan? Problem-and-incident tickets are useful when a problem or service interruption is reported by more than one person. For example, when the wireless network in an office stops workin…Zendesk helpCharles Nadeau](https://support.zendesk.com/hc/en-us/articles/4408835103898-Working-with-problem-and-incident-tickets?ref=internalnote.com)
We're going to take this concept and automate if further for your agents.
### Create a problem ticket
The first step for any crisis is to create a new problem ticket. This ticket will be the cornerstone of your crisis management:
- Ticket Type: `problem`
- Give it a clear title
- Link to the Support Article so agents can quickly find it
- The requester can be anyone, I prefer to use an `@example.com` domain so no emails get send out.
Copy the Problem Ticket ID somewhere, you'll need it later. In our demo `#410`.

### Create a Macro
Step two is creating a macro for your agents via the admin panel. This allows agents to bulk select all incoming tickets about the issue and send out an update.
- Add tag `incident_20230124` for categorisation
- Set status to `on hold` since we need to wait for an internal resolution.
- Add a description that clearly links to the Support article and sets expectations.
You can update this macro throughout the day.


### Linking to the problem ticket
We now have tickets created via email, web form and either assisted via Answer Bot or replied to via the macro about this incident. Ideally we want them all linked to the problem ticket automatically.
For this we can leverage webhooks. We'll create a webhook and trigger that takes any incoming ticket about the incident and links it to the problem ticket.
#### Webhook
Create a new *Trigger or Automation* based [webhook](https://support.zendesk.com/hc/en-us/articles/4408839108378-Creating-webhooks?ref=internalnote.com#:~:text=To%20create%20a%20webhook,event%20types%20from%20the%20dropdown.) via the admin panel with the following setup. You only need to create this trigger once, it can be reused across all incidents and problems in the future.
- Name: `Update Ticket`
- URL: `https://yourdomain.zendesk.com/api/v2/tickets/{{ticket.id}}.json`
- Type: `PUT`
- Authentication: `Basic Authentication`
- Username: `admin@domain.com/token`
- Password: `API Token`, see [Creating an API Token](https://support.zendesk.com/hc/en-us/articles/4408889192858-Generating-a-new-API-token?ref=internalnote.com).






#### Trigger
Next we need to create a trigger. Give it a clear name referencing your current Crisis. E.g. `Assign to Problem #410 - Password Outage`
**Conditions:**
- ALL - Type is not `Incident`
This will make sure the trigger runs once
- ANY - Tags contains at least `incident_20230124`
The tag added by the macro to capture those tickets
- ANY - Subject text contains the following string `Login Outage 2023-01-24`
The subject set in the webform to capture those tickets
**Actions:**
- Add tag `incident_20230124`
So we also categorise the webform tickets.
- Set the Status to `On Hold`.
All incoming requests either got a reply form an agent or Answer Bot so there's no need to keep them in the inbox.
- Notify action webhook `Update Ticket`
- Set the JSON body to the following, where `410` is the ID of the problem ticket we created earlier.
```javascript
{
"ticket":{
"problem_id":"410",
"type":"incident"
}
}
```



## 3\. Smart Routing
If you followed the steps above you now have one problem ticket with multiple incident tickets linked to it all in `On Hold` status.
To keep a good overview I recommend updating your views to the following:
- Update your *Action Needed* view to contain all open tickets and exclude problem and incident tickets. They are linked to each other so should be kept out of the regular questions queue so other inquiries can get attention.
- Create a new view that contains only *problem* tickets.




# Putting it all together
The video below shows an overview of this flow from a Customer and Agent View.
1. Customers email or fill in the form
2. They get presented with the article about the outage
3. Their ticket gets automatically linked to the problem upon submit or via the macro
4. Agents can work on the problem ticket to bulk push updates or update the Help Center article
5. Upon resolution of the outage the agent closes the problem ticket and all linked incidents
6. If after the outage an issue does persist and a few customers reply, their ticket will re-open but all others will close.
🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** and ****share** this article to your colleagues.
### Webhooks for User and Organisation events
URL: https://internalnote.com/zendesk-user-events/
Last updated: 2025-09-08T06:45:36.000Z
Zendesk recently launched an expansion on their webhooks functionality that allows you to subscribe to changes in Users and Organizations and act upon those actions.
[Zendesk helpLogo](https://support.zendesk.com/hc/en-us/articles/4914202819866-Announcing-webhooks-for-user-and-organization-events?ref=internalnote.com)
Turning theoretical functionality into a real use case can be daunting, so in this article we'll highlight one use case to show what's possible with this cool new feature.
# Completing Agent Profiles
When an admin adds a new Agent to the Agent Workspace Zendesk only asks for a name and email address. But often, we need to add more data to the profile: signature, alias, verify the email address, or add a Profile Picture.
Instead of doing this manually for each agent, we can leverage the Zendesk Event Webhooks and an external script to automatically complete profiles upon creation.
In our scenario we subscribe to the **Support User Created** event `zen:event-type:user.created` to get notified whenever a new user has been added to your instance.
We then run a script on Cloudflare Workers that will grab the incoming user ID, checks if this is an Agent, and adds a few items to their profile.
Cloudflare Workers are a free platform that allow you to upload and host scripts. It's ideal to expand your Zendesk functionality without running external servers which you need to manage and maintain.
More info [here](https://egghead.io/courses/introduction-to-cloudflare-workers-5aa3?ref=internalnote.com)
## Setup the Webhook
1. Go to the Admin Panel and create a new Webhook. Choose the Zendesk Events type.
2. Give it a recognisable name **Update User Details upon creation**
3. Enter the URL of your Worker `https://zendesk-webhook-events.verschoren.workers.dev`
4. Since this is a demo I did not add any authentication. You should!






## Worker Script
Whenever the webhook notifies us of a created user, we'll receive a POST with information about the created user:
```json
{
"account_id": 12514403,
"detail": {
"created_at": "2022-07-04T05:27:58Z",
"default_group_id": "0",
"email": "",
"external_id": "",
"id": "6596848315901",
"organization_id": "0",
"role": "end-user",
"updated_at": "2022-07-04T05:33:18Z"
},
"event": {},
"id": "6b9bbadf-5725-4e92-bebe-7b71011bf5f1",
"subject": "zen:user:6596848315901",
"time": "2022-07-04T05:33:18Z",
"type": "zen:event-type:user.created",
"zendesk_event_version": "2022-11-06"
}
```
The first thing we do is check if the user is an Agent or Admin by reading the `object.detail.role` key.
```javascript
export default {
async fetch(request, env) {
const body = await request.json();
const detail = body.detail;
//Check for agents
if (detail.role == 'agent' || detail.role == 'admin'){
//move forward
}
return new Response("No action was taken")
}
}
```
We then need to grab the User ID of the Agent we want to update `var user_id = object.detail.id;`.
And we push the information we want to their profile.
In this case we will create a `user_data` object that will add:
- an alias to their profile
- a [signature](https://support.zendesk.com/hc/en-us/articles/4408881941914-Using-Liquid-markup-to-set-agent-signatures?ref=internalnote.com) with their name, the company name and an email address as placeholders
- Verify the email address
- Set a Profile picture
```javascript
var user_data = {
"user": {
"alias": "Customer Care Agent",
"signature": "{{agent.name}}\n{{agent.organization}}\n+1 (123) 456-7890",
"verified": true,
"remote_photo_url": "https://cdn.domain.com/avatar.png"
}
}
```
And we [update the user ](https://developer.zendesk.com/api-reference/ticketing/users/users/?ref=internalnote.com#update-user)profile with a `PUT` to the `update_user` API endpoint
```javascript
async function setSignature(user_id){
let headers = {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + auth
}
const init = {
method: 'PUT',
headers: headers,
body: JSON.stringify(user_data)
}
const result = await fetch(`https://${domain}.zendesk.com/api/v2/users/${user_id}`, init)
let json = await result.json();
return json;
}
```

You can find the full script here:
[GitHub - verschoren/zendesk-event-webhooks: Cloudflare Worker that reacts to changes in Users via Zendesk Webhook EventsCloudflare Worker that reacts to changes in Users via Zendesk Webhook Events - GitHub - verschoren/zendesk-event-webhooks: Cloudflare Worker that reacts to changes in Users via Zendesk Webhook EventsGitHubverschoren](https://github.com/verschoren/zendesk-event-webhooks?ref=internalnote.com)
## How does this work in practice
Once we deploy the Worker, whenever you add an agent to your instance it will fire a webhook POST to our script. The script updates the agent, and a few moments later we have an updated profile.




# Other scenario's
- Fetch a users VIP level and add it to the end-user profile to improve SLA and response time
- Add a new Support user to your Mailchimp mailing list by leveraging Zapier and it's webhooks
- Whenever a user is removed from an organization, call an external webhook to reset their password and deactivate the account.
- ...
### Update a requester name via webhooks and custom fields
URL: https://internalnote.com/update-a-requester-name-via-webhooks-and-custom-fields/
Last updated: 2024-08-19T20:38:11.000Z
When an end-users submits a ticket via email Zendesk has a pretty good parser that extracts their name from the email header. Similar within Messaging and Flow Builder we can ask the customer for their name before we escalate to an agent.
But traditional Help Center forms do not offer a name field. Customers can enter their email and Zendesk tries to find a name to assign to the user.
Email addresses like *john@domain.com* or *john.mcclane@nakatomi.com* are easily parsed. But *jappleseed@domain.com* is not as easy. Even worse is *banana@company.com.*
We can fix this issue by leveraging custom fields and webhooks.
## **The Setup**
1. Add an `Your name` field to your webforms.
2. Create a Webhook that updates the ticket requester.
3. Have a Trigger for created tickets that calls the Webhook for Web form tickets.
### **Create a custom field**
Create a Custom Field of type textfield called ‘Your name’ that is available to end-users.
Note down its ID, e.g. `123456789`
Add the Custom Field to your forms, preferably right above the Subject field so it appears beneath the default email field for new users.


### **Create a webhook**
Make sure you have an [API Token](https://support.zendesk.com/hc/en-us/articles/4408889192858-Generating-a-new-API-token?ref=internalnote.com) ready to use.
Create a new webhook with the following criteria:
- Name: Update Requester Name
- Endpoint URL: `https://yourdomain.zendesk.com/api/v2/users/{{ticket.requester.id}}.json?user[name]={{ticket.ticket_field_123456789}}` where `123456789` is the ID of the created ticket field
- Type: PUT
- Payload: JSON
- Authentication: Basic Authentication `admin@company.com/token` and your Zendesk Token. Use the email of a valid Zendesk Administrator in your instance.



### **Create a trigger**
Create a new trigger with the following criteria:
- `Ticket` is created
- `Your Name` is present
- `Channel` is Web form
As actions choose: Notify Webhook and choose the webhook you just created. Leave the settings as is.


You’ve now setup a flow where each time an user fills in the Web form, we update their name with whatever value they provided in the ticket field.



## **Expanding on this concept**
This Webhook flow allows for a lot more customisation. Instead of passing only a name you could pass a full JSON payload with more metadata you wish to upload to an end-users profile:
Imagine a form with 3 custom fields:
1. Your name - ID 123
2. Title - ID 456
3. Location - ID 789
And you have 2 user fields `job_title` and `location` .
You can then create a Webhook with Endpoint URL `https://yourdomain.zendesk.com/api/v2/users/{{ticket.requester.id}}.json`
In the Trigger you edit the JSON Payload as follows :
```json
{ "user":
{
"name": "{{ticket.ticket_field_123}}",
"user_fields": {
"job_title": "{{ticket.ticket_field_456}}",
"location": "{{ticket.ticket_field_789}"}
}
}
}
```
Whenever a user now submits a ticket with the name, title and location fields filled in, our Trigger will update their profile to show this new information.
### Build a Task Manager in Zendesk Support via Custom Ticket Statuses
URL: https://internalnote.com/custom-status-triggers/
Last updated: 2025-09-08T06:44:50.000Z
Like we mentioned in an [earlier post](https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/), Zendesk now supports Custom Statuses for tickets. This allows a more granular approach to handling tickets and gives more context to agents when looking at a ticket status.
In the previous blog post we gave an example on how we could handle `Pending` tickets and have a different flow based on tickets where we expect replies, or where we want them to silently solve if we don’t hear back from them.
Similarly, Custom Statuses create some cool opportunities to improve the [On Hold](https://support.zendesk.com/hc/en-us/articles/4408889282458-Adding-the-On-hold-ticket-status-to-Zendesk-Support?ref=internalnote.com) Ticket flows.
## **On Hold Status**
By default, the system has an `On Hold` status to imply a ticket can’t be handled since you’re waiting for an external party or external event.
Examples are: finance needs to handle paperwork, a supplier needs to deliver a product, you need information from another department,…
In order to not forget about these tickets, and not waste time looking at tickets you can’t do anything about, it’s advices to setup at least one automation that re-opens any `On Hold` ticket after some time has passed.

This way, you have three ways those `On Hold` tickets reappear in your inbox:
1. An impatient customer replies
2. Your supplier/colleague replies via side conversation or internal note
3. The automation opens the ticket and you can send a reminder or apology.
### **Example Automation**

## **More control via custom statuses**
The automation shown above is a basic example on how to automate based on the `On Hold` Status.
Any ticket that is `On Hold` for more than 120 calendar hours (24 hours per day x 5 days) is set to status `Open`.
But with this automation you’ll quickly run into issues. What if your suppliers asks you to call back tomorrow. What if it takes a week? It could be annoying to have that ticket reappear to early and have to do the *on hold > open > on hold* dance time and time again.
This is where the new custom statuses shine. Take a look at the following flow:

The idea is that we create multiple custom `On Hold` statuses, each linked to a custom automation that snoozes a ticket for a given set of hours.
The flow would then work as follows:
1. A new ticket comes in on Tuesday and it’s clear that the ticket can only be handled at the end of the week.
2. The agent replies to the customers and chooses the custom ‘*Snooze for 3 days*’ status.
3. The ticket is put `On Hold` and disappears from the inbox.
4. An automation checks all tickets and once a ticket is in the ‘*Snooze for 3 days*’ status for more than 72 hours, the ticket is re-opened
5. The ticket gets the custom `Open` status “Ticket is Due” and appears in the inbox.
## **The Setup**
### **Custom Statuses**
Go to your admin panel and create custom statuses like the ones below.
For this example I choose to create three `On Hold` statuses:
- Snooze for one day
- Snooze for three days
- Snooze for one week
Since we want to make it clear to agents that these tickets are re-opened instead of opened via customer reply, we also create a custom `Open` status:
- Ticket is due
Note that, on the customer facing side, we still call those tickets open. It’s often not necessary to let the customer know the tickets are stuck for x days, but if your scenario differs, you can let them know about the delay via this customer status.




💡
Since automations run hourly, you could differ tickets anywhere between 1 hour and infinity. So this could be useful to triage your tickets in the morning and defer tickets to the afternoon if you want.
### **Automations**
The automations are build similar to the generic one at the beginning of this article.
Note that this time we don’t use the Status Category to build the conditions, but rather refer to the Custom Status.



💡
Zendesk has two ways an automation can count time.
\- Calendar hours look at a real hours. So if you want the next day you should use 24 hours as the interval.
\- Business hours look at your [business schedule](https://support.zendesk.com/hc/en-us/articles/4408842938522-Setting-your-schedule-with-business-hours-and-holidays?ref=internalnote.com) in Zendesk and only count working hours. So if your business is open 9-5, and has an 8hour work day, the next day in business hours is 8 hours later. Similarly, two days later is 2x8 hours, 16 hours later.
If you prefer tickets to ****not** reopen during weekend or holidays, you should use Business Hours in your automations.
## **Example**
Below is a example on how this works in a realistic scenario:
1. A customer needs a replacement part
2. The agent contacts logistics who lets them know it’ll be send before the weekend but to be sure they should check back in three days.
3. The agent lets the customer know the good news, and snoozes the ticket for three days with the custom status
4. Good thing he did, cause logistics failed to find the missing part. The ticket re-opens, the agent confirms there is a delay, and let’s the customer know about the bad news.



## **What about Tasks and Due Dates?**
Zendesk has a build in `Tasks` type for tickets and a linked “Due Date” ticket field.
These options are great and allow for even finer control on exact dates.
However, this requires more actions from the agent to snooze tickets:
- Change the ticket status
- Choose a due date in the calendar
- Put the ticket on hold
The automations also need to take into account that tickets can have a due date and have *any* kind of status so that increases admin complexity.
Nevertheless, this option is a valid one and has [worked](https://support.zendesk.com/hc/en-us/articles/4408881800218-Can-I-be-notified-by-email-before-a-task-ticket-s-due-date-?ref=internalnote.com) for many Zendesk customers over the years.
But with Custom Statuses some classic scenario’s in Zendesk can now be rebuild in more elegant ways.
### Custom Ticket Status API exploring
URL: https://internalnote.com/custom-status-api-exploring/
Last updated: 2025-09-08T06:44:55.000Z
With the release of Custom Statuses Zendesk opened a whole new way of working for agents, made triggers and automations a lot easier to create and turned a static system with six ticket statuses into a dynamic system.
[More info here](https://support.zendesk.com/hc/en-us/articles/4965041635226-Announcing-the-Custom-Ticket-Statuses-EAP?ref=internalnote.com)
## **The migration**
First off, from a technical standpoint it’s important to know that Custom Statuses are a subset of your existing statuses.
What we used to call *Status* is now called a `status_category` and the new *Custom Status* is a `custom_status`


This means that where triggers, views, macros and automations used to have a *Status* condition in their parameters, that dropdown has now been renamed to *Status Category*. This happened automatically.
All those settings now also refer to a Custom Status condition. That one contains all new custom statuses. By default custom statuses contain six Zendesk statuses but you can (and should) add your own.

💡
Important: Triggers that used to refer to Status: Open, now refer to Status Category: Open. This category contains ALL open custom statuses so you might want to update those to reflect one specific custom status to prevent unwanted behaviour.
# Accessing Custom Status via API
The default endpoint to `GET` data on Custom Status is `https://{{domain}}.zendesk.com/api/v2/custom_statuses.json`
This returns the following array.
Noteable items:
- `status_category` denotes the parent category of your Custom Status.
- Statuses can have both an agent and customer facing label and description.
- They support dynamic content
- Default Zendesk statuses have a {{zd.status}} label and can’t be disabled
```json
{
"custom_statuses": [{
"id": 5016299,
"status_category": "open",
"agent_label": "Open",
"raw_agent_label": "{{zd.status_open}}",
"end_user_label": "Open",
"raw_end_user_label": "{{zd.status_end_user_open}}",
"description": "Staff is working on the ticket",
"raw_description": "{{zd.status_open_description}}",
"end_user_description": "We are working on a response for you",
"raw_end_user_description": "{{zd.status_end_user_open_description}}",
"active": true,
"default": true,
},
{
"id": 7843129219218,
"status_category": "open",
"agent_label": "Reopened",
"raw_agent_label": "Reopened",
"end_user_label": "Reopened",
"raw_end_user_label": "Reopened",
"description": "Ticket reopened via trigger or automation",
"raw_description": "Ticket reopened via trigger or automation",
"end_user_description": "Ticket reopened via trigger or automation",
"raw_end_user_description": "Ticket reopened via trigger or automation",
"active": true,
"default": false,
}]
}
```
### **Creating new status**
💡
IMPORTANT: You can not yet delete custom statuses! So be careful while testing or you end up with dozens of duplicate or unwanted statuses. (Ask me how I know..)
Creating a new status is done by calling `POST` to `https://{{domain}}.zendesk.com/api/v2/custom_statuses.json` with the following JSON payload.
Note that all `end_user` fields are optional.
```json
{
"custom_status": {
"status_category": "open",
"agent_label": "Side Conversation Reply",
"end_user_label": "On hold",
"description": "Ticket opened via Side Conversation reply",
"end_user_description": "We're working on your ticket",
"active": true,
"default": false
}
}
```
This will return a 201 (OK) or 404 (Error).
The result will be a Custom Status that shows up in your Admin Center and that can obviously be used in custom triggers like the one below.



### **Updating a Custom Status**
Updating a custom status happens by calling `PUT` on `https://{{domain}}.zendesk.com/api/v2/custom*statuses/{{*custom_status_id}}.json` and posting the following object. You only have to add the key:value pairs you wish to update.
```json
{
"custom_status": {
"agent_label": "Reply to a Side Convo"
}
}
```
### **Ticket with custom status**
Once you enable Custom Statuses Zendesk will perform a migration on all your tickets.
Doing a `GET` on any ticket via `https://{{domain}}.zendesk.com/api/v2/tickets/379`now returns the following JSON object:
```json
{
"ticket": {
"id": 379,
"type": "question",
"subject": "Subscription Zendesk - WeTransfer App",
"description": "Hey,\n\nYou have an active subscription on our WeTransfer for Zendesk application for 4 agents renewing every end of the month.\n\nApparently the credit card used expired meaning your subscription has paused.\n\nYou can use the following Stripe link to update your details (or download invoices) in a secure manner\n\nbilling.stripe.com/p/login/28o9BE4I41fCgh2dQQ\n\nThanks in advance and feel free to reach out if you have any questions.\n\nThomas",
"priority": "normal",
"status": "hold",
"custom_status_id": 7843382833170...
}
}
```
The good news is that if you have existing automations or scripts that expect a `status` key will not be affected. Since the Status Categories map 1:1 to the existing statuses and have the same values, those scripts will not be impacted.
There is however a new key `custom_status_id` that contains the Custom Status you assigned to the ticket. It’s an ID, so you should use `https://{{domain}}.zendesk.com/api/v2/custom_statuses.json` to lookup its real name and value.
## **Conclusion**
Like I [showed](https://www.tripelhop.dev/blog/custom-status-triggers?ref=internalnote.com) in an earlier post, these new custom statuses open a whole lot of new possibilities both from an Agent Standpoint (better context), workflows (easier trigger setup) and reporting (why are these on hold?)
I’d love to see a Deletion Endpoint for obvious reasons and a way to disable the default Zendesk Statuses. But aside from that these feels like a very solid release.
### Bump bump solve with Custom Statuses
URL: https://internalnote.com/better-pending-ticket-flow-with-custom-statuses/
Last updated: 2025-09-08T06:44:59.000Z
Not every ticket can be solved with a single reply. Agents often need more information from customers in order to get the full context and reply with an answer.
Or, even if all info is there, they need confirmation that their suggestions worked before the ticket can be solved.
This is where the **pending status** comes in. Any ticket submitted with a pending status tells the agent and the system: “we did what we could do, now it’s up to the customer.”
Note the first part of the sentence: work’s done for now.
So for efficiency’s sake, the less those tickets need be be touched or looked at again, the better. You don’t want your agents spending time looking at handled tickets or worse manually reminding them about the replies they gave.
With automations in Zendesk you’ve long been able toautomate this process (pun intended). Zendesk Admins often build automations that remind customers after a couple of days to reply, with additional automations to then solve or open those tickets after a few more days.
It’s a good concept cause it keeps tickets moving, reduces the pending backlog and does not increase agent handling time.
💡
You don’t want your agents spending time looking at handled tickets or worse manually reminding them about the replies they gave.
### **Custom Statuses**
Zendesk released Custom Statuses in EAP late September. It expands on the regular open, pending, on hold statuses with an option to add subtypes for each.
It allows you to give more context with a specific status update, but it can also make setting up automations and triggers a lot easier.
You can find full documentation [here](https://support.zendesk.com/hc/en-us/articles/4965041635226-Announcing-the-Custom-Ticket-Statuses-EAP?ref=internalnote.com) or check the article below for a nice proof of concept flow.
## **Automating Pending tickets.**
Without any automations, a typical ticket flow looks like this:

A better way is one where we add a reminder via an automation. That way, if a customer does not reply, we remind them and gently nudge them to reply.
If the customer still does not react, we can then add a final automation that either solves the ticket silently, or re-opens the ticket so the agent can either remind the customer one more time.

### **Automatic reminder emails**
The reminder increases reply rates and often pulls reply time forward. Instead of the agents’ email lingering in the customers’ inbox, the reminder is *just* annoying enough that most customers do reply immediately, either because they forgot the first reply, or because they don’t want any more reminders.
And with a faster reply comes better handling time and thus better CSAT.
### **Changing the status**
The second automation can be used to either resurface the ticket to your agents, or remove it from the queue. Which one you choose depends to your specific use case and the ticket content.
You can either solve tickets the customers hasn’t replied to or re-open them.
Automatic solving is ideal for tickets where you await a confirmation.
> I can’t print > Try this > .. silence.
If the customer can print they often don’t bother replying, leaving the ticket pending forever.
Automatic opening is useful for complex tickets or tickets where the agent needs more information before able to go forward. In those cases re-opening allows for a personal reply to get the answer, or to solve the ticket anyway since they can see no reply will ever come.
Since the original reminder already turned a lot of silent tickets into actual replies, the amount of tickets surfaced by this last automation is greatly reduced.
### **How to set it up**
Traditionally sending out reminder emails meant having automations that include a tag or other condition in order to make sure that the reminder gets send out only once.


## **Using Custom Statuses**
Now with custom statuses we can do this more elegantly.
### **Overview**
We first introduce two new pending statuses.

By splitting up *pending* we get a lot more information:
- The first type of tickets are the traditional pending tickets where you expect to get a reply before being able to move forward.
- The latter are tickets that are solved from the agents point of view but where there is a change tat the issue is not actually fixed. Moving them to solved immediately often leads to re-opened tickets and premature CSAT emails, so pending is the right choice here.
By giving those tickets a separate status we can have better reporting, and have a different automations flow.
### **Creating the custom statuses**
Setting up Custom Statuses can be done in the Admin Center. I prefer to keep the default one as is and add new ones, but you could just as easily repurpose one of the existing ones.
I added the following ones:
1. Open > Reopened.
A status to reflect tickets opened by the system vs tickets opened by a customer reply
2. Pending > Awaiting Reply
Uses to show we wait for a customer comment or answers
3. Pending > Awaiting Confirmation
Used to show we need to know if a ticket can be solved
4. Pending > Reminder Sent
We reminded the customer. Used in triggers or by agents.





### **Creating the automations**
Now that we have our custom statuses we can setup our automations.
We start with the existing automation we mentioned above and tweak a few important things:
- We remove the tags since we don’t need those anymore
- We change *Status Category* into a specific Ticket Status
- We use a different custom Open Status to make a difference between *Open* (Customer) and *Reopened* (System)
In the end we end up with 3 automations:
1. \[Pending Awaiting Reply\] Remind after 3 Calendar days
Gently nudge the customer to react.
2. \[Pending Reminder Send\] Open after 3 Calendar days
We open the ticket if no customer action for tickets where we need a ticket. The agent can then reply or solve.
3. \[Pending Awaiting Confirmation\] Solve after 5 Calendar days
If we hear no confirmation we can assume it’s fixed.



### **Using it**
How does this get used by your agents?
1. A ticket comes in and a customer has a complex inquiry
2. The agent replies with some additional questions to get a clearer view on the issue. They put the ticket on *Pending - awaiting reply.*
3. The ticket disappears from their open tickets view.
4. The customer does not immediately reply. After three days the system sends out a reminder email via an automation and sends the ticket to status‘Pending - Reminder Sent’.
5. The customer does not reply even with the reminder.
6. The system runs a second automation that reopens the ticket
7. The agent then solves the ticket or reminds them manually one final time.
## **Wrapping it all up**
These new custom statuses give agents a lot more visibility in both what the real status of a ticket is, and in what the system does with their statuses behind the scenes.
Some other statuses and automations that could work in a similar manner:
#### Open - Bad Feedback
A trigger that re-opens tickets when a customer leaves bad feedback. Agents immediately know why a ticket is open and you get the chance to turn a bad into a good comment
#### On Hold - Waiting for Third Party
Send out a reminder email to the vendor via e.g. side conversation or apologise to the customer that the fixes takes longer than expected due to external circumstances.
Or re-open the ticket so the agent can chase that vendor or supplier.
#### On Hold - Internally
If an internal escalation takes to long, add a team lead as a follower and add an internal note.
#### On Hold - Training Needed
An agent can set a ticket to on hold and have it assigned to a team lead so they can get the support/training needed to handle this issue.
### Shortcomings of Zendesk Webhooks
URL: https://internalnote.com/shortcomings-of-zendesk-webhooks/
Last updated: 2025-09-08T06:45:40.000Z
🥳
****Update 2023-03-30**
Zendesk fixed all issues mentioned in this article. See the [Announcement](https://support.zendesk.com/hc/en-us/articles/5532092885658-Announcing-API-key-authentication-and-custom-headers-for-webhooks?ref=internalnote.com) or read the article below.
[Expanded API Support via Custom Authentication for Zendesk WebhooksZendesk announced Custom Headers and API Key support for its Webhooks. And fixed my previous list of shortcomings a 100%Internal NoteThomas Verschoren](https://internalnote.com/custom-authentication-for-webhooks-update/)
For a long time Zendesk had the Targets feature to notify external API endpoints of changes within Zendesk. Last year, they moved those Targets over to more common HTTP Webhooks supporting `POST,GET,DELETE and PUT` together with a Basic Auth or Bearer Auth header.
However, more and more while developing integrations I run into limits of this feature.
Two examples
### **Zendesk Sell**
Zendesk Sell has an ancient looking [contact form](https://support.zendesk.com/hc/en-us/articles/4408832077338-Setting-up-and-publishing-the-lead-capture-form?ref=internalnote.com) for capturing leads. It works but it looks terrible and is completely separate from existing contact forms on Guide or the Zendesk widget.
So, for a while I’ve playing with the idea of
1. Creating a Sales form in Zendesk Guide
2. Adding a trigger that notifies a webhook when a ticket in the Sales form is created
3. Have the trigger call the Sell API and create a lead.
This way, all contact points are integrated within the Guide Forms, and we can leverage Answer Bot to deflect recurring questions.
Zendesk Sell has an [extensive API](https://developer.zendesk.com/api-reference/sales-crm/resources/leads/?ref=internalnote.com) to create leads that theoretically is compatible with the Webhooks feature.
```sh
curl -v -X POST https://api.getbase.com/v2/leads \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-d '{ "data": { "first_name": "Mark", "last_name": "Johnson", "organization_name": "Design Services Company", ... } }'
```
However, note the `Content-Type: application/json` line. When trying to contact Sell via a Webhook the test mode gives the following error:
```json
"error": {
"code": "invalid_header",
"message": "invalid request header",
"details": "The header 'Accept' is malformed, missing, or has an invalid value."
}
```
So, without being able to add additional headers, this API is unusable. Luckily there’s a native Support to Sell integration on the marketplace, but it’s a prime example of Webhook limitations.

### **Cloudflare Zero Trust**
Cloudflare is a big player when it comes to offering serverless functions and zero-trust security. This year they even released an [API gateway](https://blog.cloudflare.com/api-gateway/?ref=internalnote.com) that makes offering secure and responsive API endpoints a breeze.
However, connecting many companies leveraging Cloudflare to “expose” internal APIs to the world do so by using Cloudflare Zero Trust and [Service tokens](https://developers.cloudflare.com/cloudflare-one/identity/service-tokens/?ref=internalnote.com).
And, you guessed it, Service tokens require adding two header lines when making a request:
```html
CF-Access-Client-Id:
CF-Access-Client-Secret:
```
### Which, currently, is not compatible with Zendesk Webhooks.
### **Asana**
And finally, one last one we ran into lately: [Asana](https://developers.asana.com/docs/create-a-task?ref=internalnote.com), where once again the requirement for two additional header items defining accepted content-types are impossible to submit, and thus impossible to use.
```curl
curl -X POST https://app.asana.com/api/1.0/tasks \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}' \
-d '{"data": {"field":"value","field":"value"} }'
```
### **Workaround**
Mentioning issues is one thing. Fixing them is another.
Currently my workaround is the following:
1. I create a Cloudflare Worker as a proxy for each webhook I need in Zendesk
2. My Webhooks in Zendesk POST to the Worker
3. The Worker processes the request, appends a `header` and forwards the request to the real API
4. The API responds to the request call
5. The Worker relays the response to Zendesk
See [this Worker](https://developers.cloudflare.com/workers/examples/alter-headers/?ref=internalnote.com) as a generic example.
### **Zendesk Feature Request**
A more structural solution would be Zendesk adding support for custom headers in Webhooks.
If you like to see this too, please upvote [this](https://support.zendesk.com/hc/en-us/community/posts/4971033907994-Need-for-Custom-Headers-in-Webhooks?ref=internalnote.com) community post and add your feedback.
[See Community Post](https://support.zendesk.com/hc/en-us/community/posts/4971033907994-Need-for-Custom-Headers-in-Webhooks?ref=internalnote.com)
### Flow Builder - Ask for details
URL: https://internalnote.com/flow-builder-ask-for-details/
Last updated: 2025-09-08T06:45:05.000Z
Last summer Zendesk added the ability to [make API calls from within Flow Builder](https://www.tripelhop.dev/blog/zendesk-flow-builder-api-call?ref=internalnote.com). Instead of having a Chat bot that *just* replies with Help Center articles, you can now reply with there data types too by calling your own or external APIs.
One of the improvements we listed was the ability to ask the customer for data, and use that as part of our query. Example: ask for order number, and retrieve status of that order.
Luckily, Zendesk has just enabled this feature, making the range of options for Flow Builder way bigger by adding an *Ask for Details* step.

### **Concept**
[OMDb API](https://www.omdbapi.com/?ref=internalnote.com) is a free API that enabled movie lookups from within IMDB. We’ll use this API to have Flow Builder ask our customer for a movie title, and reply with its full title and year of release. You can test this bot via the Widget below.
In reality you’ll probably use this API to show the user order information, system status updates, product pricing or other types of more useful data.
`https://www.omdbapi.com/?apikey=[yourkey]&t=[query]`
## Setup
### Custom Field
The *Ask for Detail* step stores the customer reply in a custom field. You can use an existing one, or create a new one for this specific step. Make sure you choose Text Field if you want the customer to enter any kind of text.
For this demo I’ve added a *DEMO Movie* text field.

#### **Add a new step to gather details**
Go to Bots in the Admin Center and open an existing answer, or create a new answer for your Bot.
Once in edit mode you can add the first new step to your bot flow:
- In our example we already have an existing Bot that *Presented Options*, so we added a new option called *Movie Database.*
- Underneath that option we add an *Ask for Details Step*
- Give it a title (Enter a movie title) and link it to the new Custom Field you created above.



#### **Add API call**
Next we’re going to add the actual API call
- Under the *Ask for Detail* step we add an *Make API call* step
- Give it a name (Finding Movie Details), description, and add the API details. Important here is to add the API and then choose *Add a variable* to select the *Response from the customer.*
`[GET] https://www.omdbapi.com/?apikey=[yourkey]&t=[your custom field]`
No header info needed



Once you added the API call we can validate it by running a test.
- In our test we search for Blade Runner
- The API gets called and returns a response
- You can browse through the response and store specific keys as variables to use in your responses.
- In our example we store the *Name* and *Release Date* keys for the first matched movie as variables *year* and *title.*
The variables are stored and worked for all successful API calls. So for each query your customers execute we store the first matched movie as the variables for a reply.







#### **Reply to the customer**
And we can now add two final steps to our Flow:
1. Send Message under successful API call
2. Send Message under failed API call
The success message used the variables we created above. So we’ll always reply with:
> “The movie \[title\] was released on \[year\]”
And the failed message can reply with:
> “No match found for \[DEMO Movie\]”
### **Customer Experience**
Once you enable the new flow, this is the experience your customers get:



### **Conclusion**
This new *Ask for Details* option allows for more personalised Flow Builder experiences that can pull in external data based on the customer request instead of generic information or only Help Center articles.
Currently the *Call an API* option is still fairly limited in its reply option. You can basically reply with hardcoded variables in text form.
I’d love to see richer formats. Loop across results and reply with a list of results. Or parse the returned data and render it as images, links or buttons.
Hopefully we’ll see this sooner than later.
### Custom Launcher for Zendesk Messaging and Unread Counts
URL: https://internalnote.com/custom-launcher-for-zendesk-messaging-and-unread-counts/
Last updated: 2025-09-08T06:45:15.000Z
Zendesk recently added the ability to their Messaging Widget to use Custom Launchers. This article shows you how to easily implement it.
A longstanding request for both the Classic and Messaging Widget is the ability to customize the Widget completely with custom icon, color, shape or positioning.
Although Zendesk offers the option the change color and text, fully replacing the design used to require hiding the widget and managing its visibility for every scenario manually.
Recently Zendesk [added the ability](https://support.zendesk.com/hc/en-us/articles/4500747797914?ref=internalnote.com#id%5Fjnl%5Fxtm%5Fgnb) to their Messaging Widget to implement Custom Launchers with a lot more ease. By enabling the custom behaviour, Zendesk will never load its own launcher button, and will give feedback on the current Chat session via a callback function so you can create a custom launcher, and easily reflect read/unread status.
⁉️
When using the Custom Launcher for Messaging, [proactive](https://internalnote.com/proactive-ticketing-for-messaging/) messages are ****not supported!** See [this](https://support.zendesk.com/hc/en-us/articles/5381304334234/comments/5575083752986?ref=internalnote.com) comment
Parallel to this new design option, Zendesk also added a function that allows you to get the unread count of your conversation. You can use this to show the amount of unread messages to your user, or react when the unread count reaches a certain treshhold.
The Default Widget layout and examples of custom designs.
## Feature Overview
By enabling the Custom Launcher in Zendesk, you can embed the widget without the traditional launcher button floating bottom right.
You can enable the new behaviour by going to your Zendesk Admin Panel and [toggling the appearance](https://support.zendesk.com/hc/en-us/articles/4500747797914?ref=internalnote.com#id%5Fjnl%5Fxtm%5Fgnb) from square/circle to custom. This will hide the launcher button from any website the widget has been added to.

Once enabled you can:
- Add a *Contact us* link on your webpages which will open the widget if clicked.
- Design and load your own launcher button which can open the widgetto align your Support experience with your brand.
- ...
## Demo Page
I created a working demo [here](https://jwt.internalnote.com/customlauncher.html?ref=internalnote.com) to test out this new behaviour.
It allows you to launch the Messaging Widget via a Contact Us button on the middle of the page, or (better) use a custom designed launcher button to open the Messaging Widget.

Since Zendesk also offers a function to get updates on read/unread messages, the pages also contains a demo of this feature.
When you start a conversation the Answer Bot and close the widget the notification will appear and reflect the amount of unread messages.
Alternatively, by pressing the *Demo →* button , the Launcher Button will display a hardcoded demo of 9 unread messages.
Naturally, this page is a demo page, so you can adapt the design and flow to reflect your own use case.


### **Code**
Let's dive into the code to see how this works:
[GitHub Repository](https://github.com/verschoren/zendesk%5Fwidget/blob/main/docs/customlauncher.html?ref=internalnote.com)
#### **Contact Us button**
The contact us button is pretty straightforward. Clicking the button triggers an *OpenWidget()* function that well.. opens the widget.
```html
Contact Us
```
#### **Custom Launcher**
The Custom Launcher works similarly, but consists of a staticly placed *div* containing the launcher bottom right, and a second *div* placed relative to that launcher to show the counter.
We hide the counter by default, and use the Unread Counter to show/update its count.
```html
```
#### **Unread Counter**
The Unread Counter is a live updating function that provided continuous feedback on the amount of unread messages in the widget.
By implementing a callback that updates our Launchers' Notification Badge we can choose when our Launcher should show a notification, and update the count live.
Or, if you want, you can even decide to open the widget once the amount of unread messages reaches a certain treshold:
```javascript
zE('messenger:on', 'unreadMessages', function (count) {
// if there are unread messages, show badge
if (count > 0){
$('#counter').html(count);
$('#notification').show();
}
// if there are more than 4 unread messages, show the widget
else if (count >= 4){
zE('messenger', 'open');
}
//else hide the counter
else {
$('#notification').hide();
}
})
```
### Customize and brand your Classic Zendesk Widget
URL: https://internalnote.com/customize-and-brand-your-zendesk-widget/
Last updated: 2024-08-19T20:40:18.000Z
Zendesk has a nice Web Widget that allows you to embed your contact channels and FAQ on any website. This allows your customers to have the same experience when they contact you via your website, web shop or FAQ and makes your Help Center content available anywhere on your website.
Questions about compatibility while looking at a product on your website? The FAQ search in the Widget has got you covered. Urgent questions about an expired promo codes while checking out? Live Chat's just a click away.
The widget can be embedded on any website, and Zendesk [offers a native customisation](https://support.zendesk.com/hc/en-us/articles/4408836216218?ref=internalnote.com) to tweak the Widget's primary color so it aligns to your branding.

But what if we take it one step further? Completely customise the Widget's branding with custom colours, logos and titles?
This not only differentiates your Support offering from any other Zendesk customer, it also allows you to add some personality to your Customer Care with custom colours, logos and naming conventions.
Note, this guide applies to the Classic Zendesk Widget.Zendesk Messaging currently only offers a [limited set](https://support.zendesk.com/hc/en-us/articles/4409103246874-Creating-a-messaging-Web-Widget?ref=internalnote.com) of options via the Admin Panel.
# How does it work?
Customising the widget requires adding some extra Javascript code on your website just below the embed code Zendesk provides.
See example here:
[Internal Note - Zendesk Classic Widget CustomizationInternal Note - Zendesk Classic Widget CustomizationZendesk Classic Widget CustomizationInternal Note](https://widget.internalnote.com/classiccustom?ref=internalnote.com)
## Colors
You can overwrite the default color and assign custom colours to a couple of elements:
```javascript
window.zESettings = {
"webWidget": {
"color": {
"theme": "#007aff",
"launcher": "#FFCC00",
"launcherText": "#142b39",
"button": "#007AFF",
"resultLists": "#007AFF",
"header": "#FF443A",
"articleLinks": "#007AFF"
}
}
}
```
- Theme: the primary color set by the Widget Settings
- Launcher and Launcher Text: the color of the button and its text specifically.
- Button: Any button in the Widget UI
- Result List: color of search results from the Guide search
- Header: Color of the Widget's header
- Article Links: Color of links in text.
## Launcher
By default the widget has Support or Live Chat as labels for the Widget for when chat is respectively offline and online.
You can override this text to have a specific call to action:
```javascript
window.zESettings = {
"webWidget" : {
"launcher": {
"label": {
"*": "Customer Care"
},
"talkLabel": {
"*": "Call Us"
},
"chatLabel": {
"*": "Live Chat"
}
}
}
}
```
Putting it all together creates a redesigned widget like this:


## Answer Bot and Chat
Going one step further we can also tweak the design of your Answer Bot and Chat Agents:
- Answer Bot allows for a custom Avatar, name and title.
- Chat allows a custom Avatar, title and subtitle.
```javascript
window.zESettings = {
"webWidget": {
"answerBot": {
"avatar": {
"url": "https://website.com/avatar.png",
"name": {
"*": "Internal Note Bot"
}
},
"title": {
"*": "Customer Care"
}
},
"chat": {
"concierge": {
"avatarPath": "https://website.com/avatar.png",
"name": "Customer Care Team",
"title": {
"*": "We take care of you"
}
},
"title": {
"*": "Chat to Us"
}
}
}
}
```
Note that the title and name can be Locale aware by specifying more locales:
```javascript
...
"name": {
"*": "Our Support Bot",
"nl": "Onze Hulp Bot",
"fr: "Notre Bot D'Aide"
}
...
```
# The result
[Internal Note - Zendesk Classic Widget CustomizationInternal Note - Zendesk Classic Widget CustomizationZendesk Classic Widget CustomizationInternal Note](https://widget.internalnote.com/classiccustom?ref=internalnote.com)
Putting all the code together:






```javascript
window.zESettings = {
"webWidget": {
"contactOptions": {
"enabled": true
},
"color": {
"theme": "#007aff",
"launcher": "#FFCC00",
"launcherText": "#142b39",
"button": "#007AFF",
"resultLists": "#007AFF",
"header": "#FF443A",
"articleLinks": "#007AFF"
},
"answerBot": {
"avatar": {
"url": "internalnote_social@2x.png",
"name": {"*": "Internal Note Bot"}
},
"title": {
"*": "Customer Care"
}
},
"chat": {
"concierge": {
"avatarPath": "internalnote_social@2x.png",
"name": "Customer Care Team",
"title": {"*": "We take care of you"}
},
"title": {
"*": "Chat to Us"
}
},
"launcher": {
"label": {
"*": "Customer Care"
},
"talkLabel": {
"*": "Call Us"
},
"chatLabel": {
"*": "Live Chat"
}
}
}
}
```
## **Further reading**
The Zendesk Widget offers a whole lot more customisation options, going from showing/hiding parts of the UI, changing label text, filtering search results e.a.
Check out the [API](https://developer.zendesk.com/api-reference/widget/introduction/?ref=internalnote.com) or the awesome [Widget Guide](https://widget.premiumplus.app/?ref=internalnote.com) I build for Premium Plus.
### ticket.sendMessage() for Support Apps
URL: https://internalnote.com/ticket-sendmessage-for-support-apps/
Last updated: 2025-09-08T06:45:45.000Z
Zendesk's release notes [last week](https://support.zendesk.com/hc/en-us/articles/4686897341466-Release-Notes-Through-2022-05-28?ref=internalnote.com) had a short entry on a new action for sidebar apps:
> We’ve launched functionality for **Zendesk Support Apps to send messages to end-users on behalf of agents** through [Zendesk Messaging](https://support.zendesk.com/hc/en-us/articles/4408882490778-Introducing-messaging?ref=internalnote.com) and [Social Messaging channels (through Sunshine Conversations)](https://support.zendesk.com/hc/en-us/articles/4408836484378-Adding-Sunshine-Conversations-channels-to-the-Zendesk-Agent-Workspace?ref=internalnote.com) in Agent Workspace. Previously, this API only worked for chat. Developer documentation lives [here](https://developer.zendesk.com/api-reference/apps/apps-support-api/ticket%5Fsidebar/?ref=internalnote.com#ticketsendmessage).
This new action is basically an extension of the existing `appendComment()` action that already [existed](https://developer.zendesk.com/api-reference/apps/apps-support-api/ticket%5Fsidebar/?ref=internalnote.com#commentappendtext) for ticket based channels (email, webforms, talk,..), but this time for Conversation based channels like (Web) Messaging and Chat:
## ticket.sendMessage
Sends a message to the end-user, on behalf of the agent. Only works during live chat (channel = chat) and messaging (channel = messaging) conversations for the time being.
```javascript
client.invoke(
'ticket.sendMessage',
{
channel: value1,
message: value2
}
)
```
## So, what can you do we it?
Basically this allows app developers to create richer experiences for agents with more capabilities than traditional macros.
Where a **macro** allows agents to have pre-formatted content to send to customers, including placeholders like name, custom fields, ticket id,..., they do not allow for any external data or complex variables.
This is where this **action** is useful. You can use it as a final step in a sidebar app after you've pulled in data from external resources like an order system, CRM, Marketing Tool, Invoice system....
#### **Example use cases**
- When a customer asks for their Gift Card saldo, we can pull in the data from our invoice tool and reply with "You currently have 42$ available on your gift card"
- When a customer has ordered an item, we can pull in the order status and reply with "Your order is currently shipped with tracking number TEEKAY-421"
- When a customer has send in a repair we can reply with the status of their repair
- When a customer has setup an appointment we can reply with "Your next appointment is confirmed for May 4t at 11:38AM"
- ...
### **Demo App: send order status to customer**

Imagine the following scenario:
- A customer inquires about their order status
- The agent quickly asks for their order number via a button in a custom sidebar app
- The customer replies with an order number
- The agent fills in that order number in the sidebar app, which then retrieves the order status via API from the webshop back-end.
- The agent can then chose to send the customer the order status (It's shipped!) or an overview of the entire order.
Sounds cool right? That's exactly what the app we're building in this article does!
#### **Code overview**
You can find the full app in the repository above, but below are a few highlighted items specific to this feature.
[GitHub - verschoren/internalnote\_sendmessage\_example: Demo App to showcase the sendMessage App featureDemo App to showcase the sendMessage App feature. Contribute to verschoren/internalnote\_sendmessage\_example development by creating an account on GitHub.GitHubverschoren](https://github.com/verschoren/internalnote%5Fsendmessage%5Fexample?ref=internalnote.com)
#### **Channel filtering**
Since the `sendMessage()` action only works for chat and messaging, we first retrieve the current ticket the agent is looking at and store its channel in a variable.Since Zendesk calls *messaging* '*native\_messaging*' internally, we rename the channel for convenience later.
```javascript
client.get('ticket').then(function(ticket) {
var channel = ticket['ticket'].via.channel
channel = channel == 'native_messaging'? 'messaging' : channel
if (channel != 'messaging' && channel != 'chat'){
//Do nothing
} else {
//Do something
}
});
```
### Sending a message
This function is the core of the app and maks use of the new `sendMessage()` action.Note that *channel* has to be either chat or messaging, it won't work for any other channels and throw an error.
Message can be any kind of plain text. You can add line breaks via `\n` but no markup in HTML or Markdown is supported, and neither are attachments.
> You can call this action multiple time in a row if you want to send out a burst of short replies instead of one big text block, making it more native feeling.
```javascript
function sendMessage(channel,message){
client.invoke('ticket.sendMessage', {
channel: channel,
message: message
})
}
```
#### **The rest of our demo app is pretty basic:**
- We have a fake JSON dataset which in production should pull data from a live web API based on the entered Order ID.
- We have 3 click `onClick()`\-events that send out specific messages based on the agents' choice.
- Since we already capture the ticket data to check the channel, we also pull in the requester name to make the messages more personal.
```javascript
$( "#info" ).click(function() {
sendMessage(
channel,
`Hello ${name}, before we can assist you we need your order number.`
)
});
```




🥳
Thanks for reading this article and the blog. If you liked this content, please consider ****subscribing** via email or ****share** the article to your colleagues.
### Classic Web Widget Authentication
URL: https://internalnote.com/classic-web-widget-authentication/
Last updated: 2024-08-19T20:32:25.000Z
You can authenticate your Zendesk Web Widget to identify your users, and to make restricted Help Center content available to users.
By default Zendesk' Web Widget has no idea who's looking at the website. Similarly, when searching the Help Center via the widget, it will only show publicly available articles, and no articles assigned to a specific segment of users or your agents.
To fix this you can pre-fill or authenticate the Web Widget.
- [Authenticated users in Chat SDK](https://develop.zendesk.com/hc/en-us/articles/360052354433-Enabling-authenticated-users-with-the-Chat-SDK-?ref=internalnote.com)
- [Authenticated Visitors in Widget](https://support.zendesk.com/hc/en-us/articles/360022185314-Enabling-authenticated-visitors-in-the-Chat-widget?ref=internalnote.com)
Setting it up is easy, as long as you have a working JWT endpoint. If you haven't got one, this guide will show you how to set one up using Cloudflare Workers.
[GitHub - verschoren/zendesk\_widget: Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand.Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand. - GitHub - verschoren/zendesk\_widget:…GitHubverschoren](https://github.com/verschoren/zendesk%5Fwidget?ref=internalnote.com)
💡
Note that this example code does not validate the user against any directory. It trust the input and returns a valid JWT for Zendesk to use.
## How it works
Let's start at the end of the flow and show a working scenario.
1. A user visits [https://jwt.internalnote.com](https://jwt.internalnote.com/messaging.html?ref=internalnote.com)
2. They enter their name/email and press login
3. The website logs in the user and the widget authenticates
4. Zendesk recognises the user and fills in their name and email in the prechat form and form fields.
5. When the user searches the Help Center, restricted content becomes available.



The agent doesn't really see that the user was logged in during the Chat, but he will see the correct name, email and page view history.

## Setting up Authentication
Authenticating a user requires the following steps:
1. Get the necessary secrets from Zendesk for Chat and Guide
2. Create a web service (e.g. via Cloudflare Workers) to generate a valid Valid JWT
3. Have a function on your website that calls the web service when a user logs in and generates a JWT based on their email, name and ID
4. Push that JWT Tokens to the Widget
### Credentials - Chat
Setting up authentication for Chat first requires generating a Secret.
That's done via [https://subdomain.zendesk.com](https://subdomain.zendesk.com/admin/account/security/end%5Fusers?ref=internalnote.com#messaging)[/chat/agent#widget/widget\_security](https://d3v-verschoren.zendesk.com/chat/agent?ref=internalnote.com#widget/widget%5Fsecurity)


### Credentials - Guide
Setting up authentication for Guide requires generating a Secret and filling in a list of allowed d0mains:
This can be done via [https://subdomain.zendesk.com/admin/channels/classic/web-widget](https://subdomain.zendesk.com/admin/channels/classic/web-widget?ref=internalnote.com)
Note that you need to enter all websites where you want authentication to work. You can do this via \*.domain.com to capture any subdomain for your website(s).


To generate a login for the web widget you'll also need a name, email and external ID for your user.
## Generating the JWT
Based on the above items you can generate a working JWT. You can find an example below.
There's a few important caveats:
- External ID has to be unique for each user, so use a GUID, UUID, or database ID
- Our code does **not** validate if the user exists, it just accept whatever input is there.
#### **Chat**
```javascript
var input = {
"name":"Thomas Verschoren",
"email":"thomas@verschoren.com",
"external_id":"123456"
}
const secret = "abc123";
var token_raw = {
iat: Math.floor(Date.now() / 1000),
name: json.name,
external_id: json.external_id,
email: json.email,
};
var token = jwt.encode(token_raw, secret);
```
#### **Guide**
```javascript
var input = {
"external_id":1906365876753,
"user_email":"thomas@verschoren.com",
"user_name":"Thomas Verschoren"
}
var secret = "abc123";
var token_raw = {
jti: Math.floor(Math.random() * 10000000),
iat: Math.floor(Date.now() / 1000),
name: json.user_name,
email: json.user_email,
};
var token = jwt.encode(token_raw, secret);
```
For the example website above I created a Cloudflare Worker that handles the JWT scenario for both Messaging and the Classic Widget.
You can find a working code example via the link below.
[GitHub - verschoren/zendesk\_widget: Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand.Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand. - GitHub - verschoren/zendesk\_widget:…GitHubverschoren](https://github.com/verschoren/zendesk%5Fwidget?ref=internalnote.com)
#### **Logging In**
The end result is a JWT token that you pass to the widget via:
```javascript
//Prefill Forms and Chat
zE('webWidget', 'identify', {
name: user.name,
email: user.email,
});
zE('webWidget', 'prefill', {
name: {
value: user.name,
readOnly: true
},
email: {
value: user.email,
readOnly: true
}
});
//Authenticate
window.zESettings = {
webWidget: {
authenticate: {
jwtFn: function (callback) {
callback(jwttoken);
}
}
}
}
```
### **What about your Help Center?**
You can also easily use the above example to authenticate the widget for users browsing your Help Center.
1. Uncheck "Add Widget to Help Center" on [https://subdomain.zendesk.com/admin/channels/classic/web-widget](https://subdomain.zendesk.com/admin/channels/classic/web-widget?ref=internalnote.com)
2. Copy the Widget Embed Code on that same page.
3. Open your Zendesk Guide Theme and [edit its code](https://support.zendesk.com/hc/en-us/articles/4408832558874-Editing-the-code-for-your-live-help-center-theme?ref=internalnote.com)
4. Open `document_head.hdbs` and paste the Widget Embed Code at the bottom.
5. Also paste the following code just below the embed code.
[Internal Note - Zendesk Classic Widget CustomizationInternal Note - Zendesk Classic Widget CustomizationZendesk Classic Widget CustomizationInternal Note](https://widget.internalnote.com/guide%5Fclassic/?ref=internalnote.com)
From now on, whenever a user logs into your Help Center, the widget will authenticate itself.



### Authenticate Zendesk Messaging
URL: https://internalnote.com/jwt-messaging/
Last updated: 2025-12-02T17:57:51.000Z
⚠️
Apparently old Zendesk accounts can be tagged with an internal flag that prevents External ID matching to work. Zendesk Support removed the flag from my account and External ID tagging now works as expected. [Look at this article for more info](https://internalnote.com/deepdive-into-messaging-profiles/).
This means Email matching is still an issue, but External IDs do work!
Zendesk recently added the ability to authenticate users in the Zendesk Messaging Web and Mobile SDK. This article shows how to set it up with sample code.
Zendesk recently added the ability to [authenticate users in the Zendesk Messaging](https://developer.zendesk.com/documentation/zendesk-web-widget-sdks/sdks/web/sdk%5Fapi%5Freference/?ref=internalnote.com#authentication) Web and Mobile SDK. This allows any website or app that has logged in users to pass that information to Zendesk so that you're sure you're talking to the right person, and removes the need for your customer to enter any credentials.
Setting it up is easy, as long as you have a working JWT endpoint. If you haven't got one, this guide will show you how to set one up using Cloudflare Workers.
Note that this example code does not validate the user against any directory. It trust the input and returns a valid JWT for Zendesk to use.
[See Demo](https://demo.internalnote.com/messaging.html?ref=internalnote.com)
## How it works
Let's start at the end of the flow and show a working scenario.
1. A user visits [https://demo.internalnote.com/messaging.html](https://demo.internalnote.com/messaging.html?ref=internalnote.com)
2. They enter their name/email and press login
3. The website logs in the user and the widget authenticates
4. Zendesk recognises the user, and starts a conversation.
If there's still an ongoing conversation from earlier, the widget will show the conversation regardless of the user having used that browser/device before.


When the agent opens the conversation in the Agent Workspace he notices a green checkbox next to the users' name showing them the user has logged in correctly.

💡
Note: Zendesk has different approaches on how to map Messaging users to existing user profiles. Take a look [here](https://internalnote.com/messaging-authentication-identify-and-merge-existing-users?utm%5Fsource=demo) for more information
## Setting up Authentication
Authenticating a user requires the following steps:
1. Get a Secret and App ID from Zendesk
2. Create a web service (e.g. via Cloudflare Workers) to generate a valid Valid JWT
3. Have a function on your website that calls the web service when a user logs in and generates a JWT based on their email, name and ID
4. Push that JWT Token to the Widget
### Credentials
Setting up authentication for Messaging first requires generating a Secret and App ID. That's done via [https://subdomain.zendesk.com/admin/account/security/end\_users#messaging](https://subdomain.zendesk.com/admin/account/security/end%5Fusers?ref=internalnote.com#messaging)
```html
App ID: app_12345abcde1234567890
Secret: some-very-long-string-with-digits-and-numbers
```



To generate a login for the web widget you'll also need a name, email and external ID for your user.
## Generating the JWT
Based on the above items you can generate a working JWT. You can find an example below.
There's a few important caveats:
- External ID has to be unique for each user, so use a GUID, UUID, or database ID
- The credentials do not expire unless you set an expiration date
- We pass `email_verified: true` so that Zendesk will handle the email address as a verified address to work with the new [email identity](https://internalnote.com/messaging-authentication-identify-and-merge-existing-users?utm%5Fsource=demo) rules.
💡
Note that our sample code does ****not** integrate with your actual directory and as such we can not validate if the user you're logging in actually exists. That's something you need to implement yourself!
```javascript
var input = {
"external_id":1906365876753,
"user_email":"john@example.com",
"user_name":"John Smith"
}
const app_id = "app_123";
const secret ="abc123";
const key = await crypto.subtle.importKey(
"raw",
utf8ToUint8Array(secret),
{ name: "HMAC", hash: "SHA-256" },
false,
["sign"]
);
const header = JSON.stringify({ alg:"HS256", typ:"JWT", kid:app_id });
const payload = JSON.stringify({
exp: Math.floor(new Date().getTime() / 1000.0) + 86400,
scope: "user",
name: json.user_name,
email: json.user_email,
external_id: external_id,
email_verified: true
});
const partialToken = `${base64URLStringify(utf8ToUint8Array(header))}.${base64URLStringify(utf8ToUint8Array(payload))}`;
const signature = await crypto.subtle.sign(
"HMAC",
key,
utf8ToUint8Array(partialToken)
);
const jwt = `${partialToken}.${base64URLStringify(new Uint8Array(signature))}`;
```
For the example website above I created a Cloudflare Worker that handles the JWT scenario for both Messaging and the Classic Widget.
You can find a working code example via the link below.
[GitHub - verschoren/zendesk\_widget: Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand.Zendesk has a nice Web Widget to embed your contact channels and FAQ on any page of your website creating a consistent experience that aligns with your brand. - GitHub - verschoren/zendesk\_widget:…GitHubverschoren](https://github.com/verschoren/zendesk%5Fwidget?ref=internalnote.com)
### Logging In
The end result is a JWT token that you pass to the widget via:
```javascript
zE('messenger', 'loginUser', function (callback) {
callback(jwttoken);
});
```
### Logging Out
If for any reason you wish to logout your user, you can use the code below.
```javascript
zE('messenger', 'logoutUser');
```
## What about Zendesk Guide?
You can also easily use the above example to authenticate Zendesk Guide.
1. Open your Zendesk Guide Theme and [edit its code](https://support.zendesk.com/hc/en-us/articles/4408832558874-Editing-the-code-for-your-live-help-center-theme?ref=internalnote.com)
2. Open `document_head.hdbs` and paste the[ following code](https://demo.internalnote.com/guide%5Fmessaging?ref=internalnote.com) at the bottom
3. From now on, whenever a user logs into your Help Center, the widget will authenticate itself.

### Zendesk Flow Builder API Call
URL: https://internalnote.com/zendesk-flow-builder-api-call/
Last updated: 2025-08-01T12:06:41.000Z
Zendesk announced the ability to add an API call step to their Messaging Flow Builder. This allows you to get external data and show it your users. So what's possible? Let's build a quick mockup and find out!
Zendesk just announced the ability to add an API call step to their Flow Builder. This allows you to *get, post, update or delete* data on a remote server or API as a step in the Bot flow.
As usual, their [documentation](https://support.zendesk.com/hc/en-us/articles/4572971586586?ref=internalnote.com) is very clear, but lacks some real world examples or detailed steps.
# Concept
We have a Support widget on our website. We notice that customers often contact us with questions regarding the status of our systems.
So instead of pointing them to an external status page, we'll let the bot get the current system status, and hopefully return an "All good, we're online". Or if not, we let them know we're offline with a link to more information.
You can test this flow via the Widget below.
# Setup
For this example we'll use [GitHub Status API](https://www.githubstatus.com/api?ref=internalnote.com). It has a Summary endpoint we can use to retrieve the current status of GitHub:
## Endpoint
`GET curl https://www.githubstatus.com/api/v2/status.json`
## Response
```json
{
"page":{
"id":"kctbh9vrtdwd",
"name":"GitHub",
"url":"https://www.githubstatus.com",
"updated_at": "2022-05-30T10:27:36Z"
},
"status": {
"description": "Partial System Outage",
"indicator": "major"
}
}
```
# So how do we set this up?
First we go to our Flow Builder setup and setup some boilerplate.We've created a Bot flow that basically asks the customer if they need to know the current status, or need help.

## Make an API call
Next we add a step underneath the "*Are all your systems online?*" question, and choose an API step.
Enter the following and press *Make API Call*
- Subject: Get System Status
- Description: This retrieves the status of the GitHub systems.
- Request Method: GET
- Endpoint URL: [https://www.githubstatus.com/api/v2/status.json](https://www.githubstatus.com/api/v2/status.json?ref=internalnote.com)


If all goes well the system returns a valid response and a list of variables returned.
For our example, we're only interested in the *status > description* value. Go to this entry via the dropdown and click *Save*. Choose *system\_status* as the variable name.


We've now:
1. Retrieved the current status from GitHub
2. Saved the status description as a variable for later reuse.
Each time your customers open the widget and select "Get System Status", the Bot will pull in the current status and save it for reuse.
## Showing the status
What's left is showing that status to the customer.
- Under the *Success option* select the "*\[This will be the API step\]*" *m*essage and edit the text to say "*Our current status is:* "
- Click the "*Select Variable*" button and choose the recently created *system\_status* option.
- The text should now say "*Our current status is: {{system\_status}}*"
- Similarly, under the *Fail* option, add a text block that handles the scenario where we can't retrieve the status.



# The result
You can test out the flow by going to [support.internalnote.com](https://support.internalnote.com/?ref=internalnote.com).


# Improvements we'd like to see
- The ability to retrieve an array, and use those as values in an options list.Example: list items in a customers' order, and have them select the item before going forward
- Ask for the name of the currently JWT authenticated user and use that to personalise replies
## Ask For Details
This article was written before Zendesk enabled *Ask for Details* in Flow Builder. See this other article if you want to find out about more complex API calls
[Flow Builder - Ask for detailsThe new Ask For Details option in Flow Builder allows you to pull in contextual information via API into your Zendesk Chat Bot.Internal NoteThomas Verschoren](https://internalnote.com/flow-builder-ask-for-details/)
### Designing Relate 2020
URL: https://internalnote.com/designing-relate-2020/
Last updated: 2023-11-28T10:09:38.000Z

What WWDC is for Apple users, Relate events are to Zendesk users. I’ve done a couple in London and they were always a delightful combination of tons information, both technical and commercial, good speakers and a nice calming design.
Pity/understandable that this one was cancelled due to COVID, from the images in the article [linked](https://medium.com/zendesk-creative-blog/i-really-definitely-and-seriously-did-attend-relate-2020-heres-what-happened-b653be9b72c0?ref=internalnote.com) the look and feel alone would have made this event a joy to walk around in.
> But I had to document what this event would’ve been. This article is an ode to the amazing team of Zendesk creatives and marketeers, from 3D to sound and video and slides, as well as our colleagues from [Sparks](https://wearesparks.com/?ref=internalnote.com), who dedicated sweat, time, tears, talent (and, let’s be real, probably a little blood) to create beautiful things that never saw the light of day.
### Zendesk App Tools Github Action
URL: https://internalnote.com/zendesk-app-tools-github-action/
Last updated: 2023-11-28T10:09:09.000Z
This [Github Action](https://github.com/marketplace/actions/zendesk-app-tools-deploy-apps?ref=internalnote.com) creates or updates an existing app in your Zendesk instance after a successful commit in your GitHub repository.
[Zendesk App Tools - Deploy Apps - GitHub MarketplaceCreate or Update an existing app in a Zendesk instance. Requires a .zat fileGitHub](https://github.com/marketplace/actions/zendesk-app-tools-deploy-apps?ref=internalnote.com)
Checkout the YouTube video below to see how it works.
### Zendesk Talk Status
URL: https://internalnote.com/zendesk-talk-status/
Last updated: 2023-11-28T10:08:16.000Z
Zendesk Talk is Zendesk’s integration VOIP solution. We use it at the office for both incoming support calls from our clients as well as, naturally, outgoing calls.
Now weirdly, Zendesk does not offer a mobile app for their phone solution. They have great apps for Support and Sell, but you can’t access or manage your Talk account go.
This leads to a few issues. Once I leave the office I can’t put my account offline, or redirect calls from browser to mobile.
So, I solved this little hassle with a custom web app. It allows anyone with a Zendesk account to change their status or redirect calls to mobile and web.
Needless to say, I track nothing, can’t hear your calls and don’t store any data.



