Automating Attendance Tracking with Zoho Cliq Developer Platform
I wish remote work were permanently mandated so we could join work calls from a movie theatre or even while skydiving! But wait, it's time to wake up! The alarm has snoozed twice, and your team has already logged on for the day.
Keeping tabs on attendance shouldn't feel like guiding a flock of rebellious sheep. Hence, let's automate check-in and check-out notifications using the Zoho Cliq Platform Schedulers and the Zoho People API, eliminating the guesswork in attendance management and reducing the risk of errors associated with manual monitoring.
How does this solution benefit a business?
- Real-time reminders reduce instances of ghost check-ins and ensure accurate recording of everyone's logged hours.
- Essential for attendance tracking, payroll accuracy, compliance with labour laws, and audits.
- The entire team stays informed, fostering a cohesive workflow that eliminates the need for micromanagement.
Pre-requisites:
Before beginning to script the code below, we must create a connection in Cliq with Zoho People. Once a connection is created and connected, you can use it in Deluge integration tasks and invoke URL scripts to access data from the required service.
Create a Zoho People default connection with any unique name with the scopes - ZohoPeople.Attendance.ALL , ZohoPeople.forms.ALL and ZohoPeople.leave.ALL
ⓘ Document for reference : Connections in Cliq
How to obtain or locate the channel unique name in Cliq?
Navigate to the top right corner of the channel and locate the three dots. Click it.
In the menu that appears, select "Channel info" and a pop-up will open, displaying detailed channel information.
Hover over the "Connectors" section and click it. Under "API Parameters," you will find the Channel ID and unique name.
We need to create two schedulers, specifically one for check-in and another for check-out.
- After a successful login in Cliq, hover to the top right corner and click your profile. Post clicking, navigate to Bots & Tools > Schedulers.
- On the right, click the "Create Scheduler" button.
- To learn more about schedulers and their purposes, refer to the Introduction to Schedulers.
- Create a scheduler using your preferred name. Specify the following details: the scheduler name and a description.
- For the recurring period, choose the type "Weekly." Select Monday through Friday and set the time of execution to 11 AM or any other time that aligns with your company's check-in time, or customise the recurring period based on your specific use case.
- Finally, click "Save & edit code" and paste the following code.
- currentDate = zoho.currentdate;
- currentDateString = currentDate.toString("dd-MMM-yyyy");
- fromIndex = 1;
- toIndex = 200;
- // Get all active users
- users = zoho.people.getRecords("employee",fromIndex,toIndex,{},"{CONNECTION_LINK_NAME}");
- usersList = List();
- usersList.addAll(users);
- iterations = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
- // Get All Employees ( 4000 MAX )
- if(users.size() == 200)
- {
- for each iteration in iterations
- {
- fromIndex = fromIndex + toIndex;
- toIndex = toIndex + 200;
- users = zoho.people.getRecords("employee",fromIndex,toIndex,{},"{CONNECTION_LINK_NAME}");
- if(users.size() > 0 && users.size() == 200)
- {
- usersList.addAll(users);
- }
- else if(users.size() > 0 && users.size() < 200)
- {
- usersList.addAll(users);
- break;
- }
- else
- {
- break;
- }
- }
- }
-
- // Get all the employees checkedin from the morning.
- getAttendenceEntries = invokeurl
- [
- url :"https://people.zoho.com/api/attendance/fetchLatestAttEntries?duration=240"
- type :GET
- connection:"{CONNECTION_LINK_NAME}"
- ];
- latestAttendanceRecords = getAttendenceEntries.get("response").get("result");
- checkedInUsers = List();
- for each userRecord in latestAttendanceRecords
- {
- checkedInEmployeeEmail = userRecord.get("emailId");
- checkedInUsers.add(checkedInEmployeeEmail);
- }
-
- // Get all the employees who applied for leave both approved and pending ( Remove PENDING to exclude only the leave approved employees )
- leaveApprovedEmployees = invokeurl
- [
- url :"https://people.zoho.com/api/v2/leavetracker/leaves/records?from=" + currentDateString + "&to=" + currentDateString + "&dateFormat=dd-MMM-yyyy&approvalStatus=[APPROVED,PENDING]"
- type :GET
- connection:"{CONNECTION_LINK_NAME}"
- ];
- info leaveApprovedEmployees;
- leaveApprovedEmployeesList = List();
- for each member in leaveApprovedEmployees.get("records")
- {
- leaveApprovedEmployeesList.add(member.get("EmployeeId"));
- }
- info leaveApprovedEmployeesList;
-
-
- // Add the users to yet to checkin list if they are not checked from the morning and not applied for leave
- usersYetToCheckIn = list();
- for each user in usersList
- {
- employeeEmail = user.get("EmailID");
- employeeId = user.get("EmployeeID");
- employeeStatus = user.get("Employeestatus");
- if(!checkedInUsers.contains(employeeEmail) && !leaveApprovedEmployeesList.contains(employeeId) && employeeStatus.equals("Active"))
- {
- usersYetToCheckIn.add(employeeEmail);
- }
- }
-
- // Mention the list of users in the channel.
- if(usersYetToCheckIn.size() == 0)
- {
- info "No users were found yet to checked-in at 11 PM today. Great to see everyone wrapping in on time! ✅";
- }
- else
- {
- usersYetToCheckInString = "";
- for each user in usersYetToCheckIn
- {
- usersYetToCheckInString = usersYetToCheckInString + "[" + user + "](mail:" + user + ") \n";
- }
- usersYetToCheckInString = usersYetToCheckInString.subString(0,usersYetToCheckInString.length() - 2);
- response = Map();
- card = Map();
- card.put("title","Employees who haven’t checked in yet ( " + usersYetToCheckIn.size() + " )");
- card.put("thumbnail","https://i.pinimg.com/originals/85/e9/f3/85e9f3f5ac31fc5aab586e208297f43d.gif");
- card.put("theme","modern-inline");
- response.put("card",card);
- response.put("text",usersYetToCheckInString);
- info zoho.cliq.postToChannel("{CHANNEL_UNIQUE_NAME}",response);
- }

- Now, let's follow the same steps and create a scheduler for checkout reminders. Under the recurring period, choose the type as "Weekly." Select Monday through Friday and set the time of execution to 7 PM or any other time that aligns with your company's checkout time, or customise the recurring period based on your specific use case.
- Click "Save & edit code" and paste the following code.
- attendanceResponse = invokeurl
- [
- url :"https://people.zoho.com/api/attendance/fetchLatestAttEntries?duration=600"
- type :GET
- connection:"{CONNECTION_LINK_NAME}"
- ];
- info attendanceResponse;
- todayDate = zoho.currenttime.toString("YYYY-MM-dd");
- latestAttendanceRecords = attendanceResponse.get("response").get("result");
- usersWithoutCheckout = list();
- if(latestAttendanceRecords.size() > 0)
- {
- for each userRecord in latestAttendanceRecords
- {
- userEmail = userRecord.get("emailId");
- dailyEntries = userRecord.get("entries");
- for each dailyEntry in dailyEntries
- {
- if(dailyEntry.containsKey(todayDate))
- {
- todayEntryDetails = dailyEntry.get(todayDate);
- attendanceLogs = todayEntryDetails.get("attEntries");
- for each logEntry in attendanceLogs
- {
- if(!logEntry.containsKey("checkOutTime"))
- {
- usersWithoutCheckout.add("{@" + userEmail + "}");
- }
- }
- }
- }
- }
- }
- usersWithoutCheckoutString = usersWithoutCheckout.toString("\n");
- if(usersWithoutCheckoutString.trim().length() == 0){
- usersWithoutCheckoutString = "No users were found checked-in after 7 PM today. Great to see everyone wrapping up on time! ✅";
- }
- response = Map();
- card = Map();
- card.put("title","List of users who remain checked in ( " + usersWithoutCheckout.size() + " )");
- card.put("thumbnail","https://media.tenor.com/Hd8nLZZTPRYAAAAi/alarm-clock-alarm.gif");
- card.put("theme","modern-inline");
- response.put("card",card);
- response.put("text",usersWithoutCheckoutString);
- info zoho.cliq.postToChannel("{CHANNEL_UNIQUE_NAME}",response);

Wrapping up and checking out for the day, hopefully
Whether you're from HR, tired of chasing attendance logs, or an enthusiastic team lead trying to increase your team's visibility and adjust workload accordingly, Cliq Platform's schedulers are essential and ensure that accurate tracking is consistent and compliance is maintained. Additionally, this would be scalable to handle organizations of any size.
If attendance tracking is a binge-watchable series, what plot twist would these reminders add to your team's script? Let us know in the comments below!