Custom Function : Automatically send the Quote to the related contact

Custom Function : Automatically send the Quote to the related contact

Scenario: Automatically send the Quote to the related contact. 

We create Quotes for customers regularly and when we want to send the quote to the customer, we have to send it manually.

We can automate this, using Custom Functions. Based on a criteria, you can trigger a workflow rule and the custom function associated to the rule and automatically send the quote to customer through an email.

Please note that the quote will be sent as an inline email content and not as a PDF attachment.

Please follow these steps:

  1. Log in to Zoho CRM with administrative privileges.
  2. Click Setup > Automation > Workflow > Create Rule.
  3. In the New Rule page, choose Quotes module from the drop-down list and provide other rule details.
  4. Under Execute On, choose Create or Edit and then click Next.
  5. Specify the Rule Criteria. The rule will triggered only when a record meets the criteria mentioned here.
  6. In the Actions section, click on the Add button for Call Custom Functions.
  7. In the Configure Custom Function popup, click Write your own.
  8. Specify a name for the function.
  9. Build the Deluge Script based on the code given below.



void workflowspace1.Myfunction(string quoteId)
{
resp = zoho.crm.searchRecordsByPDC("Quotes","quoteid",input.quoteId);
respstr=resp.toString();
respmap=respstr.toMap();
productmap=respmap.get("product");
jlist=productmap.toJSONList();
ContactName=respmap.get("Contact Name");
AccountName=respmap.get(("Account Name"));
Description=ifnull(respmap.get("Description"),"");
AccountID=respmap.get("ACCOUNTID");
ContactID=respmap.get("CONTACTID");
accresp = zoho.crm.searchRecordsByPDC(("Accounts"),("accountid"),AccountID);
accrespstr=accresp.toString();
accrespmap=accrespstr.toMap();
conresp = zoho.crm.searchRecordsByPDC("Contacts","contactid",ContactID);
conrespstr=conresp.toString();
conrespmap=conrespstr.toMap();
Mobile=ifnull(conrespmap.get("Mobile"),"");
Email=ifnull(conrespmap.get("Email"),"");
City=ifnull(accrespmap.get("City"),"");
Street=ifnull(accrespmap.get("Street"),"");
str="<br><br><br><table border='0' cellspacing='0' cellpadding='0' width='100%' style='background:#fff;padding:2px;'><tbody><tr><td><table border='0' cellspacing='0'cellpadding='0' width='100%' style='border-left:1px solid #dadada;border-right:4px solid#dadada;border-top:1px solid #dadada;border-bottom:4px solid #dadada;padding:10px;background-color:white;'><tbody><tr><td valign='top'><div style='font-family:Arial, Helvetica, sans-serif; font-size: 13px;'><span style='font-family: Verdana, arial, Helvetica,sans-serif; font-size: 12px;'>Hello there!&nbsp;</span><div style='font-family: Verdana, arial,Helvetica, sans-serif; font-size: 12px;'><br></div>";
str=((str + "<div style='font-family: Verdana, arial,Helvetica, sans-serif; font-size: 12px;'>Customer Name: ") + ContactName) + "&nbsp;</div><div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size:12px;'><br></div>";
str=((str + "<div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size:12px;'>Company Name: ") + AccountName) + "&nbsp;</div><div style='font-family: Verdana, arial,Helvetica, sans-serif; font-size: 12px;'><br></div>";
str=((str + "<div style='font-family: Verdana, arial,Helvetica, sans-serif; font-size: 12px;'>Mobile Number: ") + Mobile) + "&nbsp;</div><divstyle='font-family: Verdana, arial, Helvetica, sans-serif; font-size: 12px;'><br></div>";
str=((str + " <div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size: 12px;'>Email Address:") + Email) + "&nbsp;</div><div style='font-family: Verdana, arial, Helvetica, sans-serif;font-size: 12px;'><br></div>";
str=((str + "<div style='font-family: Verdana, arial, Helvetica, sans-serif;font-size: 12px;'>City:&nbsp;") + City) + "</div><div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size: 12px;'><br></div>";
str=((str + "<div style='font-family: Verdana, arial,Helvetica, sans-serif; font-size: 12px;'>Address:&nbsp;") + Street) + "</div><div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size: 12px;'><br></div>";
str=((str + "<div style='font-family: Verdana, arial,Helvetica, sans-serif; font-size: 12px;'>Requirements :&nbsp;") + Description) + "</div><div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size: 12px;'><br></div>";
str=str + " <div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size: 12px;'>Kindly allocate the partner for the above case and also update us on the further progress of the above lead.&nbsp;</div>";
str=str + "<div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size:12px;'>Regards, CNX Team</div><div style='font-family: Verdana, arial, Helvetica, sans-serif; font-size: 12px;'><br></div>";
str=str + "<table border='0' cellspacing='0'cellpadding='0' width='100%' style='font-family: Arial, Helvetica,sans-serif;font-size:11px;color:#000;'><thead><tr><td style='font-weight:bold;background-color:#eaeaea;border-top:2px solid gray;'>S.No.</td><td style='font-weight:bold;background-color:#eaeaea;border-top:2px solid gray;'>Product Details</td><td style='font-weight:bold;background-color:#eaeaea;border-top:2px solid gray;'>Qty</td><td align='right' style='font-weight:bold;background-color:#eaeaea;border-top:2px solid gray;'>List Price</td>  <td align='right' style='font-weight:bold;background-color:#eaeaea;border-top:2px solid gray;'>Total</td>  </tr> </thead>";
for each index j in jlist
{
mapvar=jlist.get(j);
finalMap=mapvar.toMap();
pdt=ifnull(finalMap.get("Product Name"),"");
qty=ifnull(finalMap.get("Quantity"),"");
listPrice=ifnull(finalMap.get("List Price"),"");
UnitPrice=ifnull(finalMap.get("Unit Price"),"");
TotalDis=ifnull(finalMap.get(("Total After Discount")),"");
qtyInStock=ifnull(finalMap.get("Quantity in Stock"),"");
Tax=ifnull(finalMap.get("Tax"),"");
netTotal=ifnull(finalMap.get("Net Total"),"");
discount=ifnull(finalMap.get(("Discount")),"");
Total=ifnull(finalMap.get("Total"),"");
str=str + "<tbody><tr><td style='border-bottom:2px dotted #dadada' valign='top'><b>" + (j  +  1) + "<br></b></td>";
str=str + "<td style='border-bottom:2px dotted #dadada'><b>" + pdt + "</b><br></td>";
str=str + "<td style='border-bottom:2px dotted #dadada' valign='top'>" + qty + "</td>";
str=str + "<td style='border-bottom:2px dotted #dadada' align='right' valign='top'>" + listPrice + "</td>";
str=str + "<td style='border-bottom:2px dotted #dadada' align='right' valign='top'>" + Total + "</td>";
str=str + "</tr></tbody>";
}
subtotal=ifnull(respmap.get("Sub Total"),"");
totaltax=ifnull(respmap.get("Tax"),"");
adjustment=ifnull(respmap.get("Adjustment"),"");
Grandtotal=ifnull(respmap.get("Grand Total"),"");
str=str + "<tbody><tr><td colspan='4' align='right'>Sub Total</td>";
str=str + "<td align='right'><b>" + subtotal + "</b></td></tr>";
str=str + "<tr><td colspan='4' align='right'>Tax</td>";
str=str + " <td align='right'>" + totaltax + "</td></tr>";
str=str + "<tr><td colspan='4' align='right'>Adjustment</td>";
str=str + "<td align='right'> " + adjustment + "</td></tr>";
str=str + "<tr><td colspan='4' style='border-bottom:2px solid #ccc' align='right'><b>Grand Total</b></td>";
str=str + "<td style='border-bottom:2px solid #ccc;border-top:2px solid #dadada;' align='right'><b>INR " + Grandtotal + "</b></td></tr></tbody></table><br><br></td></tr></tbody></table></td></tr></tbody></table>";
sendmail
[
from:zoho.adminuserid
to:Email
subject:"Quote Details"
message:str
content type:HTML
]
}

Note: This custom function is for the Quote module and you can modify it to send the automated email from the Sales Order and Invoices also. Also, we have used on the default Quote template model. If you want to change the quote layout, then you need to customize the custom function as per your requirement.

Please refer to the following link to know more about this feature:
    • Sticky Posts

    • Function #46: Auto-Calculate Sales Margin on a Quote

      Welcome back everyone! Last week's function was about displaying the discount amount in words. This week, it's going to be about automatically calculating the sales margin for a particular quote, sales order or an invoice. Business scenario Where there is sales, there's also evaluation and competition between sales reps. A healthy rivalry helps to better motivate your employees to do smart work and close deals faster and more efficiently. But how does a sales rep get evaluated? 90% of the time, it's
    • Zoho CRM Functions 53: Automatically name your Deals during lead conversion.

      Welcome back everyone! Last week's function was about automatically updating the recent Event date in the Accounts module. This week, it's going to be about automatically giving a custom Deal name whenever a lead is converted. Business scenario Deals are the most important records in CRM. After successful prospecting, the sales cycle is followed by deal creation, follow-up, and its subsequent closure. Being a critical function of your sales cycle, it's good to follow certain best practices. One such
    • User Tips: Auto-Create Opportunity/Deal upon Quote Save (PART 1)

      Problem: We use quotes which convert to sales orders but Users / Sales Reps do not create opportunities / deals and go straight to creating a quote. This leads to poor reporting. Implementing this solution improves reporting and makes it easier for users.
    • Custom Function : Automatically send the Quote to the related contact

      Scenario: Automatically send the Quote to the related contact.  We create Quotes for customers regularly and when we want to send the quote to the customer, we have to send it manually. We can automate this, using Custom Functions. Based on a criteria, you can trigger a workflow rule and the custom function associated to the rule and automatically send the quote to customer through an email. Please note that the quote will be sent as an inline email content and not as a PDF attachment. Please follow
    • Function #50: Schedule Calls to records

      Welcome back everyone! Last week's function was about changing ownership of multiple records concurrently. This week, it's going to be about scheduling calls for records in various modules. Business scenario Calls are an integral part of most sales routines.. Sales, Management, Support, all the branches of the business structure would work in cohesion only through calls. You could say they are akin to engine oil, which is required by the engine to make all of it's components function perfectly. CRM
    • Recent Topics

    • Service currently unavailable

      Service currently unavailable It is not possible to access email; the entire Zohoworkplace platform is down
    • User Permission Log

      Our external auditors are asking for a way to view changes made to user permissions (basically, a user permission change log). Is this feature built into Creator? 
    • E-mail down

      We cannot get into our email inboxes, are you affected by a Microsoft update issue? How long do you think as to restoration?
    • ZOHO MAIL SERVICE NOT WORKING

      Hello i've a problem my zoho mail account says a display with this text "our service is temporally unavaible"
    • ايميل مجانى

      Can I create a free email account on Zahoo?
    • Sign up for email for a domain

      Hi - I thought I had signed up for a domain of <domain>.com, but only see the email of @zohomail.com . How do I get the <domain.com> domain linked to my email?
    • Feature Request: Include Creator-applicable Deluge updates in the Creator Release Notes

      I'd like to put forward a suggestion about how Deluge updates are surfaced to Zoho Creator developers, and I'm hoping the Creator team will consider it. Zoho Creator is built on Deluge. Every workflow, custom function, validation and schedule we write
    • Zoho Books | Product updates | June 2026

      Hello users, Welcome to this month's roundup of what's new in Zoho Books! We have an exciting line-up this time. The highlight is the launch of the all-new France Edition with full ISCA compliance. We're also introducing features such as Layout Rules
    • Partner with HDFC And Sbi Bank.

      Hdfc and sbi both are very popular bank if zoho books become partner with this banks then many of the zoho books users will benefit premium features of partnered banks.
    • name change of company in same GSTIN registration . how to retain historical company name for past transactions?

      hello I have recently change my company name from BHANU DIAM to BHANUMATI IMPEX in same GSTIN registration number While i have update the company name in profile name that change all my historic data like sale invoices and purchase bill , i would like
    • AUTOMATION OF INVOICE PROCESSING

      Dear Zoho Books Product Team, I hope this message finds you well. I’m reaching out as a dedicated Zoho Books user with a product idea that I genuinely believe could transform how businesses handle purchase invoicing — and set Zoho Books apart as the smartest
    • Zoho Books | Product updates | July 2026

      Hello users, We’re excited to bring you the latest updates in Zoho Books for July 2026! This month's release introduces Terminal Payments, CMP-08 filing for composition taxpayers, SEPA Credit Transfer support, the new Receipts and Payments Report for
    • Zoho ERP | Product updates | June 2026

      Hello users, We launched Zoho ERP on January 23, and since then, our goal has been to help businesses streamline and manage their operations with greater efficiency, flexibility, and control. Since the launch, we've continued to enhance the platform every
    • Solution to Import OST File into Office 365.

      In today’s digital workplace, organizations are rapidly moving toward cloud-based email systems for better flexibility, security, and collaboration. Microsoft 365 has become one of the most widely used platforms for business communication. A common requirement
    • Zoho Contacts *Web Interface Does Not Load* (Tested in Firefox, Safari)

      When trying to load https://contacts.zoho.com the error shown in the console is: The resource from “https://static.zohocdn.com/zmail/zm/newContactsChange11/js/main.js” was blocked due to MIME type (“application/json”) mismatch (X-Content-Type-Options:
    • Admin-Side Calendar Delegation from the Admin Console (Parity with Zoho Mail Mailbox Delegation)

      Summary Zoho Mail already lets organization admins delegate a user's mailbox to another user directly from the Admin Console — no approval from the mailbox owner required (Users > select user > Mail Settings > Delegated to > + Add). Zoho Calendar has
    • How use .PK12 certifcate for sign

      Hello! Is it possible to use my personal digital certificate (as a COMMODO .pk12) to sign documents? Thank you
    • Blueprint - Mandatory file upload field

      Hi, File upload (as we as image upload) field cannot be set as mandatory during a blueprint transition. Is there a workaround? Setting attachments as mandatory doesn't solve this need as we have no control over which attachments are added, nor can we
    • Completed Calls don't associate with Scheduled Calls

      I schedule calls at specific times so that they are easily viewable on my phone. I open a given call on my phone and use the call icon at the bottom of the screen. I complete the call and select "yes" when asked if I want to log the call. I enter the
    • Integrations of freelancing websites

      It is a customized effort which we require to be implemented on our Zoho recruit. We want that Upwork and Freelancer and other such freelancing websites get integrated into our Zoho Recruit, so that, any communication which we do with the candidates from those websites gets directly recorded on our Zoho recruit and we don't have to move back and forth by opening any other application other than Zoho. If this can be done, we think of managing the entire communication through Zoho recruit and use it
    • Workflow Preventing others from editing

      Using workflows in WorkDrive to implement a document review process has been extremely helpful in my organization. The only problem is that other users who have access to the document via standard document sharing rules are unable to edit the document.
    • MCP > Creator connection failing with Claude

      I'm trying to get claude to access any of my Zoho Creator apps and it keeps failing. I have enabled all tools for creator and ensured in claude settings that everything is authorised. Here is what claude says : Unfortunately, the error messages I'm receiving
    • Zoho Analytics UI Bug

      Hello, all, The Aggregate Formulas in Zoho Analytics' list of fields have a 3-dot menu: If the formula has a long name, the name is not fully visible in the list, and a 3-dot menu is not accessible from it: This is not convenient, especially when the
    • Help me recover my account

      business@heymods.mobi is an account I registered two years ago. My domain is no longer valid, and I cannot access the admin page. I also subscribed to a $12 service, but I cannot configure the domain. Please help me set xunmeng.app@gmail.com as the admin,
    • I cannot receive emails

      I cannot receive email sent to my personal email account. I can send them but not receive them. I don't have a domain. Zoho direct email. Please help
    • I don't have access to my signup email.

      Hi, I don't have access to my signup email. I signed up while using the Loveabe app. I don't have access to the app that I built with the email ramonsepulveda@dreamgiftsfinder.com. Please help me cancel my account with you through that email.
    • Update on default settings for AI features in Cliq

      Hello all, We'd like to provide clarity on a recent change to AI feature defaults in Cliq. As part of our regular review of AI features conducted in April 2026, we re-evaluated how these features are enabled by default. We've decided that the AI features
    • Zoho CRM custom button function, how to add line breaks/ new lines in the return message

      When creating button function in CRM it requires a `return "";` Then when the button is client by the user a message pops up with what ever is returned from the function. But I want to have a message with multiple lines, meaning I need to add a line break
    • Email not Received

      No email has been recieved except welcome email and one more email in 2025.
    • i cant renew my domain bfftube.cloudns.cc

      i cant renew my domain bfftube.cloudns.cc because its a free subdomain from cloudns and you cant renew it its always active can some fix this becasue again there is no way to renew it becasue its free subdomain and again its always active
    • How to Switch from Outlook for Mac to Outlook for Windows

      The most often used file formats for users to manage crucial data are OLM and PST files. PST files keep a copy of data on the configured system from Outlook, while the OLM file contains the Mac Outlook data items, which are only accessible with Outlook
    • Different languages for users

      Hello, Do you plan to enable individual users to select their languages for interface? Currently language can be changed for everyone - it looks like a settings for a whole portal, which is not good when you are working internationally. Best regards,
    • Issues migrating Google email

      I am considering Zoho because Google will start charging for G Suite legacy free edition.    So, a key element in my decision is the ability to migrate as much from Google as possible.  I am giving email a try first, but after hours of trying, I can't
    • "Print" option of GET Expense Report API not working

      Hello! I have been trying to use the "print" option of the GET Expense Report API but it seems the option does not alter the output. Is there an issue with the API or am I using it wrong? Here's my request code, in Deluge: response = invokeurl [ url :"https://www.zohoapis.com/expense/v1/expensereports/"
    • Related List Expanded View in Zoho CRM: see more related records at a glance, filter and take bulk actions

      Hello everyone! Related lists show you the records connected to what you're working on: contacts under an account, activities tied to a deal, products linked to a quote. But until now, you could only see 10 records at a time. If you needed to filter results
    • How to automatically update a % field according to a dropdown field in the Quote table

      Hello there, I have following couples: Success % Status 0% NP 30% No Feedback 50% PR 80% Opp. Concreta 100% A I would like the Success % field (percent) to automatically update based on the item of the Status field (dropdown). The fields are within the
    • CRM iOS App Missing Tags support

      Hi, I remember reading either a tread on iOS (Maybe Later) & Android (i believe Now Supported) regarding “Tags” in the mobile apps unfortunately I can’t seem to find either. Could we clarify are “Tags” support coming to CRM iOS app as searching the forums
    • Marketing Tip #41: Add a clear value proposition to your homepage

      When someone lands on your homepage, they should understand what you sell and why it is worth exploring within 5 seconds. If your homepage is too vague, cluttered, or focused only on design, visitors may leave before they even start browsing. A strong
    • Zoho Writer adds conditional logic and AI assistance to formulas: A step toward dynamic document automation

      Hi users, We are excited to announce new formula enhancements in Zoho Writer. This includes: New string formulas: Use 12 new string functions to dynamically transform and manipulate text in documents and automation templates. Conditional formulas: Configure
    • What's New in Zoho Billing | June 2026

      Hello users! June brings a new set of updates to Zoho Billing designed to strengthen how you manage subscriptions, customise your records, and handle expense documentation. This month's highlights include a new one-time addon quoting workflow for subscriptions,
    • Next Page