
Howdy, Tech Wizards!
Picking up the thread from last week, we will continue our Zoho CRM and Zoho Desk integration.
Now, let us take it a step further.
We will enable sales representatives to escalate critical support tickets directly from Zoho CRM.
This controlled escalation mechanism triggers the SLA in Zoho Desk and simultaneously creates a trackable work item in Zoho CRM. The work item captures additional notes from the Sales team, enabling immediate action by the support team. It also allows Sales to monitor escalation progress anytime.
Business Problem
At Zylker, the Sales team works in Zoho CRM to manage customer relationships and track ongoing deals, while the Support team uses Zoho Desk to manage customer issues and service requests. Now the sales representatives have visibility into open support tickets using the widget built in the
previous post. However, there is no structured way to escalate tickets from within Zoho CRM.
This leads to:
- Delayed escalations, increasing customer frustration.
- Lack of accountability when issues slip through the cracks.
- No audit trail of internal interventions for compliance and review.
Visibility alone is not enough. Sales teams need an actionable escalation mechanism within CRM.
Solution
We will extend the
existing Related List widget by adding an
Escalate button to each ticket row. On clicking this button, a confirmation
pop-up appears.
When the user clicks the Confirm button in the pop-up, the ticket status in Zoho Desk is updated to Escalation from Zoho CRM. This status change triggers the associated SLA configured in Zoho Desk.
As part of the SLA automation, the ticket priority can be updated to High, and the ticket owner can be notified. You can also configure additional actions based on your business requirements. If the Support team does not respond within the defined SLA time, the ticket can be automatically escalated to a manager or the escalation team.
After the ticket status is updated, the confirmation pop-up closes and an escalation form appears within the parent widget. This form allows the Sales team to capture additional details such as escalation reason, customer impact, and expected closure date. When the form is submitted, a record is created in a custom module called Escalation Work Items in Zoho CRM.
The Support team accesses only the Escalation Work Items module in Zoho CRM. This module acts as a shared escalation tracker between the Sales and Support teams. Support agents review the escalation details provided by Sales, take the required action in Zoho Desk, and update the escalation record in CRM. This allows the Sales team to track progress and stay informed before their sales call.
Prerequisites
- Related List Widget in CRM
- Two-way sync between Zoho CRM and Zoho Desk
- Existing Zoho Desk connection
- Working widget project
2. Update the existing Zoho Desk connection to include the Desk.tickets.UPDATE scope in addition to the existing Desk.tickets.READ and Desk.contacts.READ scopes.
Refer to the
Connections help doc for more information.
3. Create a custom module named Escalation Work Items in Zoho CRM to store escalation records.
- Go to Zoho CRM > Setup > Customization > Modules and Fields.
- Click Create New Module and enter Escalation Work Items as the module name.
- Add the following custom fields:
Fields | Date Type |
Contact Name | Lookup |
Customer Impact | Multiline |
| Desk Ticket | URL |
Escalation Reason | Multiline |
Expected Closure Date | Date Time |
Store these API names, as they will be used later in the widget implementation.
4. Create a custom ticket status in Zoho Desk to differentiate that the particular ticket is escalated from Zoho CRM.
- Log into Zoho Desk.
- Go to Settings > Customization > Layouts and Fields > Ticket Status and click Add Status.
- Fill in the Status Name, Status Type and click Save.
4. Create an SLA in Zoho Desk that triggers when the ticket status changes to Escalation from Zoho CRM.
- Go to Settings > Automation > Service Level Agreements and click New SLA.
- Provide Name and Description to the SLA.
- Choose the trigger condition as Field Update and select the Status field.
- Click Next and proceed configuring the target.
- Configure the escalation rules, response times, and resolution targets as per your business requirements.
5. Create two new files called escalate-popup.html and escalate-popup.js in the widget project. These files will handle the confirmation dialog UI and button actions.
This pop-up acts as a sub-widget of the parent Related List widget.
6.
Validate and Pack the parent widget with the empty files and upload it to Zoho CRM to register the sub-widget.
- Go to Zoho CRM > Setup > Developer Hub > Widgets and click Create New Widget.
- Provide the widget details and choose the widget type as Button.
- Set the file path of escalate-popup.html as the Index Page and upload the package.
- After saving the widget, navigate to the Widget Details page to find its API name. Store this API name, as it will be required in the parent widget to render the pop-up using the openPopup() method.

Step-by-Step Implementation
In the existing widget project directory, we will add the escalation functionality.
Step - 1: Add the Escalate Button to the Ticket Table
In the renderTickets function, add an escalate button alongside the view link for each ticket row. On clicking, the button has to call the escalateTicket function that opens a pop-up.
Step - 2: Create the Escalation Confirmation Pop-up
Add the HTML and CSS for the pop-up in the escalate-popup.html and the button functions in the escalate-popup.js file.
ZOHO.embeddedApp.on("PageLoad", function(data) { console.log("Escalation popup loaded with data:", data); }); ZOHO.embeddedApp.init(); // Confirm escalation - close popup and return confirmed: true document.getElementById('confirmBtn').addEventListener('click', function() { $Client.close({ confirmed: true }); }); // Cancel escalation - close popup and return confirmed: false document.getElementById('cancelBtn').addEventListener('click', function() { $Client.close({ confirmed: false }); }); |
Use the
$Client.close() in pop-up to return data back to the parent widget. When the user clicks
Confirm, it returns
{ confirmed: true }, and when they click Cancel, it returns
{ confirmed: false }.
Step - 3: Implement the Escalate Ticket Function
In the
escalateTicket function, use the
openPopup method to open the
escalate-popup.html file and render the confirmation dialog.
When the user clicks
Confirm, call the
Zoho Desk Update Ticket API to change the ticket status to
Escalation from Zoho CRM. This status change automatically triggers the configured SLA in Zoho Desk.
// Escalate a ticket using openPopup async function escalateTicket(ticketId, subject) { try { // Open the escalation confirmation popup widget var result = await ZDK.Client.openPopup({ api_name: 'Zoho_Desk_Pop_Up', type: 'widget', animation_type: 6, header: 'Escalate Ticket', bottom: 'center', height: '250px', width: '400px' }, { ticketId: ticketId, subject: subject }); console.log("Popup result:", result); // If user clicked Confirm if (result && result.confirmed) { ZDK.Client.showLoader('Escalating ticket...'); // Update ticket status to "Escalation from Zoho CRM" using Desk Update Tickets API const updateResponse = await deskZrc.patch('/tickets/' + ticketId, { status: 'Escalation From Zoho CRM' }); console.log("Update Ticket Response:", updateResponse); ZDK.Client.hideLoader(); ZDK.Client.showMessage('Ticket escalated successfully'); // Show escalation details form var ticketUrl = 'https://desk.zoho.com/agent/zylkerpvtltd/zylker/tickets/details/' + ticketId; renderEscalationForm(ticketId, ticketUrl, subject); } } catch (error) { ZDK.Client.hideLoader(); console.error('Error escalating ticket:', error); ZDK.Client.showAlert('Failed to escalate the ticket. Please try again.', 'Error'); } } |
After the ticket status is successfully updated, render an escalation form within the parent widget to capture additional details.
The form should pre-populate the ticket subject and ticket URL as read-only fields. It should also allow the user to enter the customer impact, escalation reason, and expected closure date.
Step - 4: Create an Escalation Entry in Zoho CRM
The Save button should trigger the saveEscalationRecord function. The function validates that all fields are filled and formats the datetime with timezone offset as required by Zoho CRM. The Contact_Name field relates the escalation record to the current Contact using the entityId captured during page load.
// Save escalation record to Zoho CRM async function saveEscalationRecord(ticketUrl, ticketSubject) { var customerImpact = document.getElementById('customerImpact').value.trim(); var escalationReason = document.getElementById('escalationReason').value.trim(); var expectedClosureDate = document.getElementById('expectedClosureDate').value; if (!customerImpact || !escalationReason || !expectedClosureDate) { ZDK.Client.showAlert('Please fill in all fields before saving.', 'Validation Error'); return; } // Format datetime with timezone offset for CRM var dateObj = new Date(expectedClosureDate); var tzOffset = -dateObj.getTimezoneOffset(); var tzSign = tzOffset >= 0 ? '+' : '-'; var tzHours = String(Math.floor(Math.abs(tzOffset) / 60)).padStart(2, '0'); var tzMins = String(Math.abs(tzOffset) % 60).padStart(2, '0'); var closureDate = dateObj.getFullYear() + '-' + String(dateObj.getMonth() + 1).padStart(2, '0') + '-' + String(dateObj.getDate()).padStart(2, '0') + 'T' + String(dateObj.getHours()).padStart(2, '0') + ':' + String(dateObj.getMinutes()).padStart(2, '0') + ':' + String(dateObj.getSeconds()).padStart(2, '0') + tzSign + tzHours + ':' + tzMins; var recordData = [{ "Name": ticketSubject, "Customer_Impact": customerImpact, "Escalation_Reason": escalationReason, "Expected_Closure_Date": closureDate, "Desk_Ticket": ticketUrl, "Contact_Name": { "id": entityId } }]; try { ZDK.Client.showLoader('Saving escalation record...'); const crmResponse = await zrc.post('/crm/v8/Escalation_Work_Items', { data: recordData }); console.log("CRM Insert Response:", crmResponse); ZDK.Client.hideLoader(); ZDK.Client.showMessage('Escalation record created successfully'); // Go back to tickets list await loadTickets(); } catch (error) { ZDK.Client.hideLoader(); console.error('Error creating escalation record:', error); ZDK.Client.showAlert('Failed to create escalation record. Please try again.', 'Error'); } }
|
Step - 5: Validate and Pack the Widget
Follow the steps given in the
Widget help page to validate and pack the widget. A complete working code sample is provided as attachment at the end of this post.
Step - 6: Update the Widgets in Zoho CRM
Since we have added new functionality to the widgets, we need to update it in Zoho CRM.
- Go to Zoho CRM > Setup > Developer Hub > Widgets.
- Locate the existing Related List widget and pop-up widget.
- Click the settings icon and select Edit.
- Update the package in both the widgets and click Save.
Try it Out!
Let us look at the escalation flow from the Contacts detail page in Zoho CRM.
Key Points to Remember
- The Desk connection must include Desk.tickets.UPDATE scope in addition to Desk.tickets.READ and Desk.contacts.READ scopes.
- The custom module API name Escalation_Work_Items and field API names like Customer_Impact, Escalation_Reason, Expected_Closure_Date, Desk_Ticket, and Contact_Name are organization-specific. Replace them with your actual API names in the saveEscalationRecord function.
- The pop-up widget must be registered separately in the Widgets page, and its API name must be used in the openPopup method. Update the api_name parameter in line 229 with your pop-up widget's API name.
- Update the Desk URL pattern in lines 182 and 266 with your portal name and company name.
- Ensure the SLA in Zoho Desk is configured to trigger when the status changes to Escalation from Zoho CRM.
- If you have a large number of contacts or tickets, implement pagination using from and limit parameters as mentioned in the previous Kaizen.
We hope this Kaizen empowers your sales team to take immediate action on critical support issues without leaving Zoho CRM. The combination of visibility and controlled escalation ensures that no customer issue falls through the cracks.
Have questions or suggestions? Drop them in the comments or write to us at
support@zohocrm.com.
On to Better Building!
-----------------------------------------------------------------------------------------------------------
Related Reading
-----------------------------------------------------------------------------------------------------------
Recent Topics
Restrict portal signup until registration form and payment are completed
Hi everyone, I am working on a Zoho Creator portal for a project. In our business flow, users must first fill out a registration form and pay a registration fee before they are allowed to access the portal. However, when I share the portal link, users
Zoho Creator In-App Notification
Hi Team, I have implemented an in-app notification using code, as it required some customization. I followed the example in the link below: https://www.zoho.com/deluge/help/pushnotify-using-deluge.html#Example I have a couple of questions regarding this
Tip #64- Exploring Technician Console: Screenshot- 'Insider Insights'
Hello Zoho Assist Community! Have you ever needed to capture exactly what's happening on a remote machine, whether to document an issue, guide a customer, or keep a record of your session? That's where the Screenshot feature in Zoho Assist comes in! With
Relating Invoices to Projects
Hi Zoho team, If I have already created previously an invoice in Books, so I want to know how can I associate it with a relevant project? Thank you
Create a quote/estimate that includes a range of prices
I am interested in using Zoho Books' Quote templates to create estimates for my customers. I do a mix of fixed-bid quotes and quotes based on an hourly rate. For the hourly rate quotes/estimates, I like to include a price range, for example: 2-4 labor
Budget
I have just upgraded to the standard plan in order to be able to utilize the budgeting function and record budget amount
Capirec bank Automatic feed update
Can anyone tell me if Zoho supports Automatic bank feed update from a Capitec bank account in south africa?
Free webinar! Accelerate deals with Zoho Sign for Zoho CRM and Bigin by Zoho CRM
Hello, Paperwork shouldn’t slow you down. Whether you’re growing a small business or running a large enterprise, manual approvals and slow document turnaround can cost you time and revenue. With Zoho Sign for Zoho CRM and Bigin by Zoho CRM, you can take
Add Lookup Field in Tasks Module
Hello, I have a need to add a Lookup field in addition to the ones that are already there in the Tasks module. I've seen this thread and so understand that the reason lookup fields may not be part of it is that there are already links to the tables (
CRM x WorkDrive: File storage for new CRM signups is now powered by WorkDrive
Availability Editions: All DCs: All Release plan: Released for new signups in all DCs. It will be enabled for existing users in a phased manner in the upcoming months. Help documentation: Documents in Zoho CRM Manage folders in Documents tab Manage files
Upload own Background Image and set Camera to 16:9
Hi, in all known online meeting tools, I can set up a background image reflecting our corporate design. This doesn't work in Cliq. Additionally, Cliq detects our cameras as 4:3, showing black bars on the right and left sides during the meeting. Where
【まだ間に合う!】Zoho ユーザー交流会 | AI活用・CRM・Analytics の事例を聞いて、ユーザー同士で交流しよう!
ユーザーの皆さま、こんにちは。コミュニティチームの藤澤です。 3月27日(金)に東京、新橋で開催する「東京 Zoho ユーザー交流会 NEXUS」へのお申し込みがまだの方は、この機会にぜひお申し込みください!(参加無料) ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー イベントの詳細はこちらから▷▷ https://www.zohomeetups.com/tokyo2026vol1#/?affl=communityforumpost3 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ZeptoMail API
Hello Since today, we experience issues with the ZeptoMail API. When trying to send e-mails using: https://api.zeptomail.eu/v1.1/email we receive the error: (503) Site unavailable due to a traffic surge. Please try again shortly. I kindly ask you to identify
Sender Email Configuration Error.
Hello Team, Hope you are all doing well. We are in the process of creating the Zoho FSM environment in the UAE. When we try to add the sender email address “techsupportuae@stryker.com”, we receive the error message: “Error occurred while sending mail
Managing user mailbox actions
An organization often has users with different roles and responsibilities, such as leadership, operations, or support teams. While some users may require full access to email features, others may only need limited functionality. For example, enabling
Custom function return type
Hi, How do I create a custom deluge function in Zoho CRM that returns a string? e.g. Setup->Workflow->Custom Functions->Configure->Write own During create or edit of the function I don't see a way to change the default 'void' to anything else. Adding
Update P_Leave: code: 7052 "Employee_ID": "Enter Employee ID"
Hi, Zoho People - Update Leaves Can someone assist? ------------------------------------------------------------------------------------------ col = Collection(); col.insert("recordid":id); col.insert("Date_Check_Approval":zoho.currentdate); info zoho.people.update("P_Leave",col.toMap());
Prevent tracking users from specific countries
Currently, I’m receiving many bot visits from the United States and Malaysia. I would like these visits not to be recorded in SalesIQ. I already enabled the option to exclude traffic from cloud service providers, but I’m still receiving bot visits. Ideally,
Es posible cambiar el lenguaje de los modulos del ASAP?
Es posible cambiar el lenguaje de estos textos? Tengo Zoho configurado en español pero aun así me muestra estos textos en ingles:
Using workflows to automatically set classification of new tickets
Hello, I am trying to use a workflow to set a classification for a new ticket that is created via an email coming into my desk department. The workflow is working fine if I create a ticket from within desk, however if a ticket is emailed in then this
Text/SMS With Zoho Desk
Hi Guys- Considering using SMS to get faster responses from customers that we are helping. Have a bunch of questions; 1) Which provider is better ClickaTell or Screen Magic. Screen Magic seems easier to setup, but appears to be 2x as expensive for United States. I cannot find the sender id for Clickatell to even complete the configuration. 2) Can customer's reply to text messages? If so are responses linked back to the zoho ticket? If not, how are you handling this, a simple "DO NOT REPLY" as
Default/Private Departments in Zoho Desk
1) How does one configure a department to be private? 2) Also, how does one change the default department? 1) On the list of my company's Zoho Departments, I see that we have a default department, but I am unable to choose which department should be default. 2) From the Zoho documentation I see that in order to create a private department, one should uncheck "Display in customer portal" on the Add Department screen. However, is there a way to change this setting after the department has been created?
Show unsubscribed contacts ?
Hello, I would like to display the unsubscribed contacts. Unfortunately, I do not have this subscription type as described in the documentation (https://help.zoho.com/portal/en/kb/marketing-automation-2-0/user-guide/contacts/contact-management/articles/subscription-type-24-1-2024#Subscription_Type_field.)
What's New in Zoho Inventory | Q2 2025
Hello Customers, The second quarter have been exciting months for Zoho Inventory! We’ve introduced impactful new features and enhancements to help you manage inventory operations with even greater precision and control. While we have many more exciting
"Spreadsheet Mode" for Fast Bulk Edits
One of the challenges with using Zoho Inventory is when bulk edits need to be done via the UI, and each value that needs to be changed is different. A very common use case here is price changes. Often, a price increase will need to be implemented, and
Cloning Item With Images Or The Option With Images
Hello, when I clone an item, I expect the images to carry over to the cloned item, however this is not the case in Inventory. Please make it possible for the images to get cloned or at least can we get a pop up asking if we want to clone the images as
ZOHO BOOKS - RECEIVING MORE ITEMS THAN ORDERED
Hello, When trying to enter a vendor's bill that contains items with bigger quantity than ordered in the PO (it happens quite often) - The system would not let us save the bill and show this error: "Quantity recorded cannot be more than quantity ordered."
Stock count by bin location
Is there a configuration to make a stock count by bin or area and not by product. these is useful to manage count by area Regards
Server-based Appication API access for Social, Sites, Flow, Pages.
Hello, I am trying to hook up API access for a number of apps and I have hit a wall trying to add these scopes to the API feed. We cannot find the correct way to list the scope for these Zoho apps; Social, Sites, Flow, Writer. Error on web-page comes
Zoho Survey – Page Skip Logic Not Working
Hi everyone, I'm experiencing an issue with the page skip logic in Zoho Survey. Last week, it was working fine, and I haven’t changed anything in the settings. However, today the skip logic is not working at all. I also tried testing it with different
Zoho Survey: Bulk Exporting Raw Data (CSV/Excel) from 100+ Individual Survey Projects
Hi Zoho Community, I am currently managing a 360-degree evaluation process that involves 100+ individual survey projects (one separate survey for each employee being evaluated). I need to download the raw response data (CSV or Excel) for all 100 surveys.
Brand Studio Projects in Analytics
Hi All, Currently pulling my hair out over trying to link together some social media posts for a reporting dashboard in Analytics, so I thought I'd see if anyone on here had a solution. Our Marketing Team created a LinkedIn campaign in Zoho Brand Studio,
ERROR: Product type cannot be changed for Items having transactions.
I have mistakenly added a product type as goods for an item that was a digital service. Now when HSN/SAC became mandatory, this brought my attention to this error I did. So I tried changing the product type but it displayed this error message Product
Combine and hide invoice lines
In quickbooks we are able to create a invoice line that combines and hides invoices lines below. eg. Brochure design $1000 (total of lines below, the client can see this line) Graphic Design $600 (hidden but entered to reporting and
Introducing Built-in Telephony in Zoho Recruit
We’re excited to introduce Built-in Telephony in Zoho Recruit, designed to make recruiter–candidate communication faster, simpler, and fully traceable. These capabilities help you reduce app switching, handle inbound calls efficiently, and keep every
Include Notes in email templates for task
Hi there, I am setting up some automated email reminders via "setup-automation-workflow" to be send out when a task is being edited. I would like to include the "task notes" in the email. Is that possible? I do not find that field in the dropdown table when setting up the email template. Is it also possible to trigger the workflow rule when a new note is added to the task? In my opinion that should be quite essential, since a task update is often done by adding a new note to the task.... Also i
Auto-publish job openings on my Zoho Recruit Careers Website
I have developed a script using the Zoho Recruit API that successfully inserts new jobOpening records to my Zoho Recruit website, but my goal is to auto-publish to the Careers Website. The jobOpening field data shows two possible candidates to make this
[Free webinar] Custom domains for portals in Zoho Creator - Creator Tech Connect
Hello everyone, We’re excited to invite you to another edition of the Creator Tech Connect webinar. About Creator Tech Connect The Creator Tech Connect series is a free monthly webinar featuring in-depth technical sessions designed for developers, administrators,
Remove my video
Hi, How can I remove my video so that I don't have to see myself. It's weird so I always remove my own video from what I see but cannot find this feature here. Thanks!
Marking a meeting 'done'.
I would like to somehow mark a meeting 'done' and placed under the contact's page rather than deleting it and having no record of it. Am I missing a button that does this?
Next Page