Kaizen #8 - Handling Recurrence and Participants in the Events Module via API

Kaizen #8 - Handling Recurrence and Participants in the Events Module via API

Hello everyone!

We are back this week with an exciting post—Handling recurrence and participants in the Events module through API.

First things first—What is the Events module?
"Events" is a part of the Activities module in Zoho CRM. 
An event is an activity that happens at a given place and time. You can find Events on the user's Zoho CRM's home page, Activities home page, Calendar, and in other related records.

What are the types of Events?
Events are of two types—Recurring and non-recurring events.
Recurring events: These events repeat/recur at a set frequency. You can set them to repeat by day, week, month, or by year. You can also set them to repeat a fixed number of times. 
Non-recurring events: These are one-time events.
Both these events can also be all-day events.

Now, let us see how to handle a recurring event and add/update participants via API.

1. Creating a Recurring Event through API
You must use the Insert Records API to insert a record in the Events module.

Request URL: {{api-domain}}/crm/v2/Events
Request method: POST

Sample input to create a recurring event that repeats every two weeks

{
    "data": [
        {
            "All_Day": false,
            "Event_Title": "Kaizen_9_Weekly",
            "Start_DateTime": "2020-02-02T10:00:00+05:30",
            "End_DateTime": "2020-02-02T11:00:00+05:30",
            "Participants": [
                {
                    "type": "contact",
                    "participant": "3652397000001281003"
                },
                {
                    "type": "lead",
                    "participant": "3652397000000415063"
                },
                {
                    "type": "user",
                    "participant": "3652397000000186017"
                }
            ],
            "Recurring_Activity": {
                "RRULE": "FREQ=WEEKLY;BYDAY=SU;INTERVAL=2;UNTIL=2020-03-15"
            },
            "Remind_At": "2020-02-01T09:45:00+05:30",
            "Who_Id": {
                "id": "3652397000000649013",
                "name": "Patricia Boyle"
            },
            "Venue": "Chennai",
            "$se_module": "Accounts",
            "What_Id": "3652397000000624046",
            "$send_notification": true
        }
    ]
}


Mandatory keys
The following table lists the mandatory fields you must specify while creating a recurring event. Not including any one of these fields results in the MANDATORY_NOT_FOUND error.

Key
Data Type
Description
Event_Title
String
Title of the event. Accepts a maximum of 255 characters, alphanumeric, and special characters. 
Start_DateTime
DateTime
The date and time (in ISO8601 format) at which the event begins. 
End_DateTime
DateTime
The date and time (in ISO8601 format) at which the event ends. 
Recurring_Activity
JSON Object
JSON Object that contains information about the recurrence pattern of the event in the key "RRULE".

Other Keys

Key
Data Type
Description
All_day
Boolean
Represents if the event takes place all day.
Participants
JSON Array
Contains the ID and type of each participant in individual JSON objects. Possible participant types are "lead", "contact", "user", and "email".
Remind_At
DateTime
The date and time in the current user's time zone (in ISO8601 format) at which a reminder is sent to the participants. 
Who_Id
JSON Object
The name and ID of the contact that the event is related to; that contact may or may not be a participant of the event.
What_Id
JSON Object
The name and ID of the Account, Deal, Product, Quote, Invoice, Campaign, Vendor, Case, Purchase Order, or Sales Order that the event is created for.
$se_module
String
The API name of the parent module given in the key "What_Id". This key is mandatory when you include the "What_Id".
Venue
String
The place where the event takes place. Accepts a maximum of 255 characters, alphanumeric, and special characters.
$send_notification
Boolean
Represents if you want to send invitations to the participants of the event. The value true sends out invitations, and false does not. 

We will now discuss the Participants and RRULE keys in detail.

1.1 Participants
The Participants key is a JSON array of participant JSON objects. You can add four types of participants to an event—lead, contact, user, and email. 
You must include each of these participant types as individual JSON objects inside this array as shown below.

"Participants": [
        {
            "type": "contact",
            "participant": "3652397000001281003"
        },
        {
            "type": "lead",
            "participant": "3652397000000415063"
        },
        {
            "type": "user",
            "participant": "3652397000000186017"
        },
        {
            "type": "email",
            "participant": "carissa-kidman@yahoo.com"
        }
]

Where, 
type - The type of participant. The possible values are lead, contact, user, email
participant -  The record ID of the lead, contact, or user.

1.2 RRULE
RRULE is the key in the Recurring_Activity JSON object that determines the recurrence pattern of the event. 
RRULE holds multiple key-value pairs for different types of recurring events (i.e Daily, Weekly, Monthly, Yearly). You must separate each key-value pair by a semicolon.

Mandatory key-value pairs for RRULE
Key
Possible Values
Description
FREQ
DAILY, WEEKLY, MONTHLY, YEARLY
Frequency; represents how often the event repeats. 
INTERVAL
1–99
The gap between each event. For example, for a weekly recurring event, if the INTERVAL value is 2, the gap between the first and the next event will be two weeks. 
COUNT
1–99
The number of events you want to create. For example, if the COUNT value is 3, three events will be created. 

Note
You must specify FREQ and (INTERVAL or COUNT) in RRULE.

Other key-value pairs in RRULE
Key
Possible Values
Description
BYMONTHDAY
1–31
The day of the month the event repeats on. Applicable only for  monthly and yearly events.
BYDAY
SU, MO, TU, WE, TH, FR, SA
The day of the week the event repeats on. Applicable for daily, weekly, monthly, and yearly events.
BYSETPOS
1, 2, 3, 4, -1 
The week of the month the event repeats in.
Applicable only for monthly and yearly events.
1 - Event repeats every first week of the month
2 - Event repeats every second week of the month
3 - Event repeats every third week of the month
4 - Event repeats every fourth week of the month
-1 - Event repeats every last week of the month.
UNTIL
Date in yyyy-MM-dd format
The date until which the event must repeat.

Therefore, according to the sample input given at the beginning of the post, the event starts on Feb 2, 2020 at 10:00 AM and ends the same day at 11:00 AM.

According to  "RRULE":"FREQ=WEEKLY;BYDAY=SU;INTERVAL=2;UNTIL=2020-03-15", the event occurs every Sunday, with an interval of 14 days (2 weeks), and recurs until Mar 15, 2020.
Therefore, the sequence is as shown below.
  1. The event begins on Feb 2, 2020.
  2. The first recurring event happens on Feb 16, 2020.
  3. The second recurring event happens on Mar 1, 2020.
  4. The last recurring event happens on Mar 15, 2020.
Therefore, the response will have four JSON objects—one for the first event as specified in the Start_DateTime key, and one for each recurring event.

Note
You can only create one set of recurring events using the RRULE in a single API call.

A few other examples of RRULE:
  • "RRULE": "FREQ=MONTHLY;COUNT=3;BYDAY=WE;BYSETPOS=2".
    This RRULE creates three events that recur every Wednesday in the second week of the month.
  • "RRULE": "FREQ=MONTHLY;INTERVAL=2;COUNT=3;BYMONTHDAY=14".
    This RRULE creates three events that recur on the 14th day of the month, and repeat once in two months.

2. Updating an Event
You must use the Update Specific Record API to update an event.
In this section, we will discuss
  1. Adding a participant to an event
  2. Updating all future events
2.1 . Adding a participant to an event
Details you need to add a participant to an event
  1. The event's record ID. You can obtain this from the response you received while creating the event.
  2. The ID of the participants that are added already. The GET Specific Event response will have a unique ID for each participant in the "Participants" JSON array.
The sample input is as follows.

{
    "data": [
        {
            "All_Day": false,
            "Event_Title": "Kaizen_10_Weekly",
            "Start_DateTime": "2020-02-02T11:00:00+05:30",
            "End_DateTime": "2020-02-02T12:00:00+05:30",
            "Participants": [
                {
                    "type": "contact",
                    "participant": "3652397000001281003",
                    "id": "3652397000001326102"
                },
                {
                    "type": "lead",
                    "participant": "3652397000000415063",
                    "id": "3652397000001326100"
                },
                {
                    "type": "user",
                    "participant": "3652397000000186017",
                    "id": "3652397000001326098"
                },
                {
                    "type": "email",
                    "participant": "john-butt@gmail.com"
                }
            ],
            "Remind_At": "2020-02-01T10:45:00+05:30",
            "$send_notification": true
        }
    ]
}
As you can see, a new participant of type email and email ID john-butt@gmail.com is added. Since the ID of the existing participant with the email ID carissa-batman@yahoo.com is not specified, it gets deleted.

Note
  • participant is the record ID of the participant (lead, contact, or user).
  • ID is the unique ID of the participant for that event.
  • While adding a participant, you must specify the IDs of other participants for the event. Otherwise, only the new participant is added, while the rest are deleted.

2.1 . Updating all future events
While updating an event, you can choose to update all future events with the new change.
Use the boolean key update_all_future_events. The value true updates all future events, and the value false updates only that particular event.
Here is a sample input.

{
    "data": [
        {
            "All_Day": false,
            "Event_Title": "Kaizen_10_Weekly",
            "Start_DateTime": "2020-02-02T11:00:00+05:30",
            "End_DateTime": "2020-02-02T12:00:00+05:30",
            "Participants": [
                {
                    "type": "contact",
                    "participant": "3652397000001281003",
                    "id": "3652397000001326102"
                },
                {
                    "type": "lead",
                    "participant": "3652397000000415063",
                    "id": "3652397000001326100"
                },
                {
                    "type": "user",
                    "participant": "3652397000000186017",
                    "id": "3652397000001326098"
                },
                {
                    "type": "email",
                    "participant": "carissa-kidman@yahoo.com"
                }
            ],
            "Remind_At": "2020-02-01T10:45:00+05:30",
            "update_all_future_events": true,
            "$send_notification": true
        }
    ]
}

Points to Note
While creating recurring events,
  • You must specify either COUNT or INTERVAL in the RRULE. Otherwise, the system creates 365-day events.
  • For WEEKLY recurring events, you must include BYDAY in RRULE. Otherwise, the system creates 365-day events that recurs weekly.

While updating a recurring event,
  • You must specify the record ID of the event you want to update. 
  • You must set the value of the key update_all_future_events to true to update all future events. Otherwise, the system updates only that event and the other recurring events that you created previously will remain unaltered.
  • While adding a participant, you must specify the IDs of other participants. Otherwise, only the new participant is added, while the rest are deleted.
  • You cannot update RRULE through the API.
  • You cannot update check-in related information through the API.

We hope you found this post useful. Please reach out to us if you have questions, or let us know in the comment section.
Cheers!
















    • Sticky Posts

    • Kaizen #222 - Client Script Support for Notes Related List

      Hello everyone! Welcome to another week of Kaizen. The final Kaizen post of the year 2025 is here! With the new Client Script support for the Notes Related List, you can validate, enrich, and manage notes across modules. In this post, we’ll explore how
    • Kaizen #217 - Actions APIs : Tasks

      Welcome to another week of Kaizen! In last week's post we discussed Email Notifications APIs which act as the link between your Workflow automations and you. We have discussed how Zylker Cloud Services uses Email Notifications API in their custom dashboard.
    • Kaizen #216 - Actions APIs : Email Notifications

      Welcome to another week of Kaizen! For the last three weeks, we have been discussing Zylker's workflows. We successfully updated a dormant workflow, built a new one from the ground up and more. But our work is not finished—these automated processes are
    • Kaizen #152 - Client Script Support for the new Canvas Record Forms

      Hello everyone! Have you ever wanted to trigger actions on click of a canvas button, icon, or text mandatory forms in Create/Edit and Clone Pages? Have you ever wanted to control how elements behave on the new Canvas Record Forms? This can be achieved
    • Kaizen #142: How to Navigate to Another Page in Zoho CRM using Client Script

      Hello everyone! Welcome back to another exciting Kaizen post. In this post, let us see how you can you navigate to different Pages using Client Script. In this Kaizen post, Need to Navigate to different Pages Client Script ZDKs related to navigation A.
      • Recent Topics

      • Sync Data from MA to CRM

        Currently, it's a one-way sync of data from the CRM to MA. I believe we should have the ability to select fields to sync from MA to the CRM. The lead score is a perfect example of this. In an ideal world we would be able to impact the lead score of a
      • Update CRM record action

        Currently, MA only offers a "Push Data" action to push data to a CRM module. This action is built to cover the need to both create a new record and update an existing record. Because it has been implemented this way all required fields on the CRM module
      • The reason I switched away from Zoho Notebook

        My main reason for switching to Zoho was driven by three core principles: moving away from US-based products, keeping my data within India as much as possible, and supporting Indian companies. With that intent, I’ve been actively de-Googling my digital
      • Pro Lite Upgrade - Quick Access Tray

        Hello, I was going to upgrade to Pro Lite but the Quick Access Tray feature isn't available for Windows. Of the four features not available for Windows, the QAT is what I'm most interested in. Are there plans to add this feature for Windows anytime soon?
      • Add RTL and Hebrew Support for Candidate Portal (and Other Zoho Recruit Portals)

        Dear Zoho Recruit Team, I hope you're doing well. We would like to request the ability to set the Candidate Portal to be Right-to-Left (RTL) and in Hebrew, similar to the existing functionality for the Career Site. Currently, when we set the Career Site
      • How to set page defaults in zoho writer?

        hi, everytime i open the zoho writer i have to change the default page settings to - A4 from letter, margins to narrow and header and footer to 0. I cannot set this as default as that option is grayed out! so I am unable to click it. I saved the document
      • Boost your CRM communication with new font types, sizes, and default reply-to options while composing emails

        Hello Everyone, We’re excited to introduce a series of impactful enhancements to the email composer settings in Zoho CRM. These updates enable you to personalize and optimize your customer interactions with greater efficiency. So what's new? Add custom
      • Unable to Send Different Email Templates for Different Documents in Zoho Sign

        Hello Zoho Community, I am facing a limitation with Zoho Sign regarding email notifications sent to customers when a document is sent for signing. Currently, whenever I send any template/document for signing, the email notification that goes to the customer
      • Auto tracking URL generation based on Carrier

        Hi, While creating a shipment order for a package in Zoho Books, I have a requirement that for example, if the carrier is Delhivery and tracking number is 1234, then can automatically the tracking link/URL be generated as www.delhivery.com/1234. Similary,
      • Notes badge as a quick action in the list view

        Hello all, We are introducing the Notes badge in the list view of all modules as a quick action you can perform for each record, in addition to the existing Activity badge. With this enhancement, users will have quick visibility into the notes associated
      • Webtabs for Mobile App

        We let our users strictly use CRM and use webtabs to integrate other applications like Zoho Desk. We need these webtabs in the mobile app as well. Otherwise our approach of using CRM as an entry point for our system does not work anymore. Update: It would
      • Zoho Books' 2025 Wrapped

        Before we turn the page to a new year, it’s time to revisit the updates that made financial management simpler and more intuitive. This annual roundup brings together the most impactful features and enhancements we delivered in 2025, offering a clear
      • Restrict Users access to login into CRM?

        I’m wanting my employees to be able to utilize the Zoho CRM Lookup field within Zoho Forms. For them to use lookup field in Zoho Forms it is my understanding that they need to be licensed for Forms and the CRM. However, I don’t want them to be able to
      • How do people handle using Outlook and Zoho Project calendar at the same time?

        We have an ongoing problem in our organisation where we use Zoho Projects to plan all of our projects tasks and that also allows us to look forward using the workload report to see which of our consultants are overstretched etc and which are available.
      • 3 year sick leave cycle

        How do you set up a sick leave cycle for South Africa? In SA the sick works like this for the first 6 months you get 0.83 paid sick days a month, then after 6 months you sick leave balance is reset to 30 days that can be used over a 36 month cycle.  This
      • WorkDrive and CRM not in sync

        1/ There is a CRM file upload field with WorkDrive file set as the source: 2/ Then the file is renamed in WorkDrive (outside CRM): 3/ The File in CRM is not synced after the change in WorkDrive; the file name (reference) in CRM record is not updated (here
      • Introducing Connected Records to bring business context to every aspect of your work in Zoho CRM for Everyone

        Hello Everyone, We are excited to unveil phase one of a powerful enhancement to CRM for Everyone - Connected Records, available only in CRM's Nextgen UI. With CRM for Everyone, businesses can onboard all customer-facing teams onto the CRM platform to
      • Is Zoho Communityspaces now part of Zoho One?

        Is Zoho Communityspaces now part of Zoho One?
      • How to update "Lead Status" to more than 100 records

        Hello Zoho CRM, How do I update "Lead Status" to more than 100 records at once? To give you a background, these leads were uploaded or Imported at once but the lead status record was incorrectly chosen. So since there was a way to quickly add records in the system no matter how many they are, we are also wondering if there is a quicker way to update these records to the correct "Lead Status". I hope our concern makes sense and that there will be a fix for it. All the best, Jonathan
      • Bigin’s 2025 Evolution: Highlights from 2025 and What’s Ahead in 2026

        Dear Biginners, Wishing you a very happy New Year! As we stand at the cusp of endless possibilities in 2026, we would like to take a moment to reflect on what we achieved together in 2025. Your continued support, thoughtful feedback, and kind words of
      • Automatically CC an address using Zoho CRM Email Templates

        Hi all - have searched but can't see a definitive answer. We have built multiple email templates in CRM. Every time we send this we want it to CC a particular address (the same address for every email sent) so that it populates the reply back into our
      • Send Supervisor Rule Emails Within Ticket Context in Zoho Desk

        Dear Zoho Desk Team, I hope this message finds you well. Currently, emails sent via Supervisor Rules in Zoho Desk are sent outside of the ticket context. As a result, if a client replies to such emails, their response creates a new ticket instead of appending
      • Zoho Desk - Change Time Zone for all users and set default for new user

        Hi,   Is there a way to set a default time zone so that when user creates an account via the Zoho Desk invitation, they don't need to select the time zone via the hundreds of choice?   And, for already created users, can we edit the incorrect time zone selected by the user at the account creation ?   Thanks ! Fred
      • Introducing WhatsApp integration in Bigin

        Greetings! In today's business landscape, messaging apps play a significant role in customer operations. Customers can engage with businesses, seek support, ask questions, receive personalized recommendations, read reviews, and even make purchases—all
      • Why is Zoho Meeting quality so poor?

        I've just moved from Office 365 to Zoho Workplace and have been generally really positive about the new platform -- nicely integrated, nice GUI, good and easy-to-understand control and customisation, and at a reasonable price. However, what is going on
      • Allow Manual Popup Canvas Size Control

        Hello Zoho PageSense Team, We hope you're doing well. We would like to request an enhancement to the PageSense popup editor regarding popup sizing. Current Limitation: Currently, the size (width and height) of a popup is strictly controlled by the selected
      • Why does Zoho’s diff viewer highlight parts of unchanged lines?

        Hi everyone, I’ve noticed something odd in the Zoho editor’s diff view. When I delete a single line, the diff doesn’t just mark that line as removed. Instead, it highlights parts of the next line as if they changed, even though they are identical. Example:
      • All new Address Field in Zoho CRM: maintain structured and accurate address inputs

        The address field will be available exclusively for IN DC users. We'll keep you updated on the DC-specific rollout soon. It's currently available for all new sign-ups and for existing Zoho CRM orgs which are in the Professional edition. Latest update
      • 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
      • Wrapping up 2025 on a high note: CRM Release Highlights of the year

        Dear Customers, 2025 was an eventful year for us at Zoho CRM. We’ve had releases of all sizes and impact, and we are excited to look back, break it down, and rediscover them with you! Before we rewind—we’d like to take a minute and sincerely thank you
      • Passing the CRM

        Hi, I am hoping someone can help. I have a zoho form that has a CRM lookup field. I was hoping to send this to my publicly to clients via a text message and the form then attaches the signed form back to the custom module. This work absolutely fine when
      • Where can we specify custom CSS in Zoho Forms custom theme ?

        I'm using a form with a dark theme. The OTP popup window is unreadable, because for some reason, the OTP popup background fixes color to white, but still takes the font color specified in the custom theme. This ends up as white on white for me, rendering
      • Automating Employee Birthday Notifications in Zoho Cliq

        Have you ever missed a birthday and felt like the office Grinch? Fear not, the Cliq Developer Platform has got your back! With Zoho Cliq's Schedulers, you can be the office party-cipant who never forgets a single cake, balloon, or awkward rendition of
      • Drop Down Value

        Hi, May I know why Zoho Flow treat this drop down as number and not as string. If so, how can I fetch the right value for filtering. This field is from Creator, in Creator upon checking by default it is a string since it's not a lookup field.
      • Create PO from an invoice

        We are a hardware and software sales company which receives orders over the internet. We drop ship most of our products from a warehouse outside of our company. Our orders get sync'd into Zoho from our store via onesaas as invoices. It would be great
      • SMS to customers from within Bigin

        Hi All, Is there anyone else crying out for Bigin SMS capability to send an SMS to customers directly from the Bigin interface? We have inbuilt telephony already with call recordings which works well. What's lacking is the ability to send and receive
      • Zoho Survey reminder settings are extremely confusing

        Hi, I just want to set 3 reminders, one week apart from the first email out. Your form is too confusing and I don't understand. Can you simplify and be more specific regarding the language used on the form ?
      • Add deluge function to shorten URLs

        Zoho Social contains a nice feature to shorten URLs using zurl.co. It would be really helpful to have similar functionality in a Deluge call please, either as an inbuilt function or a standard integration. My Creator app sends an email with a personalised
      • Add specific field value to URL

        Hi Everyone. I have the following code which is set to run from a subform when the user selects a value from a lookup field "Plant_Key" the URL opens a report but i want the report to be filtered on the matching field/value. so in the report there is
      • form data load issue when saving as duplicate record is made

        Hello. I have a form with a lookup when a value is selected the data from the corresponding record is filled into all of the fields in the form. But the form is loaded in such a state that if any value is changed it will take all of the values pre loaded
      • Next Page