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
Different form submission results for submitter and internal users
I'm looking for suggestions on how to show an external submitter a few results while sending internal users all the results from the answers provided by the external user. The final page of our form has a section with detailed results and a section with
Help Desk Services Solution
I am here looking for Help Desk services solution for organization. I also searched this on many different website and found many solutions. We are bit confused to which one to choose. One of my friend suggest me this platform, and i am hoping i will
Facing Issues with Sites Mobile font sizes
my page renediaz.com is facing issues mobile view, when i try to lower font sizes in home page, instead of changing the size, it changes the line space
Remove 'This is an automated mail from Zoho Sign' in footer
Hi there, Is it possible to remove or change the text under the e-mail templates? I can't figure out how to do that: Would love to hear from you. Kind regards, Tristan
Formatting and slow
Creating campaigns are difficult. I'm fairly computer literate but some of the way Zoho Campaigns formatting works is painful. Images fail to upload or are very slow. To top it off, syncing the contacts is a pain as well as temperamental links to create Segments. At this rate I'm afraid we might need to migrate back to Mailchimp.
Default Ticket View - Table?
Guys, We mostly use the table view to queue tickets. Maybe I am missing it - but how can I set that view as 'default" for all our agents? Thanks JV
Boost your Zoho Desk's performance by archiving tickets!
The longer your help desk operations are, the more likely it is to accumulate tickets that are no longer relevant. For example, ticket records from a year ago are typically less relevant than currently open tickets. Such old tickets may eventually lead
Paste emails to create segment
We are moving over from Mailchimp to ZOHO. However Mailchimp allows me to create a segment by pasting in emails from excel (or importing a .csv) can I do the same in Mailchimp?
COQL API in JS Widget only pulling 200 records
Hello! We've been building a custom homepage widget using the Zoho JS SDK, and it seems that this https://help.zwidgets.com/help/latest/ZOHO.CRM.API.html#.coql only allows 200 records. I thought the limit was 2000 for COQL queries, but am I mistaken?
Getting the Record ID of a form once it is submitted - so that form can be edited later
In Zoho Forms, where can I access the record ID of a form once the form is submitted? - Record ID is not available in webhook payloads - It is not available to form fields, including in formulas - It is not available as a parameter in a thankyou page
Auto-Generate Line Numbers in Item Table Using HTML & CSS Counters (Zoho Books & Zoho Inventory Custom Templates)
<div> <style> /* Start counter from 0 inside tbody */ tbody#lineitem { counter-reset: rowNumber; } /* Increment counter for each row */ tbody#lineitem tr { counter-increment: rowNumber; } /* Show counter value in first column */ tbody#lineitem tr td:first-child::before
Possible to define default font and size in Zoho Campaigns?
Is it possible to define a default font (font, size and colour) for the text, H1 and H2 in Zoho Campaigns? For example: In a campaign, I add a text block, and the text is automatically century gothic, size 11, grey (6f6f6e) by default? Thank you!
Zoho Sites - General Feedback
Hi Everyone-- Quick question for discussion: is it me or is working with Zoho Sites like entering the Twilight Zone? I've built many sites over the years, but this platform seems impossible. I've spent an entire day and a half trying to get a simple one-color
File Upload field not showing in workflow
Hi, I have added a field on Zoho CRM. I want to use it in a workflow where that particular field is updated based on another field, however it is not showing up in the field list to select it in the workflow. Why is this please?
You cannot send this email campaign as it doesn't have any eligible contacts in the selected mailing list. You can try adding contacts or choose other mailing lists.
please help
Strengthening the capabilities of CommandCenter in Zoho CRM Plus
When you look at the prospect-to-customer journey in most businesses 10 to 15 years ago, it was relatively straightforward. Many of us remember walking into a store, sharing our requirements with a sales associate, reviewing a few options, and making
World date & time format
Hello, Is there a timeline to get the worldwide used date and time format ? I mean not the american one... I mean day month year, and 24 hours clock. Regards
How can Data Enrichment be automatically triggered when a new Lead is created in Zoho CRM?
Hi, I have a pipeline where a Lead is created automatically through the Zoho API and I've been trying to look for a way to automatically apply Data Enrichment on this created lead. 1) I did not find any way to do this through the Zoho API; it seems like
Announcing Kiosk 1.1 - Customize screen titles, configure new fields & actions, use values from your Kiosk to update fields, and more.
Hello all We are back again with more enhancements to Kiosk. So what's new? Enhancements made to the Components Add titles for your Kiosk screens and adjust its width to suit your viewing preferences. Three new fields can be added to your screen: Percentage,
Any recommendations for Australian Telephony Integration providers?
HI, I am looking for some advice on phone providers as we are looking to upgrade our phone system, does anybody have experience with any of the Australian providers that integrate with CRM Telephony? So far we are looking at RingCentral and Amazon Connect, and would love to hear feedback on any of the other providers you might have tried. Thank you
CRM Cadences recognise auto-responses
I have leads in a Cadence. I get an auto-responder reply "I'm out of the office..." Normally Cadences seems to know that isn't a real reply and keeps the lead enrolled in the cadence. However, today, Cadences has UNENROLLED a Lead who sent an auto-reponse
Zoho Campaigns Workspaces
Hi, I’m currently working on a Zoho CRM + Zoho Campaigns setup for a franchisee-based organization, where each franchise must only see and use its own contacts. At the moment, franchisees cannot properly access their contact lists in Zoho Campaigns unless
Limited System because of Limited Number of Fields for Car Dealership
Dear Zoho Support, we want to have all the information about a car inside of a car record. We want to have Zoho CRM as our single source of truth for our data, but the limited number of fields are not allowing that. The data consist of: technical data
Automatically Update Form Attachment Service with Newly added Fields
Hi, When I have a Form Setup and connected to a 3rd Party Service such as OneDrive for Form Attachments, when I later add a new Upload Field I have to remove and redo the entire 3rd Party Setup from scratch. This needs to be improved, such as when new
Zoho CRM for Everyone's NextGen UI Gets an Upgrade
Hello Everyone We've made improvements to Zoho CRM for Everyone's Nextgen UI. These changes are the result of valuable feedback from you where we’ve focused on improving usability, providing wider screen space, and making navigation smoother so everything
Newsletter in multiple languages
Hi We are planning on starting to use Zoho Campaigns for our newsletters. Since we send our newsletters in three languages, I would need the "unsubscribe page" and other pages related to the NL (Thank you page and so on) to be available in different languages
Fixed assets in Zoho One?
Hi, We use Zoho Books and have the fixed asset option in it. I started a trial for Zoho One and I do not see that as an option. Is the books that is part of zoho one equivalent to Zoho Books Elite subscription or is it a lesser version? Thanks, Matt
Set Default Status of Assembly to "Assembled" When Entered in UI
I've just discovered the new "confirmed" status of Assemblies within Inventory. While I understand the intent of this (allowing for manufacturing planning and raw material stock allocation), it was initially confusing to me when manually entering some
I need to Record Vatable amount and non vatable amount separately in zoho books in a single line
I need to Record Vatable amount and non vatable amount separately in zoho books in a single line give me the customisation option and in invoice copy to customer the total amount should be inclusive 5%vat and no need to show the vatable and non vatable
Sort Legend & stacked bar chart by value
I'd love to see an option added to sort the legend of graphs by the value that is being represented. This way the items with the largest value in the graph are displayed top down in the legend. For example, let's say I have a large sales team and I create
Scanned Doc - selecting Item overwrites Rate
I have a Vendor Invoice which was uploaded to Documents. I select Add To > New Bill. The OCR is actually quite good, but it is reading an Item Description instead of an Item Number. I remove the description and select the correct Item Number... and it
Timesheet invalid data error
Getting the "Invalid Date" error when trying to add a time sheet to an appointment in a work order. I initially though the work order was corrupt or something so I deleted the work order and recreated it. I added the first time sheet to the AP and saved
Convert invoice from zoho to xml with all details
How to convert an Invoice to XML format with all details
Any update on adding New Customer Payment Providers who support in store terminal devices?
Currently there is only one Customer payment provider listed for terminal devices in USA- Everyware. They charge a monthly fee of almost $149 minimum. Will you add other providers - like Zoho Payments or Stripe or Worldpay that would allow integrated
Dealing With One-Time Customers on Zoho Books
Hello there! I am trying to figure out a way to handle One-Time customers without having to create multiple accounts for every single one on Zoho Books. I understand that I can create a placeholder account called "Walk-In Customer", for example, but I
Customizing Helpcenter texts
I’m customizing the Zoho Desk Help Center and I’d like to change the wording of the standard widgets – for example, the text in the “Submit Ticket” banner that appears in the footer, or other built-in widget labels and messages. So far, I haven’t found
Passing the image/file uploaded in form to openai api
I'm trying to use the OpenAI's new vision feature where we can send image through Api. What I want is the user to upload an image in the form and send this image to OpenAI. But I can't access this image properly in deluge script. There are also some constraints
"Temporary" Field Value?
I have a custom action in Form A report Detail View that passes the Rec ID and updates a Temp Record ID lookup field in the Form B record via openURL (and opens the Form B report in popup) . The updated Temp Record ID field value in Form B is then used
File Upload field automatically replaces spaces with underscores – support experience
Hi everyone, I want to share my recent experience regarding the File Upload field behavior in Zoho Creator and my interaction with the Zoho support team. When a user uploads a file, the system automatically renames the document by replacing spaces in
We Asked, Zoho Delivered: The New Early Access Program is Here
For years, the Zoho Creator community has requested a more transparent and participatory approach to beta testing and feature previews. Today, I'm thrilled to highlight that Zoho has delivered exactly what we asked for with the launch of the Early Access
Next Page