
Howdy Tech Wizards!
Welcome back to a fresh week of Kaizen!
This time, we are diving into a two-part series where you will learn how to build a Timer and Worklog Widget for Zoho CRM. This widget helps track active work time and log multitasking sessions using Zoho CRM
APIs,
Client Script,
Functions, and
Workflows.
Why It Matters?
Zoho CRM effectively captures stage/status transitions, like tracking when a case moves from Open to In Progress or On Hold. However, in dynamic work environments, employees juggle multiple work items and engage in impromptu tasks or conversations.
Let’s take the On Hold status as an example.
While it can be used to indicate pauses in progress, it does not always align with real-world workflows. Consider these scenarios:
Not all interruptions justify a status change
Moving the case to On Hold for every minor detour (to clarify something with a colleague or respond to another emergency work item) would be impractical and could lead to under reporting actual work hours. Over time, this untracked effort adds up, creating a gap in visibility.
Frequent status changes may dilute their meaning
In many teams, On Hold signifies a legitimate blocker like waiting on customer input or an external dependency. Using it frequently to reflect quick shifts in attention could compromise that clarity.
A timer widget solves this by:
- Capturing hands-on work items.
- Logging context switches (unrelated tasks) with descriptive entries.
- Feeding structured entries into a custom module for reporting and subform sync.
Business Scenario: IT Service Desk & Ticket Resolution
A tech support team uses the Cases module to resolve customer issues. Some tickets are straightforward; others require follow-ups, escalations, or cross-team coordination. While CRM timestamps (like stage transitions or picklist tracking) track when changes happen, they do not reflect how long someone actively worked on a case.
This Timer Widget can be the ultimate solution to track down the active time spent on each case through out the day.
What are we Building?
By the end of this two-part guide, you will know how to:
- Build a timer widget to track time per task or any CRM record.
- Log work sessions into a custom module every time the timer is started/stopped.
- Automatically populate a subform in the corresponding record module using workflows and Deluge functions.
- Leverage the Reports module to analyze work patterns, SLA adherence, and productivity trends.
In Part I, we will focus on:
-> Building and configuring the Timer Widget.
-> Capturing each timed session as a record in a custom module.
Prerequisites
1. Create a Custom Module
Create a custom module named Timer Entries to log work details and generate reports from the Reports module. A new record will be added to this module each time a timer is started.
Set up the following custom fields in the Timer Entries module:
| |
Start Time | DateTime |
End Time | DateTime |
Total Duration (in mins.) | Formula DateBetween(${Timer Entries.Start Time},${Timer Entries.End Time},'Minutes') |
Related to Case | Lookup to Cases module |
Work Description | |
2. Add a custom picklist option
Add a custom picklist option called In Progress to the Status picklist field in the Cases module for precisely identifying the status of the cases.
3. Setup Custom Views for Contextual Filtering
To streamline the widget experience and ensure users only see relevant records to associate while tracking time, set up two smart custom views—one in the Cases module and another in the Timer Entries module.
Active Cases View (Cases Module)
Create a custom view in the Cases module to list only the active tickets the logged-in user is working on. Use the following criteria tips:
- Use the Status field to filter records with values like In Progress, On Hold, or Escalated.
- Use the Case Owner field to show records that are assigned only to the currently logged-in user.
This view powers the drop-down inside the widget where users select the case they want to start the timer for.
Active Timers View (Timer Entries Module)
Set up a second custom view in the Timer Entries module to track entries where the timer has been started but not yet stopped. These represent active timers. Use the following logic for criteria:
- The End Time field is empty (i.e., timer still running).
- Timer Entry owner field matches the logged-in user.
This view is used internally by the widget to detect if a timer is already running and update the same entry once the timer is stopped.
Follow the
Managing List View help page and use the specifications shown in the following image.
Building the Timer Widget
Step -1: Review Basics
Refer to our earlier
Kaizen on CLI Installation, Creating a Widget Project, and Internal hosting of the same.
Step 2 - Develop the Widget
After initializing your widget project using CLI, implement the timer logic:
Fetching Active Cases
On page load, the
populateRecordsDropdown function initiates a
Get Records API call to the Cases module, using the Active Cases custom view ID. This fetches all active case records assigned to the logged-in user.
These records are then listed in a dropdown, allowing users to quickly select the relevant case they are about to work on.
async function populateRecordsDropdown() { const recordsDropdown = document.getElementById("moduleRecords"); recordsDropdown.innerHTML = "";
try { const recordsResponse = await ZOHO.CRM.API.getAllRecords({ Entity: casesModule, cvid: casesCVID, per_page: 10 });
if (recordsResponse.data && recordsResponse.data.length > 0) { recordsResponse.data.forEach(record => { const option = document.createElement("option"); option.value = record.id; option.textContent = record.Subject || "Unnamed Record"; recordsDropdown.appendChild(option); }); } else { const placeholderOption = document.createElement("option"); placeholderOption.value = ""; placeholderOption.textContent = "No records found"; placeholderOption.disabled = true; placeholderOption.selected = true; recordsDropdown.appendChild(placeholderOption); } } catch (error) { console.error("Error fetching records:", error); } } |
Starting the Timer and Creating an Entry
Once the user starts the timer, The
createRecord function triggers a
Create Record API call to log the session in the Timer Entries custom module. The record captures the start time and the related case and description (if provided).
Even if no details are entered or case is selected, a timer entry is still created with the start time. This ensures that spontaneous work sessions are tracked and not lost.
async function createRecord(startTime) { try { const workDescription = document.getElementById("workDescription").value; const selectedRecordId = document.getElementById("moduleRecords").value; const selectedRecordText = document.getElementById("moduleRecords").options[ document.getElementById("moduleRecords").selectedIndex ].text;
const data = { Start_Time: startTime, Owner: currentUserId, Work_Description: workDescription, Related_to_Case: selectedRecordId, Name: selectedRecordText };
const response = await ZOHO.CRM.API.insertRecord({ Entity: timerModule, APIData: data });
console.log("Start time recorded successfully"); } catch (error) { console.error("Error creating record:", error); } }
|
Stopping the Timer and Updating the Entry
When the timer is stopped, the widget uses the Active Timer Entry custom view to locate the most recent Timer Entry record created by the logged-in user that does not have an end time.
The
updateRecord is then triggered to update that active entry using the
Update Record API call. It updates the End time of the session and the related case, descriptions, if it was not already provided when the timer was started.
async function updateRecord(endTime) { try { const workDescription = document.getElementById("workDescription").value; const selectedRecordId = document.getElementById("moduleRecords").value;
const response = await ZOHO.CRM.API.getAllRecords({ Entity: timerModule, cvid: timerEntriesCVID, per_page: 1 });
const latestRecord = response.data[0]; if (latestRecord) { const recordId = latestRecord.id; const data = { id: recordId, End_Time: endTime, Work_Description: workDescription, Related_to_Case: selectedRecordId };
await ZOHO.CRM.API.updateRecord({ Entity: timerModule, APIData: data, RecordID: recordId }); console.log("End time updated successfully"); } } catch (error) { console.error("Error updating record:", error); } } |
Step 3 - Validate and Pack the Widget
- Follow the steps given in the Widget help page to validate and package the widget.
- Go to Zoho CRM > Setup > Developer Hub > Widgets and click Create New Widget.
- Fill in the required details as shown in this image and ensure to select Button as the widget type.
Step 4 - Associate it with Flyout
- Go to Setup > Developer Space > Client Script. Click New Script.
- Enter a name and description for the script. Choose Command type in Category.
- Create a Flyout and render a widget within it using its details like the API name of the widget, title, size, and animation type. You can get the Widget API name from the widget's detail page.
let allowedUserEmails = []; allowedUserEmails.push('user1_email_address'); allowedUserEmails.push('user2_email_address'); allowedUserEmails.push('user3_email_address'); let currentUserEmail = $Crm.user.email; if (allowedUserEmails.indexOf(currentUserEmail) == -1) { ZDK.Client.showMessage('Command access resticted', { type: 'error' }); return false; } ZDK.Client.createFlyout('myFlyout', {header: 'Timer', animation_type: 4, height: '600px', width: '500px', top: '10px', left: '10px', bottom: '10px', right: '10px' }); ZDK.Client.getFlyout('myFlyout').open({ api_name: 'Timer', type: 'widget' }); return true; |
Refer to
Creating a Client Script help page for more details.
Try It Out!
A complete working code sample of this widget is attached to this post.
Now, let us see how this Timer widget works:
1. Start the Timer
Open the widget and select an active case from the dropdown. As soon as you start the timer, a new record will be automatically created in the Timer Entries module to capture the session.
2. Stop the Timer
When the task is complete, provide a description of the work you have done and stop the timer. The same Timer Entry record (created when the timer was started) will be updated automatically with the end time and your work description.
This forms the foundation for accurate time tracking at the record level.
In Part 2, we will show how to:
-> Use a workflow and Deluge function to transfer these entries into the Work Log subform inside the relevant Cases record.
-> Use CRM Reports to slice and dice work time for better SLA and productivity insights.
In the meantime, would you like us to address any of your pain-points or have a topic to discuss? Let us know in the comments or reach out to us via
support@zohocrm.com.
Until next time, Happy Coding!
-----------------------------------------------------------------------------------------------------------------
Related Reading
-----------------------------------------------------------------------------------------------------------------
Recent Topics
Zoho Form to Zoho Form Integration
I've created an application form that asks for references. I would like the submission of the application form to trigger a form to the reference using the email id and name entered in the first form. In the reference form that is triggered I need to
CRM: related table using module queries, are links possible?
Hello. I was exploring the possibility of using a module query to get a filtered related list. For example, I'm using a Canvas custom details page and if an account has an open deal I'd like it to appear at the very beginning of the account page, with
【開催報告】名古屋 ユーザー交流会 Vol.1 2025/6/6 Zohoで社内システム管理を実現するユーザー事例の共有
ユーザーの皆さま、こんにちは。コミュニティチームの藤澤です。 6/6(金)に名古屋 ユーザー交流会 Vol.1を開催しました。当日は11名の皆さまにご参加いただきました。 本投稿では、当日実施したセッションの様子と投影資料をご紹介します。会場にお越しいただけなかった方も、ぜひご覧ください。 ユーザー活用事例セッション:Zoho CRM Plusによる引合~見積~受注までのプロセス統合 日本アイリッヒ株式会社の清水裕さんに登壇いただきました。以下に一部抜粋して掲載しています。ぜひご覧ください。 セッションの後半は、清水さんの環境を投影いただき、実際の画面上で操作しながらご説明いただいたため、本記事では掲載しておりません。予めご了承ください。
Better reorder point functionality?
1. How about having item reorder point warehouse level instead branch? 2. Considering committed stock and to be received quantity also as reorder point calculation? 3. Considering associated items as committed when sales order created on composite i
Batch tracking updates
I applaud the Zoho team for their recent updates to batch tracking information and even though I have 'chatted' to the Zoho team, I'm still batteling to understand the reasoning on the below. We buy stock in bulk and it is received into the Bulk Warehouse.
Custom Button in Shipments
Custom buttons feature is very much needed in shipments. Please work on this feature request!
Zoho Support is Dysfunctional & Don't Know Their Own Support Hours
Seeking clarification on Zoho support hours and contact numbers please. We have been trying to phone Zoho support on +61 2 8066 2898 at 9:20am AEDT for the second day in a row, and gotten a message on Zoho's support line: "support is open monday through
What are the knowledge database limit for AnswerBot and which app its integrate?
1) Can AnswerBot be integrated in Trainer Central? 2) Can AnswerBot learn from external websites and excel spreadsheets? 3) Is there a limit size or number of documents for the knowledge based content to train AnswerBot? Thanks
Reports showing 24hr days instead of business hours
I am not sure what I am missing, I created a report to look at resolution times in business hours but it is displaying hours based on 24hr days. I have business hours set (7am-5pm) and all that functionality is working, the reports are displaying 2 days
Skip Pages - Zoho form
Hi Team, I need help with skipping pages based on the below logic in Zoho form: If field number of borrowers is 1 and field number of dependants is 0 then do not show page borrower 2 and 3 If field number of borrowers is 2 and field number of dependants
How to print blank form and also how to use form offline
I have created a form in PC and want to use the form in the field to gather information. Can I use the form offline in PC - in case I have no internet access? As a fail safe, I'd like to print the blank form ut just in case the PC form doesnt work for
Using Marketing Automation Journey to associate lead record with a campaign?
Hello, I am trying to push people from a Marketing Automation Journey to a CRM campaign so I can track lead journeys and lead conversions however I am hitting a roadblock. When a lead hits particular scores or does specific actions in marketing automation
Expose FIFO COGS in Invoice API
Currently, in the Invoice API, the line_items array contains the purchase_rate field. Unfortunately, this purchase_rate field is the Cost Price of the Item, not the FIFO cost journaled into COGS for that sale. There seems to be no current way to get the
Drag-and-Drop Customization Interface for Help Center in Zoho Desk
Hi Zoho Desk Team, We hope you're doing well. We’d like to submit a feature request regarding the customization of the Help Center in Zoho Desk. 🔧 Current Limitation: At present, Help Center customization options are quite limited through the Zoho Desk
hide resolution from help centre
to my surprise, i just found out that the resolution text is public in the helpcenter, even if 'notify customer' is off. is there a workaround to that? how do others deal with this? How zoho support does this and I don't think its used by Zoho in the first place. the resolution is meant to be private, not public
Stop selling out of stock Items.
Hi I have been using Zohobooks for a around 8 month now. I am not involved in selling process but my staff cant stop selling product which they do not hold in stock, this is a big headache for me as physical count never matches what is shown on the books.
Importing New Items to be Added to Existing Item Group
How to use the import sheet to import new items to be added to an existing item group. The import gives me an error that the item group name already exists and won't proceed. If it's possible, how should my import spreadsheet should look like?
ShipStation and Zoho Inventory
Hello, I am looking to sync zoho inventory with shipstation ZOHO INVENTORY SHIP STATION Sales Order ==> create ORDERS INVOICE <== Shipments What exactly does BETA mean on the Shipstation connector? This is required for me to sign-on in the next month. Thanks in advance for your efforts
Condolences and Prayers Following the Ahmedabad Plane Crash
Dear Zoho Team, We were heartbroken to learn about the tragic plane crash that occurred today in Ahmedabad, as reported in the news. On behalf of our entire team, we want to extend our deepest condolences to everyone at Zoho and across India who may have
Zoho Developer Community Monthly Digest – May 2025
Hello everyone, Welcome to this month’s Zoho Developer Community Digest! From fresh product insights to hands-on tech sessions and standout community threads, there's plenty here to keep your ideas flowing and your skills sharp. Be sure to explore our
Timesheet in project not visible to invited users.
We are using Zoho Projects and have enabled the client portal so our clients can access both Projects and Timesheets. However, while the client can see the project, no timesheet entries are visible. How can we resolve this issue?
Scheduled outbound calls
How do you mark a scheduled outbound call as complete? I see no way to change the status.
How to see exact clicked links in CRM from Zoho Campaigns ?
Hi, I'm wondering how I can see the clicked links from an email sent from Campaigns when I'm in a campaign in the CRM module. I can see the number of clicks but I need the sales team to be able to see which link has been clicked by a prospect or contact.
Email parser rule will only parse emails with an exact match? What madness is this?
I finally got myhead around deluge and scripting, but wondered why my parser wasn't working. (https://help.zoho.com/portal/en/community/topic/extract-11-digit-number-in-any-position-from-enail-subject) Problem: There are *zero* characters or phrases that
How to add a fee based on payment method
I currently accept both ACH payments and credit card. I want to add a 3% fee to a number of my subscription plans if the customer chooses to use a credit card (and not ACH/checking). How do I do this? Is there an in-built feature, or would i have to create
Condolences and Prayers Following the Ahmedabad Plane Crash
Dear Zoho Team, We were heartbroken to learn about the tragic plane crash that occurred today in Ahmedabad, as reported in the news. On behalf of our entire team, we want to extend our deepest condolences to everyone at Zoho and across India who may have
CRM Analytics - Elegant Comparator
Anyone noticed a wierd thing on the Elegant Comparator on CRM... Compare Among - Time Period - Last 6 Weeks... only 5 weeks show Compare Among - Time Period - Last 5 Weeks... only 4 weeks show Compare Among - Time Period - Last 4 Weeks... only 3 weeks
Copy Templetes from one module to another in Zoho Books.
Hello, I have created a Custom Module in Books for GST Invoice. I can see only 1 Invoice Templete over there. Can we clone or copy Invoices Templetes from Sales Module of Books into Customer Module.
Enhancements in Bookings browser extension
Greetings from Zoho Bookings! We're here with another update to make your scheduling even quicker. We have enhanced our browser extension with three significant features: Copy slots to email Gmail integration LinkedIn integration Copy slots to email This
Some notes are shown as Not Synced
I'm not sure why this happens but it's a weird little bug I noticed. I have two notes I believe that has that weird icon shown in the screenshot that shows that it's not synced even though the notes do sync properly. Manual syncing doesn't remove the
Power of Automation :: Auto-Color Tasks in Gantt chart based on values in Picklist field.
Hello Everyone, A Custom function is a user-written set of code to achieve a specific requirement. Set the required conditions needed as when to trigger using the Workflow rules (be it Tasks / Project) and associate the custom function to it. Requirement:-
Zoho CRM record in blueprint unable to initiate any form of approval process
My business case As a penetration testing company, we have engagements that need to follow a set path, from “to be scheduled” to “assigned to tester” to “regulatory documents sent” to “testing in progress” to “report delivered”. On this path, a particular
Edit Project Number?
Hi all: We just signed up for a trial of zoho one, which includes ZoHo Projects. We've noticed there was a 'dummy project' preloaded in projects to help familiarize yourself with the software. We've created a couple of our own projects now but noticed since the dummy project was preloaded, our projects start with number 2 then 3, sequentially. Since it seems we will be keeping zoho past the trial, If we delete the dummy project, how do we get our own projects renumbered, beginning with 1? We'd like
Tip of the Week #57– Reply faster with saved response templates!
Ever find yourself typing out the same email reply over and over again? It's time consuming and eats productive work hours. With shared response templates, you and your team can create pre-composed messages to quickly respond to common queries — saving
Connect MySQL database to Zoho sites
Hi! Is there a way to connect a MySql database with Zoho sites. So the user input are stored in and dinamic data is fetched from the database? Regards, Mihály
What’s new in Zoho RPA: Cross-platform automation, OCR, and more!
Zoho RPA is now included in Zoho One Zoho RPA is now part of the Zoho One suite, bringing unified automation to your entire business ecosystem. You can now automate UI-based tasks across Zoho apps and third-party systems too. From processing sales orders
New in CPQ: Create dynamic actions in Product Configurator (PC), clone PCs and Price Rules (PRs)
Configuring product combinations just got enhanced. Zoho CRM's CPQ system now supports dynamic actions based on multiple base products. Additionally, you can now clone configurations for both Product Configurator (PC) and price rules (PRs). Dynamic actions
Beyond Email: #2 Connect better with Contacts
After successfully creating a 'Welcome & Setup' event using the Calendar, Sarah is eager to invite her team members to participate. For a smoother communication experience and easy access, Sarah wants to store their information, ensuring quick reference
Integrate MS Teams with Zoho CRM for faster collaboration
Availability Editions: Standard and above DCs: All Release status: This feature has been released for all users in all DCs. Help resource: Microsoft Teams integration Hello everyone, We're adding MS Teams to our lineup of CRM chat integrations—Cliq, Slack,
What is New in CRM Functions?
What is New in CRM Functions? Hello everyone! We're delighted to share that Functions in Zoho CRM have had a few upgrades that would happen in phases. Phase 1 An all new built-in editor for better user experience and ease of use. ETA: In a couple of days.
Next Page