Hello everyone!
Welcome back to another week of
Kaizen.
In this post, we explore the
Multi-Module Lookup (MML) field in the
Appointments module of Zoho CRM. You learn what an MML field is, how it works, and how to use it with
Zoho CRM APIs.
Table of Contents:
- What is a Multi-Module Lookup (MML) Field in Zoho CRM?
- Use Cases for MML
- How the "Appointment For" (MML) field in the "Appointments" module works?
- Creating a Record in the Appointments Module Using the Insert Records API
- Retrieving a Record from the Appointments Module Using the Get Records API
- Multi-module Lookup Using the COQL API
- Multi-module Lookup Using the Bulk Read API
- Frequently Asked Questions
What is a Multi-Module Lookup (MML) Field in Zoho CRM?
A Multi-Module Lookup (MML) field in Zoho CRM allows you to create a one-to-one relationship between a record in one module and a record from one of multiple other modules. Unlike a normal lookup field, which references a single module, an MML field can dynamically reference records from multiple modules.
Without the MML field, users must create multiple lookup fields for each module, which complicates the CRM layout and user experience.
Note:
- The multi-module lookup (multi_module_lookup) data type was introduced in Zoho CRM API version 3.
- Currently, the MML field is available as a system-defined field named Appointment For in the Appointments module.
- The Appointment For field supports lookups to both Contacts and custom modules.
- You cannot create a custom MML field in Zoho CRM.
Data Model Representation
MML's Data Model RepresentationUse Cases for MML
Zylker Healthcare is a multi-specialty hospital that uses Zoho CRM to maintain its appointment scheduling process.
In this setup, Zylker maintains two key modules:
- Contacts module - Stores records of physicians and surgeons, including attending physicians, specialists, and surgeons who diagnose and refer patients.
- Patients module - A custom module used to maintain records of all patients.
To improve the appointment booking process, Zylker uses the "Appointment For" Multi-Module Lookup (MML) field in the Appointments module. This field lets Zylker manage an appointment with either a Physician/Surgeon or a Patient, eliminating the need for multiple lookup fields.
How the "Appointment For" (MML) field in the "Appointments" module works?
- When creating an appointment, the user selects the "Appointment For" field.
- The field displays records based on the selected module, either the Contacts or Patients.
- The user selects the appropriate record (Contact or Patients) for the appointment.
- A related list is automatically created in the selected module (Contact or Patients) as the Open Activities / Closed Activities to display all appointments associated with that record.
Creating a Record in the Appointments module using the Insert Records API
Before creating a record in the Appointments module via the Insert Records API, make sure you know the API names of the system-defined mandatory fields. These fields are required to create an appointment successfully.
System-defined Mandatory Fields:
- Appointment_For (MML field)
- Service_Name
- Appointment_Start_Time
- Appointment_Name
- Member
- Location
The below image shows how these system-defined mandatory fields appear in the Appointments module UI:
System-defined mandatory keys in the Appointments Module in UI view.API calls you have to make before creating a record:
Before inserting a record into the Appointments module, it is important to know the API names of the fields and their parent modules.
Request URL : {api-domain}/crm/v8/settings/modules
Request Method : GET
Sample Response :
In the API response, search for the module with "module_name": "Appointments" and check the value of the "api_name" key to get the API name of the module. This is the name you will use in all related API calls.
ii. Use the
GET - Fields Metadata API and get fields metadata for the
Appointments module. Here, you can find the
API names of the mandatory fields along with other fields present in the Appointments module.
Below is the API call & response for the multi-module lookup field along with other mandatory fields.
Request URL : {api-domain}/crm/v8/settings/fields?module=Appointments__s
Request Method : GET
Sample Response :
Note: The above image highlights only the key properties of the Multi-Module Lookup (MML) field from the field metadata response. The complete API response contains additional properties not shown here.
In the response:
- The multi-module lookup field is identified by the key "data_type" with the value "multi_module_lookup".
- The associated modules supported by the MML field (e.g., Contacts, Patients) are listed under the "modules" key.
- Other mandatory fields like Service Name, Appointment Name, and Appointment Start Time can be identified by "system_mandatory": true.
The keys of the above multi_module_lookup JSON object are explained below:
"multi_module_lookup": { "display_label": "Appointments", // Display label of the module where the MML field is used "api_name": "Appointments__s", // API name of the Appointments module "modules": [ //List of modules associated with the Appointments module. { "api_name": "Contacts", //API name of the associated module "module_name": "Contacts", // Display Name of the module "id": "5725767000000002179" //Unique ID of the module }, { "api_name": "Patients", //API name of the associated custom module "module_name": "Patients", //Display label of the module "id": "5725767000006473007" //Unique module ID } } ] },
|
Note:
- You cannot add or remove modules from the Multi-Module Lookup (MML) field using APIs. These actions are only available through the Zoho CRM UI.
- Once a module is disassociated from the MML field, existing records associated with that module will remain in the Appointments module, and you will no longer be able to associate newly created records from the disassociated module using the MML field.
The remaining system-defined mandatory fields, along with their API names, are listed below.
System-defined Mandatory Field Names | System-defined Mandatory Field API Names |
Service Name | Service_Name |
Appointment Start Time | Appointment_Start_Time |
Appointment Name | Appointment_Name |
Member | Owner |
Location | Location
|
Note: The system-defined mandatory fields can be identified by "system_mandatory": true.
Search the system-defined mandatory field names and get their API names.
With the field API names, use the following request and sample input body to create a record in the Appointments module using the Insert Records API.
Request URL : {{api-domain}}/crm/v8/Appointments__s
Request Method : POST
Request Body :
{ "data": [ { "Appointment_Name": "General Consultation", "Owner": { "name": "Patricia Boyle", "id": "5725767000000411001", }, "Appointment_Start_Time": "2025-04-15T13:00:00-07:00", "Appointment_End_Time": "2025-04-15T13:30:00-07:00", "Appointment_For": { "module": { "api_name": "Contacts", "id": "5725767000000002179" }, "name": "John Doe", "id": "5725767000005607020" }, "Service_Name": { "name": "General Check-up", "id": "5725767000006387029" }, "Location": "Business Address" } ] }
|
Sample Response:
{ "data": [ { "code": "SUCCESS", "details": { "Modified_Time": "2025-05-06T20:33:42-07:00", "Modified_By": { "name": "Patricia Boyle", "id": "5725767000000411001" }, "Created_Time": "2025-05-06T20:33:42-07:00", "id": "5725767000006390001", //Unique ID if the newly created record. Please note that this record ID will be used in the following API get and update operations. "Created_By": { "name": "Patricia Boyle", "id": "5725767000000411001" } }, "message": "record added", "status": "success" } ] }
|
Note:
Only Contacts and custom modules are supported in the Multi-Module Lookup field. If you try to associate a new record with a module that has been removed from the MML field or an unsupported module in the MML field, the following error will be thrown.
Retrieving a Record from the Appointments Module Using the Get Records API
Request URL : {{api-domain}}/crm/v8/Appointments__s/5725767000006390001
Request Method: GET
Request Response:
{ "data": [ { "Owner": { "name": "Patricia Boyle", "id": "5725767000000411001", }, "$currency_symbol": "$", "Address": null, "Appointment_Start_Time": "2025-04-15T13:00:00-07:00", "Cancellation_Reason": null, "$field_states": null, "Appointment_For": { "module": { "api_name": "Contacts", "id": "5725767000000002179" }, "name": "John Doe", "id": "5725767000005607020" }, "Rescheduled_To": null, "$sharing_permission": "full_access", "Reschedule_Reason": null, "Additional_Information": null, "Last_Activity_Time": null, "Cancelled_Time": null, "Cancellation_Note": null, "Modified_By": { "name": "Patricia Boyle", "id": "5725767000000411001", }, "Reschedule_Count": 0, "Rescheduled_By": null, "id": "5725767000006390001", "Rescheduled_Time": null, "Remind_At": null, "Appointment_End_Time": "2025-04-15T13:30:00-07:00", "Status": "Overdue", "Modified_Time": "2025-05-06T20:04:38-07:00", "Service_Name": { "name": "General Check-up", "id": "5725767000006387029" }, "Created_Time": "2025-05-06T20:04:38-07:00", "testing": null, "Rescheduled_From": null, "Cancelled_By": null, "$editable": true, "Appointment_Name": "General Consultation", "Duration": 30, "Record_Status__s": "Available", "Created_By": { "name": "Patricia Boyle", "id": "5725767000000411001", }, "Tag": [], "Location": "Business Address", "Reschedule_Note": null } ] }
|
Request URL : {{api-domain}}/crm/v8/Appointments__s/5725767000006390001
Request Method: PUT
Request Body:
{ "data": [ { "Appointment_Start_Time": "2025-04-16T14:00:00-07:00", //Updating the Appointment_Start_Time "Appointment_End_Time": "2025-04-16T14:30:00-07:00", //Updating the Appointment_End_Time "Appointment_For": { "module": { "api_name": "Employees", //Updating a different module "id": "5725767000002161028" }, "name": "Patrica", //A record from the Employees module "id": "5725767000006272001" //unique ID of the record } } ] }
|
Multi-module Lookup Using the COQL API
Querying Inner Fields of Linked Modules within the MML Field
With the COQL API, you can query inner fields of linked modules within a Multi-Module Lookup (MML) field. This provides deeper insights into related fields data in a module. This query support is available from
Zoho CRM API Version 7.
Sample Query:
{ "select_query": "select 'Appointment_For->Contacts.Lead_Source' from Appointments__s where id is not null" }
|
The above query retrieves the
Lead Source field from the
Contacts module within the
Appointment_For MML field.
Sample Response:

Querying Multi-Module Lookup Module Name
Querying the module name associated with each record in a Multi-Module Lookup (MML) field. This query support is available from
Zoho CRM API Version 7.
Sample Query:
{ "select_query": "select Appointment_For.module.api_name, Appointment_For from Appointments__s where id is not null" }
|
The
Appointment_For.module.api_name returns the module name (e.g., Contacts or Accounts) for each record linked in the
Appointment_For MML field.
Sample Response:
Multi-module Lookup Using the Bulk Read API
Bulk Read API allows you to fetch a large set of data i.e., you can fetch a maximum of 2,00,000 records in a single API call.
Specify the API name of the Appointments module in the module JSON object when making API calls. Refer to the following section for an example.
Request Method : POST
Request Body :
{ "callback": { "method": "post" }, "query": { "module": { "api_name": "Appointments__s" //API name of the Appointments module }, "file_type": "csv" } }
|
Note: The Appointment_For field cannot be used in the criteria.
As the API is an asynchronous API, the response will not be available instantly; the bulk read job is scheduled, and the status can be checked. Once the job is completed, you will be notified in the callback URL. The records are available in a downloadable CSV file or ICS file (for events). See the
Bulk Read API document to know how to view the status of the scheduled job and download the file, along with more sample requests and responses.
Sample Exported Response
Frequently Asked Questions
1. Which modules are currently supported in the MML field?
Only Contacts and custom modules can be associated with an MML field.
2. What error is thrown if I try to associate a record with a removed or unsupported module in the MML field?
If you try to associate a record with a removed or unsupported module in an MML field, the system will throw an "INVALID_DATA" error.
3. Is the MML field available for all modules?
No, as of
Zoho CRM API Version 8, the MML field is available only as a system-defined field in the
Appointments module.
4. How do I get the list of modules associated with an MML field?
You can use the
GET - Fields Metadata API for the
Appointments module and look for the field with
"data_type" : "multi_module_lookup" and check its
"modules" JSON array.
5. Can I add or remove modules from a Multi-Module Lookup (MML) field via API?
Adding or removing modules in an MML field is not supported via API. These actions can only be done through the Zoho CRM UI.
6. What happens if I remove a module from an MML field?
If a module is removed from the MML through Zoho CRM UI, it can no longer be associated with new records, but existing records linked to that module will remain unaffected.
7. Is MML field supported in the Bulk Write API?
As of
Zoho CRM API Version 8, the MML field is available only in the Appointments module as a system-defined field. The Appointments module is not supported in the Bulk Write API.
8. Is MML field supported in the Search API?
The MML field is not currently supported in the Search API.
We trust that this post meets your needs and is helpful. Let us know your thoughts in the comment section or reach out to us at
support@zohocrm.com
Stay tuned for more insights in our upcoming Kaizen posts!
Cheers!!!
Related Readings:
Recent Topics
Unified task view
Possible to enable the unified task view in Trident, that is currently available in Mail?
Bigin, more powerful than ever on iOS 26, iPadOS 26, macOS Tahoe, and watchOS 26.
Hot on the heels of Apple’s latest OS updates, we’ve rolled out several enhancements and features designed to help you get the most from your Apple devices. Enjoy a refined user experience with smoother navigation and a more content-focused Liquid Glass
Importing data into Assets
So we have a module in Zoho CRM called customers equipments. It links to customers modules, accounts (if needed) and products. I made a sample export and created extra fields in zoho fsm assets module. The import fails. Could not find a matching parent
Allow instruction field in Job Sheets
Hello, I would like to know if it is possible to have an instruction field (multi line text) in a job sheet or if there is a workaround to be able to do it. Currently we are pretty limited in terms of fields in job sheets which makes it a bit of a struggle
Streamlining Work Order Automation with Zoho Projects, Writer & WorkDrive
Hello Community, Here is the first post in 'Integration & Automation' Series. Use Case :: Create, Merge, Sign & Store Documents in Zoho WorkDrive. Scenario :: You have a standard Work Order template created in Zoho Writer. When a task status is chosen
The dimensions of multilingual power
Hola, saludos de Zoho Desk. Bonjour, salutations de Zoho Desk. Hallo, Grüße von Zoho Desk. Ciao, saluti da Zoho Desk. Olá, saudações da Zoho Desk. வணக்கம், Zoho Desk இலிருந்து வாழ்த்துகள். 你好,来自 Zoho Desk 的问候。 مرحباً، تحيات من Zoho Desk. नमस्ते, Zoho
Multi-line address lines
How can I enter and migrate the following 123 state street Suite 2 Into a contact address. For Salesforce imports, a CR between the information works. The ZOHO migration tool just ignores it. Plus, I can't seem to even enter it on the standard entry screen.
Accessing Zoho Forms
Hi all, We're having trouble giving me access to our company's Zoho Forms account. I can log in to a Forms account that I can see was set up a year ago, but can't see any shared forms. I can log into Zoho CRM and see our company information there without
Cost of good field
Is there a way we can have cost of good sold as a field added to the back end of the invoicing procedure and available in reports?
How to add image to items list in Invoice or Estimate?
Hello! I have just started using Zoho Invoice to create estimates and, possibly to switch from our current CRM/ERP Vendor to Zoho. I have a small company that is installing CCTV systems and Alarm systems. My question is, can I add images of my "items" to item list in Zoho Invoice and Estimates and their description? I would like to show my clients the image of items in our estimates so they can decide if they like these items. And I tell you, often they choose more expensive products just because
Issue with the Permission to Zoho Form
I am getting an error by signing in to zoho form as it is stated that i don't have permission to access this is admin account
CRM templates
Hello everyone, In my company we use Zoho campaigns where we set up all newsletters and we use Zoho CRM for transactional emails. I have created some templates in Zoho campaigns but from my understanding i cannot use those in Zoho CRM, right?
Pending Sales Order Reports
Pending sale order report is available for any single customer, Individual report is available after 3-4 clicks but consolidated list is needed to know the status each item. please help me.
Zoho Mail SMTP IP addresses
We are using Zoho Mail and needs to whitelist IP for some redirections from your service to another e-mails. You can provide IP address list for Zohomail SMTP servers?
Trying to Add Tasks to Other Users Is Utterly Baffling
As the title says, the process of trying to create a task for someone in my team is so unintuitive and illogical that I have given up trying to do it. This is a feature that I pay for but it is so poorly devised and implemented that my team has given
Zoho Campaigns - Why do contacts have owners?
When searching for contacts in Zoho Campaigns I am sometimes caught out when I don't select the filter option "Inactive users". So it appears that I have some contacts missing, until I realise that I need to select that option. Campaigns Support have
email forwarding not working
Your email forwarding service does not work. I received the confirmation email and completed the confirmation, after that nothing and nothing since no matter what I have tried. Shame as everything else was smooth. I spose it's harder to run one of these web based internet mail services than you guys thought!!! can you fix the email forwarding asap PLEASE!
Google Ads Conversions Not Being Tracked in Zoho CRM
We have 3 different conversions created in our Google Ads Account. Only one of the 3 conversion types is tracking in Zoho CRM. Our forms are Elementor Forms that are mapped into Zoho CRM. It apprears to me that all leads are showing up in Zoho CRM, but
Enable Locations for Expense
Hi, please enable Locations (ex Branches) for Zoho Expense so that there is consistency between this app and Zoho Books. Thanks in advance.
无法发送消息;原因:5545.1.8电子邮件传出被阻止。
求帮助,我的邮箱无法发送邮件,请尽快修复。 我们只是用来做正常的资料寄送,如果贵公司再无理封锁我们的邮箱,我们会改用其他公司的服务。 请尽快解封,ID: 815556404
in the Zoho Creator i have File Upload field get the file on submission of the form Get the File and upload to Zoho Books
in the Zoho Creator i have File Upload field get the file on submission of the form Get the File and upload to Zoho Books . how I get the file From zoho creator and upload to Zoho Books . using Api response = invokeUrl [ url: "https://www.zohoapis.com/creator/v2.1/data/hh/l130/report/All_Customer_Payments/"+input.ID
Generate a link for Zoho Sign we can copy and use in a separate email
Please consider adding functionality that would all a user to copy a reminder link so that we can include it in a personalized email instead of sending a Zoho reminder. Or, allow us to customize the reminder email. Use Case: We have clients we need to
Rate Limiting in Zoho Flow (OpenAI API)
Hi Everyone, We are facing some issues when using Zoho Flow as we have a deluge script running which is making external calls to OpenAI endpoint. Sometimes the response takes more than 30 seconds meaning the script will timeout. We want to implement a
Placing a condition before converting the LEAD
Hi, I need some assistance with Lead conversion. I need to place certain conditions before allowing the user to convert the lead. For example: up until the certain status's doesn't equal "green" don't allow to convert lead. I tried creating this using
it is possible to open a widget via deluge script function
I have one function that is workflow action I call my fucntion I need to call the internal widget it is possible to open or it have to please tell me the solution
Creator - Portal Custom Domain
I will pay $100 in crypto to anyone who can actually get my Creator Custom Domain to function (actually tell me how you got yours to). Domain verifies, Nothing. I've been fighting it a week, multiple chats to customer service. Clearly I'm doing something wrong. Some datapoints Domain name itself unimportant, can be a string of numbers. I need to know what registrars are working for you because GoDaddy does NOT. Do I need hosting? I've tried both ways and nothing works. I pushed through Cloudflare
steps and options to change Domain DNS/Nameservers settings
Please share the options or steps to change Domain DNS/Nameservers settings
Employees in Leave Policy exceptions
In the Leave Policies we should be able to add specific employees to the exception list So it will be like All Employees except A,B,C in the exception list, currently we can only add departments etc
How get stock name from other column ?
How get stock name from other column ? e.g. =STOCK(C12;"price") where C12 is the code of the stock
Adding a developer for editing the client application with a single user license
Hi, I want to know that I as a developer I developed one application and handed over to the customer who is using the application on a single user license. Now after6 months customer came back to me and needs some changes in the application. Can a customer
Download an email template in html code
Hello everyone, I have created an email template and I want to download it as html. How can i do that? I know you can do it via the campaigns-first create a campaign add the template and download it as html from there. But what if i don't want to create
Attachment is not included in e-mails sent through Wordpress
I have a Wordpress site with Zeptomail Wordpress plugin installed and configured. E-mails are sent ok through Zeptomail but without the included attachment (.pdf file) Zeptomail is used to send tickets to customers through Zeptomail. E-Mails are generated
Upcoming Changes to the Timesheet Module
The Timesheet module will undergo a significant change in the upcoming weeks. To start with, we will be renaming Timesheet module to Time Logs. This update will go live early next week. Significance of this change This change will facilitate our next
Best way to schedule bill payments to vendors
I've integrated Forte so that I can convert POs to bills and make payments to my vendors all through Books. Is there a way to schedule the bill payments as some of my vendors are net 30, net 60 and even net 90 days. If I can't get this to work, I'll have
Cant update image field after uploading image to ZFS
Hello i recently made an application in zoho creator for customer service where customers could upload their complaints every field has been mapped from creator into crm and works fine except for the image upload field i have tried every method to make
Billing Management: #4 Negate Risk Free with Advances
In the last post, we explored how unbilled charges accumulate before being invoiced. But what happens when businesses need money before service begins? Picture this: A construction company takes on a $500,000 commercial building project expected to last
Is there an equivalent to the radius search in RECRUIT available in the CRM
We have a need to find all Leads and/or Contacts within a given radius of a given location (most likely postcode) but also possibly an address. I was wondering whether anyone has found a way to achieve this in the CRM much as the radius search in RECRUIT
Zoho CRM Inventory Management
What’s the difference between Zoho CRM’s inventory management features and Zoho Inventory? When is it better to use each one?
Cannot Enable Picklist Field Dependency in Products or Custom Modules – Real Estate Setup
Hello Zoho Support, I am configuring Zoho CRM for real estate property management and need picklist field dependency: What I’ve tried: I started by customizing the Products module (Setup > Modules & Fields) to create “Property Type” (Housing, Land, Commercial)
Get Workflow Metadata via API
Is there a way to get metadata on workflows and/or custom functions via API? I would like to automatically pull this information. I couldn't find it in the documentations, but I'm curious if there is an undocumented endpoint that could do this. Moderation
Next Page