Event Management System using ZDK CLI

Event Management System using ZDK CLI



Hello Everyone,

Welcome back to yet another post in the Kaizen Series!

As you already may know, for the Kaizen #200 milestone, we asked for your feedback and many of you suggested topics for us to discuss. We have been writing on these topics over the past few weeks. One of the feedbacks asked us to cover "more on ZDK CLI". In this post, we will discuss building an Event Management System in Zoho CRM Using ZDK CLI.

Consider the case of Zenith, a Zoho CRM partner who is also partner for Zoho's competing products. Zenith is hosting a conference in which their representatives are inviting speakers from Zoho and also other competing products. The attendees of the conference will be either external attendees or leads or contacts of Zenith. For this purpose existing meetings module of Zoho CRM (previously called Events) can not be used as it is not a good fit for this case. Custom modules and fields are required for this. In this post, we’ll discuss how to create a Event Management System that is complimentary to Zoho CRM using ZDK CLI

Why Use ZDK CLI?
ZDK CLI allows developers to:
  1. Create and edit CRM metadata (modules, fields, roles, profiles, and widgets)
  2. Define relationships between modules (lookups, multi-select lookups)
  3. Push and sync metadata changes to sandbox.
  4. Resolve conflicts when multiple users work on the same metadata.

This makes it ideal for building reusable CRM systems such as event management.

Initial Setup

As the initial setup, initialize the ZDK CLI project directory using zdk init command and create a new ZDK Project folder "Zenith". 

     zdk init




Then, login to the sandbox environment for Zenith using zdk auth:login command. 

     zdk auth:login


When you execute zdk auth:login, you can either select any org that is already signed in or select NEW LOGIN to visit the login page and select the sandbox org you will be working on.




After logging in to Zoho select the sandbox environment and give required permissions.
Notes
For the current beta release, ZDK CLI is exclusively available for Sandbox environment and is not operational in Production environments. 



You will be redirected to the terminal after successful login and you can start working on ZDK CLI.



Notes
Change the api_version to 8 in zdk-project.json file.

Step 1: Define the Modules

For an event management use case, we will need the following custom modules:
  1. Conference – Stores details of each event.
  2. Attendees – Tracks participants, whether leads, contacts, or external.
  3. ConferenceAttendees (Linking Module, not created) – Connects conferences and attendees with registration status.
  4. Venues – Captures details of event locations.
  5. Speakers – Stores details of invited speakers.

This has been visualized in the data model below.


To create a module, use the command

     zdk meta:create modules




This creates the json file for module metadata : Conference.modules-meta.json  in the path Zenith/crm/meta/modules/Conference 

Conference.modules-meta.json content

{
    "singular_label": "Conference",
    "plural_label": "Conferences",
    "api_name": "Conference",
    "profiles": [
        {
            "api_name": "Administrator"
        }
    ],
    "display_field": {
        "api_name": "Conferences"
    },
    "show_as_tab": true
}

Similarly create modules Attendees , Venues, and Speakers modules

Step 2: Customize Fields

To create a field, use the command

     zdk meta:create fields

Conference module:

Conference modules's fields are:

  1. Attendees (multiselectlookup to Attendee module) 
  2. Speakers (multiselectlookup to Speakers module) 
  3. Venue (lookup to Venue module) 
  4. Date (datetime) 
  5. Duration(double) 
  6. Description (textarea) 
  7. Status (picklist: Planned, Ongoing, Completed)


Attendees field
Let us check how to create the field attendees of type multi-select lookup (to Attendee module)




The json file Attendees.fields-meta.json created in the path Zenith/crm/meta/modules/Conference/fields will look like this


To provide dependent details for the multi select lookup, add the multiselectlookup json object to the Attendees.fields-meta.json file as below:

{
    "field_label": "Attendees",
    "display_name": "Attendees",
    "api_name": "Attendees",
    "type": "used",
    "data_type": "multiselectlookup",
    "multiselectlookup": {
        "connected_details": {
            "module": {
                "api_name": "Attendee"
            },
            "field": {
                "field_label": "AttendingConference"
            }
        },
        "linking_details": {
            "module": {
                "plural_label": "Conferences_X_attendees"
            }
        }
 }
}

Speakers (multi-select lookup to Speakers module)
Similar to Attendees field, create Speakers field and modify the json file Speaker.fields-meta.json created in the path Zenith/crm/meta/modules/Conference/fields:

{
    "field_label": "Speaker",
    "display_name": "Speakers",
    "api_name": "Speakers",
    "type": "used",
    "data_type": "multiselectlookup",
    "multiselectlookup": {
        "connected_details": {
            "module": {
                "api_name": "Speaker"
            },
            "field": {
                "field_label": "AttendingConference"
            }
        },
        "linking_details": {
            "module": {
                "plural_label": "Speakers_X_attendees"
            }
        }
 }
}

Venue (lookup field to Venue module)
Similarly, create the Venue field with type as "lookup" The json file Venue.fields-meta.json created in the path Zenith/crm/meta/modules/Conference/fields will look like this


To provide dependent details for the lookup, add the lookup json object to the json as below.
{
    "field_label": "Venue",
    "display_name": "Venue",
    "api_name": "Venue",
    "type": "used",
    "data_type": "lookup"
    "lookup": {
        "display_label": "Venue",
        "api_name": "Venue",
        "module": {
          "api_name": "Venue"
        }
      }
}

Description (textarea)
After create a textarea field Description using zdk meta:create fields command, add textarea json object to the field meta json file as below :

{
        "field_label": "Description",
                "display_name": "Description",
                "api_name": "Description",
                "type": "used",
                "data_type": "textarea",
                "textarea": {
                        "type": "rich_text"
                }
}

The possible values for text area are small, large and rich_text.

Status (picklist)
After create a picklist field Status using zdk meta:create fields command, a
dd pick_list_values json array to the field meta json file as below:

{
    "field_label": "Status",
    "display_name": "Status",
    "api_name": "Status",
    "type": "used",
    "data_type": "picklist",
  "pick_list_values": [
    {
      "display_value": "Planned",
      "actual_value": "Planned"
    },
    {
      "display_value": "Ongoing",
      "actual_value": "Ongoing"
    },
    {
      "display_value": "Completed",
      "actual_value": "Completed"
    }
  ]
}

Date and duration fields of type datetime and double does not require any edits to the created meta.json file.




Attendees Module

Similarly, add fields for attendees modules
  1. Phone (phone)
  2. Company (text)
  3. EventsAttended (multi-select lookup to Conference module)
  4. Attendee Type (picklist with options Lead, Contact, External)
  5. Leads (lookup to Lead module)
  6. Contacts (lookup to Contact module

Venue Module

  1. Location (text)
  2. Capacity (integer)
  3. Contact erson (text)
  4. ContactNumber(phone)
  5. Description(textarea)

Speakers Module
  1. Phone (phone)
  2. Company (text)
  3. SpeakerStatus (picklist with options Confirmed, Pending, Canceled)

Step 3: Create a Custom Role


To create a field, use the command

     zdk meta:create roles


This ensures event managers have the right access without interfering with other CRM operations.

Pushing changes to the sandbox environment

Once all changes are done execute zdk org:push and zdk org:push result --{jobId} command to deploy the changes to the sandbox environment. Once the changes are verified in your sandbox environment you can deploy it to the production environment.




You can extract this metadata zip file, that is created using zdk org:export command to your own ZDK project directory and try pushing the changes to your sandbox environment.

Building the Event Management System for "Zenith" illustrates the core strength of ZDK CLI. It brings software engineering best practices to Zoho CRM customization. By defining modules/fields/roles as json files directly or creating them using the command, the source truth of the metadata is available in local system. The same can be tracked via version control systems like GIT for better collaboration among the team.
    • Sticky Posts

    • Kaizen #198: Using Client Script for Custom Validation in Blueprint

      Nearing 200th Kaizen Post – 1 More to the Big Two-Oh-Oh! Do you have any questions, suggestions, or topics you would like us to cover in future posts? Your insights and suggestions help us shape future content and make this series better for everyone.
    • Kaizen #226: Using ZRC in Client Script

      Hello everyone! Welcome to another week of Kaizen. In today's post, lets see what is ZRC (Zoho Request Client) and how we can use ZRC methods in Client Script to get inputs from a Salesperson and update the Lead status with a single button click. In this
    • 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
    • Recent Topics

    • Automating Vendor Contract Management between Zoho Contracts and Zoho Books using Zoho Flow

      Managing vendor agreements across procurement and finance systems often requires manually downloading executed contracts and attaching them to vendor records. This can become time-consuming and difficult to manage when dealing with a large number of contracts.
    • Is it possible to use HTML formatting in SMS messages sent from Zoho?

      Hi everyone, I have a question regarding sending SMS from Zoho When we send emails from Zoho, we can include HTML code to format the message (like adding links, styling, etc.). Is it possible to do something similar when sending SMS messages through Zoho
    • Problem applying batch operation error keeps looping that error

      Problem applying batch operation error keeps looping that error an wont login
    • Ability to Use Both AND and OR When Creating Rules (Advanced Conditions)

      I'd like to be able to use more complicated logic when setting up rules. E.g. in Zoho Mail, I can choose "Advanced conditions (AND/OR) to create a rule that can be applied to multiple subject lines from the same sender. But in Zoho TeamInbox, I will have
    • Shared Email Sending Duplicate Copies of Emails

      Hi there, We recently have moved our info@ email to Team Inbox to trial. We set this channel up using the Microsoft setup which works fine and have 3 users. I am wanting to know: 1. When I send a new email, it will create a copy of that email and send
    • merhaba

      merhaba sosyal medya paketimiz mevcut ama yorumları göremiyoruz ve o yüzden cevap veremiyoruz destek rica ediyoruz.
    • Teaminbox not working

      We couldn't send or receive any mail within the team inbox. Displaying error 'Unable to process this request.'
    • Related lists New option in missing

      hi I have created quite a few modules and added as related lists to my main module. Some have new, some dont I can not see why?
    • Detailed list of scoring rules in Zoho CRM

      Good morning Zoho community, warm greetings The reason for my message today is that I have a problem with my CRM, which I will explain below: Our organization has scoring rules designed to rate our potential customers or leads in the application based
    • Cliq and ToDo integrations?

      I'm a bit surprised not to find any way to open a Cliq chat for the current thread, or to create a Zoho Mail ToDo from a thread. Are these on the roadmap?
    • Reply-to names are mangled

      Hello, I'm seeing an odd behavior in replies. Steps to reproduce: 1. Click reply to an email from "John Doe <doe.john@example.com> in TeamInbox Expected outcome: TO field pre-filled with "John Doe <doe.john@example.com>" Actual outcome: TO field pre-filled
    • I CANT UPGRADE MY FREE ACCOUNT

      I TRY TO UPGRADE MY FREE ACCOUNT AND I COULD NOT UPGRADE IT CAN SOMEBODY TELL ME WHY? AND I HAVE THE MONEY SO.
    • Why does the Address field show the wrong map location even with a correct Pincode?

      I am noticing an issue with the Address field map in Zoho Creator. When I enter a city name that exists in multiple locations within the same state, the map sometimes points to the wrong area even if I have entered the correct Pincode. Currently, it seems
    • Level up your ASO game with tags & categories in store reviews

      Introducing tags and categories in Apptics' store reviews Dear Apptics community, If your app is listed on the Play Store or App Store, you already know how important store reviews and ratings are. They’re one of the most direct signals of user sentiment
    • Including attachments with estimates

      How can attachments be included when an estimate is sent/emailed and when downloaded as a .pdf? Generally speaking, attachments should be included as part of an estimate package. Ultimately, this is also true for work orders and invoices.
    • Adding VENDOR SKU to PURCHASE ORDERS

      how can we add the Vendor SKU when issuing a Purchase Order , so the PO shows the Supplier SKU and our own Internal SKU , which is what we want to receive into the system .
    • Possible to freely prompt/query CRM data using Zia?

      Is it possible to prompt Zia to query on any information stored in the CRM, especially on the data stored in custom text fields? My use case is the people in my organisation have entered lots of text in custom text fields to capture information from an
    • Restrict employees to take only one day holiday from a multi-day festival holiday

      Hi everyone, I have a requirement related to Optional/Festival Holidays in Zoho People. For example, in the month of May there are three optional holiday dates: May 11, May 12, and May 13. Employees can choose one of these days as their optional holiday.
    • Cannot modify colours in invoice email template

      I have tried switching browsers... but I cannot change the (pretty horrible) default colours in the preset email when sending an invoice... the blue banner, red outstanding total and the bright green button... I can change other things but not the colours?
    • Cannot find zpuid for Zoho Projects user

      I'm using the Zoho Projects v3 API to create a task. The task is created successfully, but in order to assign the task owner, the "Create a Task" API also requires the zpuid of the task owner. Unfortunately I cannot find any user-related API calls that
    • Print a document from Zoho Writer via Zoho Creator

      If i use the code below i can get writer to create a new document or email it to me but i want to be able to print it directly from the browser and not have to send it via email and then print. Below is the code im using. Attached options form zoho writer
    • Allow styling for specific Subform fields in Zoho Creator

      Sometimes in forms we need to visually highlight a specific field inside a Subform (for example Sanctioned Amount, Approved Value, Critical Fields, etc.) so that users immediately notice it while entering data. Currently there is no direct UI option to
    • Career site URL - Suggestion to modify URL of non-english job posting

      Hi, I would like to suggest making a few modification to career sites that are not in english. Currently, the URL are a mix of different languages and are very long. It makes for very unprofessional looking URLs... Here is an example of one of our URL
    • 3/18 オンライン勉強会のお知らせ Zoho ワークアウト (無料)

      ユーザーの皆さま、こんにちは。コミュニティチームの中野です。 3月開催のZoho ワークアウトの開催が決定しましたのでご案内します。 今回はZoomにて、オンライン開催します。 ▶︎参加登録はこちら(無料) https://us02web.zoom.us/meeting/register/BoNTN7zYR8OvOPGShqBY0A ━━━━━━━━━━━━━━━━━━━━━━━━ Zoho ワークアウトとは? Zoho ユーザー同士で交流しながら、サービスに関する疑問や不明点の解消を目指すイベントです。
    • New 2026 Application Themes

      Love the new themes - shame you can't get a little more granular with the colours, ie 3 different colours so one for the dropdown menu background. Also, I did have our logo above the application name but it appears you can't change logo placement position
    • Placeholder format in Number field does not reflect Max Digits configuration

      When the Max Digits (Maximum digits of number) property is set to a smaller value (for example, 2 digits), the placeholder in the input field still displays a 7-digit format (#######). The same behavior can also be observed in Decimal and Currency field
    • How does SKU work when selling products in parts in Zoho Inventory

      Hello everyone, Zoho Inventory does not understand the physical cutting of the piece.. It only tracks quantities of the unit (like feet ). So when you sell part of an item, the system simply reduces quantity for that SKU. Assume that i have a 50 ft long
    • Ability to Attach Record-Specific Files Automatically in Workflow Email Templates

      Currently in Zoho CRM, email templates allow attachments to be added, but these attachments are static and remain the same for every recipient. There is no straightforward option to automatically attach a file that is stored within the specific CRM record
    • CRM Cadences - working timesThe Friday afternoon? The next Monday morning? Not at all?

      I think I’m writing saying that cadence emails are only sent during the organisations set working hours in CRM. So if a particular email is set to send for example in three days and that lands on a Sunday (when working hours are not operational) when
    • CRM Cadences - working times

      I think I’m right in saying that cadence emails are only sent during the organisations set working hours in CRM. So if a particular email is set to send for example in three days and that lands on a Sunday (when working hours are not operational) when
    • Push Notification for New Bookings in Zoho Bookings App

      when a someone schedules an appointment through the booking page, is there any option to receive a push notification in the mobile app?
    • Trying to access records in a custom module in Zoho Desk and not having luck

      I've built a custom module in Zoho Desk and am using a custom function to query the records in the module and I'm not having any luck. The only way I have found to retreive a record is by getting it by its recordID (the long zoho assigned one). The function
    • Intergrating multi location Square account with Zoho Books

      Hi, I have one Square account but has multiple locations. I would like to integrate that account and show aggregated sales in zoho books. How can I do that? thanks.
    • Add the same FROM email to multiple department

      Hi, We have several agents who work with multiple departments and we'd like to be able to select their names on the FROM field (sender), but apparently it's not possible to add a FROM address to multiple departments. Is there any way around this? Thanks.
    • Zoho Desk View Open Tickets and Open Shared Tickets

      Hi, I would like to create a custom view so that an agent can view all the open tickets he has access to, including the shared tickets created by a different department. Currently my team has to swich between two views (Open Tickets and Shared Open Tickets).
    • Sharing Tickets to a team within a department

      Hi there, We have a need for one department to be able to share tickets to a specific team within a department, I'm wondering if this is possible? All the shared tickets are going into the 'Shared Tickets' view for the whole department but is there a
    • Clone Banking Transaction

      Why is there no option to CLONE a Transaction in the Banking module?? I often clone Expenses (for similar expense transactions each month) so I would also like to clone Income transactions. But there is no option in Banking to clone an existing Income
    • Organization wide Account and Contacts Visibility/Sharing Capabilities?

      Has anyone figured out a way to make visibility or sharing of Accounts and Contacts to be available across the entire organization without having to have every individual user edit their Sharing permissions? For our sales folks they need to be able to
    • Zoho Expense - Bi-Weekly Report Automation

      Hi Zoho Expense Team, My feature request is to please include an option to automate creation of reports bi-weekly (every 2 weeks)
    • Application Architecture in Zoho Creator: Why You Should Think About It from the Start

      Many companies begin using Zoho Creator by building simple forms to automate internal processes. This is natural — the platform is extremely accessible and allows applications to be built very quickly. The challenge begins to appear when the application
    • Next Page