Kaizen #86 - PHP SDK [Part III]

Kaizen #86 - PHP SDK [Part III]

Hey there!
Welcome back to yet another insightful post in our Kaizen series!

In this post, we will continue the journey of PHP SDK sample codes for Record Operations from last week. Let us delve into a new set of use-cases and expand your horizons with additional examples in the Record and Send Mail Operations. 

1. Subforms

To add subform details of a record during a record create/update, use the following format.

$subformVar = new Record();
$subformVar->addKeyValue("Subform_Field_API_Name", "FieldValue");
$record->addKeyValue("Subform_API_Name", [$subformVar]);

Repeat the second line of the above code to add as many fields as you have in your subform layout. To add multiple subform records, you will have to map the fields within a new object for each subform record. 

Here is a sample code to update the details of a custom subform in Contacts. 

<?php

use com\zoho\crm\api\HeaderMap;
use com\zoho\crm\api\record\BodyWrapper;
use com\zoho\crm\api\record\RecordOperations;
use com\zoho\crm\api\record\Contacts;
use com\zoho\crm\api\util\Choice;
use com\zoho\crm\api\record\Record;

require_once "vendor/autoload.php";

class UpdateRecord
{
   public static function initialize()        
   {
 // add initialisation code
 // refer to the previous post for details and examples 
   }

public static function updateRecord1(string $moduleAPIName, string $recordId)
    {
        $recordOperations = new RecordOperations();

        $request = new BodyWrapper();

        $record = new Record();
        $record->addFieldValue(Contacts::LastName(), "Boyle");
        $subformRec1 = new Record();
        $subformRec1->addKeyValue("Language_Proficiency", new Choice("English"));
        $subformRec1->addKeyValue("Personal_Email", "patricia.boyle@zylker.com");
        $subformRec1->addKeyValue("Secondary_Phone", "9876543210");
        $record->addKeyValue("Proficiency_and_Others", [$subformRec1]);
        $request->setData([$record]);
        $headerInstance = new HeaderMap();
        $response = $recordOperations->updateRecord($recordId, $moduleAPIName, $request, $headerInstance);
 //Add your code to handle the response received in $response
 // For more details, see here.
    }
}

UpdateRecord::initialize();
$moduleAPIName = "Contacts";
$recordId = "5545974000002858001";
UpdateRecord::updateRecord1($moduleAPIName, $recordId);
?>

2. Line Items and Line Taxes in Inventory Modules

2.1 Product Line Items and Product Line Taxes

To add or update product line items and their product line taxes in the Inventory module, use the following format.

$lineItemVar = new Record();
$lineItemProductVar = new LineItemProduct();
$lineItemProductVar->setId("product_id");
$lineItemVar->addKeyValue("Product_Name", $lineItemProductVar);
$lineItemVar->addKeyValue("Quantity", Value);
$lineItemVar->addKeyValue("ListPrice", Value);
$lineItemVar->addKeyValue("Discount", Value);
$productLineTaxVar = new LineTax();
$productLineTaxVar->setName("Tax_Name");
$productLineTaxVar->setPercentage(Value);
$lineItemVar->addKeyValue('Line_Tax',  [$productLineTaxVar]);

Repeat this code to add multiple products to the inventory record.
Note that when you update any one of the line items in the inventory records, the remaining line items will become null and have to be re-added to the list. 

2.2 Inventory Record Line Taxes

To add line taxes to an inventory record, use the following format.

$lineTaxVar = new LineTax();
$lineTaxVar->setName("Tax_Name");
$lineTaxVar->setPercentage(Value);
$record->addKeyValue('$line_tax', [$lineTaxVar]);

The 'line_tax' represents the tax amount specific to each line item. Whereas, the '$line_tax' represents the tax applied to the overall products in the line item list.

Following is a sample code to create a record in the Quotes module.

<?php

use com\zoho\crm\api\HeaderMap;
use com\zoho\crm\api\record\BodyWrapper;
use com\zoho\crm\api\record\LineTax;
use com\zoho\crm\api\record\LineItemProduct;
use com\zoho\crm\api\record\RecordOperations;
use com\zoho\crm\api\record\{Accounts, Contacts, Quotes, Deals};
use com\zoho\crm\api\record\Record;

require_once "vendor/autoload.php";

class CreateRecords
{
    public static function initialize()
    {
 // add initialisation code
 // refer to the previous post for details and examples 
   }

   public static function createRecords(string $moduleAPIName)
    {
        $recordOperations = new RecordOperations();
        $bodyWrapper = new BodyWrapper();
        $record = new Record();
        $record->addFieldValue(Quotes::Subject(), "Quote No 1");
        $AccountName = new Record();
        $AccountName->addFieldValue(Accounts::id(), "55459742858119");
        $record->addFieldValue(Quotes::AccountName(), $AccountName);
        $dealName = new Record();
        $dealName->addFieldValue(Deals::id(), "55459742858125");
        $record->addFieldValue(Quotes::DealName(), $dealName);
        $contactName = new Record();
        $contactName->addFieldValue(Contacts::id(), "55459742858122");
        $record->addFieldValue(Quotes::ContactName(), $contactName);

         //product 1
        $inventoryLineItem1 = new Record();
        $lineItemProduct1 = new LineItemProduct();
        $lineItemProduct1->setId("55459742897004");
        $inventoryLineItem1->addKeyValue("Product_Name", $lineItemProduct1);
        $inventoryLineItem1->addKeyValue("Quantity", 2.0);
        $inventoryLineItem1->addKeyValue("ListPrice", 150.0);
        $inventoryLineItem1->addKeyValue("Discount", "5%");
        $productLineTax = new LineTax();
        $productLineTax->setName("Sales Tax");
        $productLineTax->setPercentage(2.0);
        $inventoryLineItem1->addKeyValue('Line_Tax', [$productLineTax]);

         //product 2
        $inventoryLineItem2 = new Record();
        $lineItemProduct2 = new LineItemProduct();
        $lineItemProduct2->setId("55459742897009");
        $inventoryLineItem2->addKeyValue("Product_Name", $lineItemProduct2);
        $inventoryLineItem2->addKeyValue("Quantity", 1.0);
        $inventoryLineItem2->addKeyValue("ListPrice", 100.0);
        $inventoryLineItem2->addKeyValue("Discount", "3%");
        $productLineTax1 = new LineTax();
        $productLineTax1->setName("Sales Tax");
        $productLineTax1->setPercentage(2.0);
        $productLineTax2 = new LineTax();
        $productLineTax2->setName("Vat");
        $productLineTax2->setPercentage(4.0);
        $inventoryLineItem2->addKeyValue('Line_Tax', [$productLineTax1, $productLineTax2]);
        $record->addKeyValue("Quoted_Items", [$inventoryLineItem1, $inventoryLineItem2]);

         //line taxes
        $lineTax1 = new LineTax();
        $lineTax1->setName("Sales Tax");
        $lineTax1->setPercentage(2.0);
        $lineTax2 = new LineTax();
        $lineTax2->setName("Vat");
        $lineTax2->setPercentage(2.0);
        $record->addKeyValue('$line_tax', [$lineTax1, $lineTax2]);

        $bodyWrapper->setData([$record]);
        $headerInstance = new HeaderMap();
        $response = $recordOperations->createRecords($moduleAPIName, $bodyWrapper, $headerInstance);
 //Add your code to handle the response received in $response
 // For more details, see here.
    }
}

CreateRecords::initialize();
$moduleAPIName = "Quotes";
CreateRecords::createRecords($moduleAPIName);
?>

3. Events and Tasks Module Operations

3.1 Add and Update Participants in Events

There are two methods to add participants to an event. In the first method, use the record ID of the contact, lead or user. 

$participantVar = new Participants();
$participantVar->addKeyValue("participant", "record_id");
$participantVar->addKeyValue("type", "record_module");
$record->addFieldValue(Events::Participants(), [$participantVar]);

In the second method, mention the participant's email ID with the type key specified as email

$participantVar = new Participants();
$participantVar->setParticipant("name@domain.com");
$participantVar->setType("email");
$record->addFieldValue(Events::Participants(), [$participantVar]);

In the above code snippet, setParticipant() is a method used to assign a new value to the participant field. 

3.2 Reminder in Events

To create/update reminders for any event, use the following format. 

$reminderVar = date_create("YYYY-MM-DDThh:mm:ss.sssZ", new \DateTimeZone(date_default_timezone_get()));
$record->addFieldValue(Events::FieldName(), $reminderVar);

Here date_create() function is used to create the DateTime object with two parameters. The first parameter represents for the DateTime string and the following represents for the time zone

3.3. Reminder in Tasks

To create/update reminder for a task, use the following format.

$remindAtVar = new RemindAt();
$remindAtVar->setAlarm("ACTION=Value;TRIGGER=Condition;TRIGGER_TIME=hh:mm");
$record->addFieldValue(Tasks::FieldName(), $remindAtVar);

In the above code, the setAlarm() method is used to set the reminder properties. The multiple key-value pairs in the string argument denote the properties of your reminder. Following are the representation of keys for this field type.
  • ACTION - Specifies the notification type of the reminder.
  • TRIGGER - Defines the trigger condition that activates the reminder.
  • TRIGGER_TIME - Indicates the time at which the alarm should be triggered.
Refer to this document, to learn more about these key-value pairs and their possible values.

3.4 Recurring Activity in Events and Tasks

Use the following format to create a recurring event.

$recurringActivityVar = new RecurringActivity();
$recurringActivityVar->setRrule("FREQ=value;INTERVAL=value;BYMONTH=mm;BYMONTHDAY=dd;
DTSTART=yyyy-mm-dd;UNTIL=yyyy-mm-dd");
$record->addFieldValue(Module_API_Name::FieldName(), $recurringActivityVar);

Here, the setRrule() method is used to define the elements that determine the recurrence of the activity. This format is common for all the activity modules. To know more about the Rrule elements, refer to this post.

Below is a sample code to create an event using the above field types.

<?php

use com\zoho\crm\api\HeaderMap;
use com\zoho\crm\api\record\BodyWrapper;
use com\zoho\crm\api\record\Participants;
use com\zoho\crm\api\record\RecordOperations;
use com\zoho\crm\api\record\RecurringActivity;
use com\zoho\crm\api\record\Events;
use com\zoho\crm\api\record\Record;

require_once "vendor/autoload.php";

class CreateRecords
{
    public static function initialize()
    {
 // add initialisation code
 // refer to the previous post for details and examples 
    }

    public static function createRecords1(string $moduleAPIName)
    {
        $recordOperations = new RecordOperations();
        $BodyWrapper = new BodyWrapper();
        $record = new Record();
        $record->addFieldValue(Events::EventTitle(), "Test Events");
        $startdatetime = date_create("2023-05-16T23:03:06+05:30", new \DateTimeZone(date_default_timezone_get()));
        $record->addFieldValue(Events::StartDateTime(), $startdatetime);
        $enddatetime = date_create("2023-05-16T23:45:06+05:30", new \DateTimeZone(date_default_timezone_get()));
        $record->addFieldValue(Events::EndDateTime(), $enddatetime);

         //add participants 
        $participant1 = new Participants();
        $participant1->setParticipant("patricia.boyle@zylker.com");
        $participant1->setType("email");
        $participant2 = new Participants();
        $participant2->addKeyValue("participant", "5545974000002858122");
        $participant2->addKeyValue("type", "contact");
        $record->addFieldValue(Events::Participants(), [$participant1, $participant2]);

         //event reminder
        $remindAt = date_create("2023-05-16T21:00:06+05:30", new \DateTimeZone(date_default_timezone_get()));
        $record->addFieldValue(Events::RemindAt(), $remindAt);

         //recurring event
        $recurringActivity = new RecurringActivity();
        $recurringActivity->setRrule("FREQ=YEARLY;INTERVAL=1;BYMONTH=5;BYMONTHDAY=16;DTSTART=2023-05-16;UNTIL=2026-05-16");
        $record->addFieldValue(Events::RecurringActivity(), $recurringActivity);

        $BodyWrapper->setData([$record]);
        $headerInstance = new HeaderMap();
        $response = $recordOperations->createRecords($moduleAPIName, $BodyWrapper, $headerInstance);
 //Add your code to handle the response received in $response
 // For more details, see here.
    }
}

CreateRecords::initialize();
$moduleAPIName = "Events";
CreateRecords::createRecords1($moduleAPIName);
?>

Here is a sample code for creating a recurring task with a reminder.

<?php

use com\zoho\crm\api\HeaderMap;
use com\zoho\crm\api\record\BodyWrapper;
use com\zoho\crm\api\record\RecordOperations;
use com\zoho\crm\api\record\RecurringActivity;
use com\zoho\crm\api\record\RemindAt;
use com\zoho\crm\api\record\Tasks;
use com\zoho\crm\api\record\Record;

require_once "vendor/autoload.php";

class CreateRecords
{
    public static function initialize()
    {
 // add initialisation code
 // refer to the previous post for details and examples 
   }

    public static function createRecords1(string $moduleAPIName)
    {
        $recordOperations = new RecordOperations();
        $bodyWrapper = new BodyWrapper();
        $record = new Record();
        $record->addFieldValue(Tasks::Subject(), "Follow-up call");

         //task reminder
        $remindAt = new RemindAt();
        $remindAt->setAlarm("ACTION=EMAIL;TRIGGER=-P0D;TRIGGER_TIME=14:20");
        $record->addFieldValue(Tasks::RemindAt(), $remindAt);

         // recurring task
        $recurringActivity = new RecurringActivity();
        $recurringActivity->setRrule("FREQ=WEEKLY;INTERVAL=1;UNTIL=2023-06-01;BYDAY=TH;DTSTART=2023-06-01");
        $record->addFieldValue(Tasks::RecurringActivity(), $recurringActivity);

        $bodyWrapper->setData([$record]);
        $headerInstance = new HeaderMap();
        $response = $recordOperations->createRecords($moduleAPIName, $bodyWrapper, $headerInstance);
 //Add your code to handle the response received in $response
 // For more details, see here.
    }
}

CreateRecords::initialize();
$moduleAPIName = "Tasks";
CreateRecords::createRecords1($moduleAPIName);
?>

5. Send Email

You can either use an email or inventory template to send mail or write your own HTML/text body for the email. Refer to this sample code on GitHub to know how to fetch the inventory template IDs.  To use a template in your email follow the below structure.

$mail = new Mail();
$templateVar = new EmailTemplate();
$templateVar->setId(template_id);
$mail->setTemplate($templateVar);

Use the following format to write your own email body.

$mail = new Mail();
$mail->setContent("your_html_content");
$mail->setMailFormat("html");

To specify plain text as the value for the setContent() method, you have to set text as the value for the setMailFormat() method.

Here is a sample code of send mail using email template for your reference.

<?php

use com\zoho\crm\api\sendmail\SendMailOperations;
use com\zoho\crm\api\sendmail\Mail;
use com\zoho\crm\api\emailtemplates\EmailTemplate;
use com\zoho\crm\api\sendmail\BodyWrapper;
use com\zoho\crm\api\sendmail\UserAddress;
//use com\zoho\crm\api\inventorytemplates\InventoryTemplate;

require_once "vendor/autoload.php";

class SendMail
{
    public static function initialize()
    {
 // add initialisation code
 // refer to the previous post for details and examples 
   }

    public static function sendMail1(string $recordId, string $moduleAPIName)
    {
        $sendMailOperations = new SendMailOperations();
        $mail = new Mail();
        $from = new UserAddress();
        $from->setUserName("Patricia Boyle");
        $from->setEmail("patricia.boyle@zylker.com");
        $mail->setFrom($from);
        $to = new UserAddress();
        $to->setUserName("Carissa Kidman");
        $to->setEmail("carissa-kidman@yahoo.com");
        $mail->setTo([$to]);
        $mail->setSubject("Mail subject");

         //use this for customized email body
        //$mail->setContent("Hello! Thank you for shopping with us!");
        //$mail->setMailFormat("text");

         //use this for inventory template
        //$template = new InventoryTemplate();
        //$template->setId("55459741230768");
        //$mail->setTemplate($template);

        $template = new EmailTemplate();
        $template->setId("55459741230058");
        $mail->setTemplate($template);
        $mail->setConsentEmail(true);
        $wrapper = new BodyWrapper();
        $wrapper->setData([$mail]);
        $response = $sendMailOperations->sendMail($recordId, $moduleAPIName, $wrapper);
 //Add your code to handle the response received in $response
 // For more details, see here.
    }
}

SendMail::initialize();
$recordId = "5545974000002935001";
$moduleAPIName = "Contacts";
SendMail::sendMail1($recordId, $moduleAPIName);
?>

We hope you found this post useful and engaging! 

If you have any queries, feel free to drop them in the comments section below or reach out to us directly at support@zohocrm.com. We eagerly await your thoughts and feedback on this!

Keep an eye out for future posts packed with similar content!

Cheers!

Additional Reading


    • Recent Topics

    • VBA handling named ranges

      In VBA I'm able to work with a single cell named range. E.g. Set Jr = Range ("Year").Value. Also other options are working fine, like Range("Year").Address shows $L$3. However a named range refering to multiple cells is not working for me. Eg. tbl_Test
    • Kaizen #176 - Optimizing the Use of Record ID Variables in Zoho CRM Queries

      Hello everyone! Welcome to another week of Kaizen! Since the release of Queries, we have covered Handling Query Variables in Zoho CRM, Serialization and Schema Management, and Leveraging the 'crmAPIResponse' object in Queries in previous posts. Today,
    • Unbilled Items Report?

      Hello! Is there any way to display a list of items that remain unbilled, without creating an invoice for each customer to see if the unbilled items box is displayed? ;-) Ben
    • Consolidation of Multi currency

      Would like to discuss on the possibility of consolidating the ZOHO companies
    • Landed Cost Allocation / Custom Duty manual data entry

      My client is an import business. They must manually enter the duty for each item with landed cost allocation in Bill. This is because customs duties cannot be allocated based on Quantity, Value, Weight, and Dimensions. Manual data entry is highly time-consuming
    • Territories Just Don't Work

      I have been on chat and screenshare support for the past 3 days and am getting no resolution so hopefully, someone here can help me. I am the Super Admin of my organization. We publish books globally. I want to break down the books into territories so
    • Negative Opening Balance

      How can I add Negative Opening balance - meaning a credit balance to a Customer or a debit balance to a vendor? If I go thru Sales-->Customers, and if the opening balance is Rs. 1000 (credit balance), it does not allow me to enter a "minus" sign or mention
    • Single-Line Invoicing from Sales Order Despite Multiple SKUs Shipped

      We deal mostly with Government Tenders And Lets say we got a tender that needs 125 XYZ Laptops Then we found 95 Laptops with a different SKUs and 30 Laptops with different SKUs We talk with the IT department of the government company and they approve
    • 📣📣 Zoho Bookings Schedulathon 2025 is here!

      Hey Zoho Bookings fam, We're excited to invite you to our first-ever hackathon: Yes, Zoho Bookings Schedulathon 2025 is live now. This is a virtual event and you can participate anywhere from the world. Businesses should be able to set up meetings from
    • I want to send out a new newsletter each month

      Without rebuilding a whole journey is there a way to create a new newsletter that is sent to an existing journey monthly?
    • Reinstalling Workdrive Truesync client

      Hi, I attempted to update to the beta version of TrueSync, but it was unstable and kept crashing, so I need to revert to the stable version. How do I properly reinstall TrueSync on a Windows PC? I couldn't install the 3.15.x version directly over the
    • Evaluating Creator; yesterday fine; today connection times out

      Yesterday I spent hours creating a new app, and it worked fine. Today I cannot access creator.zoho.com. Is this common? I'm in the evaluation mode, but I'm thinking I'm going to keep looking. It worked from my home computer, and now I'm checking it from my work computer. My work computer always works just fine, so I shouldn't htink there would be special settings or anything. If there are, how to find out what they could be? Using Chrome on Windows XP The error I get is: The webpage at https://creator.zoho.com
    • Pivot Chart seems to show "old" data - how do I make it update?

      I wonder how to make a Pivot Chart "update" its data contents. Here is the background: I need to report a subset of data that is so complicated that it is easier to make a calculation and put the result in a "reporting form", and then display the data from that form.  So, I get data from the "original form" GRANTS, make some calculations and put the result in the "reporting form" PERIOD.  Now I can watch the result in a list called LIST, which works fine. The list LIST shows that form PERIOD contains
    • Upcoming Changes to LinkedIn Parsing in Resume Extractor

      Starting 31 July 2025, the Zoho Recruit Resume Extractor will no longer support direct parsing of candidate data from LinkedIn profiles. Why Is This Change Needed? In accordance with LinkedIn’s platform policies, extracting profile data through browser
    • how to create view in leads module to that will show all leads + converted leads?

      is it possible to make custom view that combine all leads + converted leads? how to do that
    • Reply and react to comments

      Hi everyone! We're excited to bring to you a couple of new features that'll make your sprint process simpler. A cloud application brings with it an array of social media features that can be efficiently used in your organizational setup. As an agile scrum
    • Announcing Early Access to "Zoho CRM for Everyone" — A new and exciting update to Zoho CRM

      Zoho CRM For Everyone is now officially available to all customers, and the Early Access Program has come to a close. We want to extend our sincere thanks to everyone who participated in the program. Your valuable feedback played a key role in shaping
    • Avalara Sales Tax integration - AVATAX

      Just wondering if anyone else is having troubles with this integration?  Seems as though Avalara changed their billing process, unbeknownst to Zoho, and now ALL transactions are counted by Avalara, not just transactions in a taxable jurisdiction.  This caused a huge price adjustment billed to us by Avalara within a month of us signing up.  And Avalara is not cheap to begin with! Avalara has been great in waiving that increase, but there seems to be no fix.  Zoho is aware of the problem, but slow
    • Invalid value passed for description

      Dear Sir, When I am entering the purchase bill , the following message showing "Invalid value passed for description" what should I do ? I am attaching screenshot. With Regards, Harish harish@cracku.in 7978841636
    • Zoho Creator - 2024 Release Projection 1

      Hello everyone! As we enter 2024, we'd like to extend our warmest wishes for success and prosperity. Your fantastic response to our Product Roadmap page last year has been incredibly motivating. Continuing on this path, we're excited to share a glimpse
    • Automation Assistance for Zoho Form Integration and Workflow

      Hi, We are currently using a Zoho Form to send out our Global Credit Application and would like to automate the process further. Specifically, we’d like the ABN number submitted through the form to automatically populate the GST/VAT Number field in Zoho
    • COQL does not return queryable value if the result set is empty

      See linked video for running code illustration of the problem: https://workdrive.zohoexternal.com/external/d49bb40033b43b288d56fdf843095b7c65b28391d3ec5d09c854f416d853003d Moderation update: We are appending the comment that was removed, to add context
    • Zoho CRMでの商談の管理のしかたについて初歩的な質問です。

      先月からZoho CRMを試験的に導入して運用しています。 商談の管理(運用?)の仕方について教えてください。 商談の数が増えてくると、ダッシュボードの「ステージ別進捗状況」にどんどん過去の商談が蓄積されてくると思うのですが、 現在動きのあるものを中心に確認したくなる気がします。 そのあたりについては、どのように運用が一般的なのでしょうか? アドバイスいただけるととてもありがたいです。 よろしくお願いします。
    • Composite Items & Purchase Orders

      The Composite Item is great way to bundle different products and services into a single line and sell it as a single line item in Estimates, Sales Orders and Invoices. However, on the other side - i,e,. Purchasing - this item creates quite a bit of a
    • using custom function is it possible to update the created by field in Zoho Crm custom module

      using custom function is it possible to update the created by field in Zoho Crm custom module
    • Slow Sloww Slowwww Responses

      Good day, Has anyone been experiencing slow responses from support? Since Thursday I migrated my Whats app to Sales Iq and I had to synch with Social to get the otp they were sending. Apparently What's app can't be automatically added so I reached out
    • You have exceeded the maximum number of attempts for this action. Please retry doing the same in 30 minutes.

      When one of Zoho Books user tries to select a vendor, recording a new bill, these message appears: You have exceeded the maximum number of attempts for this action. Please retry doing the same in 30 minutes. Other user, at the same time, but different
    • Enable Conversation Context Retention for SalesIQ Answer Bots

      Hello Zoho SalesIQ Team, We hope you are doing well. We have noticed that SalesIQ bots currently fail to maintain conversation context in Hebrew. For example, when we follow up on a previous answer or ask for clarification in Hebrew, the bot either provides
    • Automatic Hebrew Small Talk Setup Without Duplicate Term Errors & Manual Configuration

      Dear Zoho SalesIQ Team, Greetings, We would like to request an enhancement to the Small Talk feature in Zoho SalesIQ, specifically for Hebrew language support. Current Challenge: When setting up Small Talk for Hebrew, we encounter multiple issues: Simple
    • Should I Add Leads in Bigin?

      ok, first off I'm new here. I just started using Bigin. I'm debating if it's appropriate to enter leads. by leads I mean a list of contacts that I have not yet reached out to...it's a cold calling list.  if I enter them I can track them (I understand
    • Zoho Books - Perform a validation check before an invoice is marked as sent or sent

      Allow the validation rules to apply to button actions. For example: an invoice could not be sent or marked as sent if it has an empty value in a custom field. (The field could remain blank while it is being worked on.)
    • Flow error "given url is wrong"

      when I setup a flow to update a task status, I get an error when it runs that says "given url is wrong."
    • Upgrade Zoho Desk Agent-Side Answer Bot to GenAI

      Hello Zoho Desk Team, We hope you're doing well. Following the recent announcements and rollout of the GenAI-based Answer Bot in Zoho SalesIQ (Nova '25), we’d like to formally request a similar upgrade for the Answer Bot used by agents inside Zoho Desk.
    • Bigin Android app update: Email filters enhancement, change owner for related records.

      Hello, everyone! In the most recent Bigin Android app update, we have introduced additional email filters and an option to change the owner of related records. Email filters: We have now brought in support for 'All Emails' and 'Added from Widgets' filter
    • How can I get all conversations and comments of a Zoho Desk ticket using ZOHODESK

      Hi everyone, Currently, I am developing a Zoho Desk extension, and I am following the guide available at https://www.zoho.com/desk/extensions/guide/#ticket-object. While working with Zoho Desk, I have noticed that I can only retrieve the general information
    • AI & Zoho Recruit

      Hello, I guess we all are using AI in our personal and professional lives. Now, let's imagine. Recruitment is just a succession of stages and steps. For which step would you like to see AI implemented into Zoho Recruit ? I'll start : - Automatic translation
    • Workdrive and ChatGPT Team Synced Connectors

      Hi, we want to be able to integrate Zoho Workdrive with OpenAI’s ChatGPT Team plan. Google Drive and OneDrive both offer this, zoho please catch up asap. We dont want to have to put our company files in google drive, we want to allow chatgpt Team edition
    • widget url 404'ing

      I'm creating a widget for the first time. When I grab the url from the base url section of the widget builder and append /widget.html it 404's Just wrote a very basic test. I have a folder structure app.zip - widget.html --js/app.js /widget.html <!DOCTYPE
    • Unable to Edit Pick-List Items in Custom Project Field(s)

      I can edit most fields normally, but if I try to edit - in any way - a Pick List field, I just get this error: To be perfectly clear, I'm trying to edit an existing Pick List field (adding or removing items), not adding a new instance. If I rename it,
    • How to display results from zoho.crm.searchRecords in message window

      Hello, I've created a custom function which is linked to a custom button which pulls a date from our contacts module and searches a date field in our quotes module and returns all records matching the date. My issue is, how to I get this to display the
    • Next Page