Hello everyone!
Welcome back to the Kaizen series!
Discount approvals are a standard part of sales governance.
Most organizations need something like this:
Discount % | Required Action |
< 10% | Auto-approve |
10–19.99% | Sales Manager approval |
≥ 20% | VP Sales approval |
Zoho CRM already includes a powerful
Approval Process feature capable of routing records, locking them, notifying approvers, and maintaining audit history.
So the natural question is "Isn’t the native Approval Process enough?". Often, yes. But when the discount logic depends on accurate percentage calculation across line items and header adjustments, we need a small architectural enhancement.
This Kaizen combines Functions(for decisions), Workflow Rules(for triggers), Approval Process(for governance), and Reporting Hierarchy(for routing) into a clean, scalable solution.
Understanding the native Approval Process
Before adding anything custom, it’s important to recognize what the Approval Process already does extremely well.
- Evaluates criteria based on field values
- Automatically submits records
- Locks records during review
- Routes to users, roles, or hierarchy levels
- Maintains approval history
- Sends notifications
It is a powerful governance engine.
However, it evaluates existing values and does not calculate new ones. That distinction matters in discount scenarios.
The missing piece: Reliable discount percentage
In Quotes:
- Discounts may be applied at line-item level
- Discounts may be applied at header level
- Grand Total reflects cumulative adjustments
There is no guaranteed native field that consistently represents
True Discount % = (Sub_Total - Grand_Total) / Sub_Total * 100
If approval rules rely directly on partial fields(like “Discount”), they may misrepresent the effective discount.
To ensure accuracy, we introduce a Function to calculate and store a reliable Discount Percentage.
We are not replacing the Approval Process, but preparing accurate data for it.
Here is the architectural flow with each component having a distinct responsibility. This makes the system sustainable.
Quote Saved --> Workflow triggers Function --> Function calculates Discount % --> Function sets Approval_Status --> Approval Process evaluates status --> Record submitted and locked |
Let's go over this one step at a time.
Step 1: Create Custom Fields(Quotes Module)
Field | Type | Purpose |
Discount_Percentage | Percent | Stores calculated discount |
Approval_Status | Picklist | Controls approval trigger. Values:
- Auto Approved
- Pending Manager Approval
- Pending VP Approval
- Approved
- Rejected
|
| Approval_Level | Single Line | Displays routing level |
Step 2: Write the CRM Function(Decision Layer)
This function calculates the effective discount and determines the approval level. This function becomes the decision engine.
void automation.Set_Quote_Approval_Level(String id) { quoteId = id.toLong(); quoteDetails = zoho.crm.getRecordById("Quotes",quoteId); if(quoteDetails != null) { subTotal = ifnull(quoteDetails.get("Sub_Total"),0).toDecimal(); grandTotal = ifnull(quoteDetails.get("Grand_Total"),0).toDecimal(); discount = subTotal - grandTotal; discountPercentage = 0.0; if(subTotal > 0) { discountPercentage = discount / subTotal * 100; } approvalStatus = ""; approvalLevel = ""; if(discountPercentage < 10) { approvalStatus = "Auto Approved"; approvalLevel = "None - Auto Approved"; } else if(discountPercentage < 20) { approvalStatus = "Pending Manager Approval"; approvalLevel = "Sales Manager"; } else { approvalStatus = "Pending VP Approval"; approvalLevel = "VP Sales"; } updateMap = Map(); updateMap.put("Discount_Percentage",discountPercentage.round(2)); updateMap.put("Approval_Status",approvalStatus); updateMap.put("Approval_Level",approvalLevel); updateResponse = zoho.crm.updateRecord("Quotes",quoteId,updateMap); } } |
Step 3: Workflow(Trigger Layer)
Every time a quote is saved, we want the discount to be evaluated automatically.
Create the following Workflow Rule:
Module: Quotes
Trigger: On Create or Edit
Action: Execute Function
Map the Quote ID with the "id" argument in the function.
Step 4: Approval Process(Governance Layer)
Rule 1 - Manager Approval when Discount% is 10 to 19.99
Approval_Status = "Pending Manager Approval" --> Route to Sales Manager(via hierarchy)
Rule 2 - VP Sales Approval when Discount% >= 20
Approval_Status = "Pending VP Approval" --> Route to VP Sales(via hierarchy)
When this process is triggered, CRM:
- Submits the record for approval
- Locks it
- Sends notification
- Tracks approval history
The outcome
Why is this layered approach strong?
This design works well because each component in the system has a clearly defined responsibility. The CRM Function acts as the decision layer. It performs the discount calculation, determines the appropriate approval level, and updates the control fields. This ensures that the logic behind the approval requirement is accurate and intentional.
The workflow serves as the trigger layer. Its only job is to execute the function whenever a quote is created or edited. It does not contain business logic; it simply initiates the evaluation process at the right time.
The approval process becomes the governance layer. Once the function sets the appropriate status, the approval engine evaluates the criteria, submits the record, locks it, routes it to the correct approver, and maintains the approval history. This is where enforcement happens.
Finally, the reporting hierarchy determines who the approver is. Instead of hard-coding specific users, the system dynamically identifies the appropriate manager or second-level supervisor based on the role structure. This keeps the design scalable and adaptable to organizational changes.
By separating calculation, triggering, enforcement, and routing into distinct layers, the solution remains clean, maintainable, and easy to extend. The Approval Process continues to do what it does best—govern and enforce—while the Function ensures that the decision it evaluates is accurate and business-driven.
Summary
Zoho CRM’s native Approval Process is powerful and reliable.
When business logic depends on calculated values, like true discount percentage, introducing a function strengthens the design by ensuring accurate, consistent decision-making.
Used together, Functions and Approval Process create:
- Intelligent routing
- Accurate governance
- Clean audit trails
- Scalable architecture
That combination is what makes this solution robust.
We hope you liked this post. We'll see you next week with another interesting one!
Write to us at
support@zohocrm.com or let us know your feedback in the comments section of this post.
Cheers!
==========================================================================
Recent Topics
Best Practice for Penny Rounding & FX Adjustments in Zoho Books
Hi everyone, I’m just looking for some clarity on the correct way to handle very small rounding differences in Zoho Books when dealing with foreign-currency payments. What I’m currently doing: • I enter the supplier bill exactly as shown. • When paying
Is there a problem with sharing workdrive files with links since last night?
As per title, we can't access folders/files through share links since last night. I created ticket but we need quick solution and didn't hear back from the support yet. The files are still accessible by the main account but all zoho files that we are
Enable Screen Recording in Zoho WorkDrive Mobile Apps (Android & iOS)
Hi Zoho WorkDrive Team, How are you? We are enthusiastic Zoho One users and rely heavily on Zoho WorkDrive for internal collaboration and content sharing. The screen-recording feature in the WorkDrive web app (similar to Loom) is extremely useful- however,
Production Management Tool (MRP / BOM)
Hi Guys, is there any recommended App available that works with zoho and covers the needed applications for a production? What we need is a system that covers the BOM (bill of materials), MRP (material ressources planning), MRP II (manufacturing ressources
Bug in Zoho Cliq Signup Flow – "%s" Placeholder Visible Instead of Product Name
Hi Zoho Team, I would like to report a UI bug in the Zoho Cliq signup/enable flow. During the step where Cliq asks to enable the product for the company, the following text appears: Great! Your company is already available in Zoho, so you just have to
Exporting tickets
I went to Setup -> Organization -> Import/Export in order to export tickets but found 2 issues: 1. The email body never gets exported. 2. There are some large numbers (like 5.57E+16) under certain columns of the exported CSV file. I could not find any export options. Please can you help with this?
Copy field information to clipboard
I need to be able to transfer some field information in to the clipboard, so that I can then paste it in to our helpdesk system. Is there a way I could add a button to a detail report that does this?
Issuing reconciling a bank statement
HELP! I'm trying to reconcile a bank statement. The prior month reconciled perfectly. Beginning balance is correct yet I'm off by the same amount each time. Both myself and my office manager, separately and together, have tried to complete this reconciliation
Detect and ignore bots in visitors
The SalesIQ visitor numbers are basically useless to us because there is no bot detection. We get the same bots coming in from the same countries looking at the same pages every day. It can't be that difficult to tell the difference between an actual
Add Real-Time Microphone Audio-Level Indicator During Screen Recording
Hi Zoho WorkDrive Team, Hope you are doing well. We would like to request an important enhancement to the Zoho WorkDrive screen-recording experience. Current Limitation: During a recording session, there is no visual indication that the microphone is
Zero Personalization of the File Sharing Experience
By now (2025) this is the maximum level of personalization available for a Zoho sharing link. We gently asked Zoho if we could modify at least the background, and they replied that it cannot be customized. We're truly disappointed – and surprised every
Request for Solution to Reverse $500,000+ FY2024 Inventory/COGS Discrepancy in Zoho
Dear Zoho Support Team, I hope you are doing well. We are contacting you regarding a significant discrepancy in our financial data within Zoho Books/Inventory, and we urgently need your guidance on how to correct and reverse these issues. After reviewing
Two factor authentication for helpdesk users
The company i work for wants use the helpdesk site in Zoho desk, as a place for their distribution partners to ask question and look for information about our product. The things there is suppose to go up there is somewhat confidential between my company
Kiosk can't merge picklist or multiselect
There is no ability to load a multiselect or picklikst field into a kiosk with the values that have been previously selected. So, I essentially have 3 unacceptable options: 1.)Load the value into a text string and include instructions like this: "Picklist
AGE field from DATE OF BIRTH Field.
HI! I have a field called date of birth in my CRM (LEADS, CONTACT etc…) How can I know the AGE today I would like to create a field AGE. I now how to create a field but I don´t which calculation (CUSTOM FUCTION) to make ¿ANY HELP?
How to update/remove file in zoho creator widgets using javascript API
Hi Team, I have developed a widget which allows inserting and updating records I have file upload field with multiple file upload. Now while doing insert form record, I am using uploadFile API to upload files for that record. I am using updateRecord API
Announcing new features in Trident for Windows (v.1.34.4.0)
Hello Community! Trident for Windows just got better! With this update we have features that make your daily work easier and more efficient. We've added some features that are exclusive to our app and we're sure you'll find them useful. Let’s dive into
Report Hover Setting
Would be great if we will able to show information to the user while hovering a record in a report.
Vertical images displayed as horizontal
Some pictures that originally are in vertical position are displayed in horizontal after the upload. It seems that system rotates them by 90 degrees. How can I fix this issue?
Plug Samples #12: Verify Customer Mobile Numbers with OTP to Avoid Spam Entries
Hi Everyone! Verifying customer information is critical in business to filter out junk data and spammers. Whether it’s lead generation, appointment booking, or any other operation, ensuring quality data is essential for driving meaningful outcomes. A
Zoho Desk iOS app update: Saved filters and sort options
Hello everyone! Saved filters created on the web(desk.zoho.com) for tickets are now accessible on the Zoho Desk iOS app. You can easily rename, delete, or clear filters on the go. We have also introduced Sort options on the ticket listing screen, allowing
Big Things Just Dropped in the SalesIQ Universe: Top Upgrades You’ll Love in Nova’25
Nova'25 has landed, and it’s packed with meaningful upgrades to help you engage smarter, work faster, and scale with ease. Whether you're into proactive messaging, smarter automation, or better admin control, there's something here for everyone. Here's
Time Entries in Analytics
I am trying to import a zoho sheet into zoho analytics. In my sheets one of the columns has "time Entries" in this "format HH:MM am/pm" example 11:00 PM. After import, i noticed that analytics converted the time to "00 Jan 1900 23:00:00".. how do i maintain
Amazon invoice in Zoho Books
I have just made my first few sales on Amazon India. Amazon Seller account generates invoices for the sales made on Amazon. These invoices are sent to customers also. Now when I was only making offline sales, I used to create Invoices in Zoho Book. Now
Zoho Creator Upcoming Updates - November 2025
Hello everyone, Welcome to your monthly roundup of new features and enhancements! We hope you've already taken a look at Release Projection 2—it details the features coming your way for the rest of the year. And this month, we're excited to start rolling
Zoho Webinar + HubSpot : Simplifiez la gestion de vos données de webinaires
Les webinaires sont aujourd’hui essentiels pour interagir avec vos prospects et vos clients. Cependant, la gestion des données entre plusieurs plateformes peut vite devenir complexe. Grâce à la nouvelle intégration entre Zoho Webinar et HubSpot, vos outils
I am trying to give access to one of our educators access to 3 forms in Zoho and she is not able to view the data - Access issue
Hi Team, When I try to provide read access to one of our educators on Zoho for Pre-training , post training and Impact survey forms submit form access which also allows them to read , it does not show them data
How to book GST paid in zoho books
hi, i am a new user to Zoho books and not able to book GST paid in books, kindly suggest how i can book it in books. thanks, siddharth
PUNJAB NATIONAL BANK (CORPORATE) INDIA - NOT AVAILABLE IN BANKING
Dear sir, Kindly fix it. PUNJAB NATIONAL BANK (INDIA) is available but PUNJAB NATIONAL BANK (CORPORATE) is not available. Kindly enable this banking since we need to categorize the entries. Regards, Sanjay Jena email id/ user id : travewithmerchant@
Unable to Delete Items – No Visible Transactions but Error “Items which are a part of other transactions cannot be deleted…”
Hello Community, We are using Zoho Inventory for our business and encountered a persistent issue that is preventing us from deleting certain items. The message shown is: “Items which are a part of other transactions cannot be deleted. Instead, mark them
Kaizen #216 - Actions APIs : Email Notifications
Welcome to another week of Kaizen! For the last three weeks, we have been discussing Zylker's workflows. We successfully updated a dormant workflow, built a new one from the ground up and more. But our work is not finished—these automated processes are
Your bot just got smarter: AI-Powered routing that reads between the lines
What if your bot could tell the difference? Between a visitor who just needs a quick answer, someone actively comparing options, and a frustrated customer one click away from leaving? Most bots can't. They deliver the same response to everyone, missing
Weekly Tips : Master Keyboard Shortcuts in Zoho Mail
If you spend a lot of time managing emails, switching between your mouse and keyboard can slow you down. Whether you are replying to clients, organizing your inbox, or searching for messages, every second counts. So, how can you streamline your email
Introducing custom lookup fields in the Tickets, Contacts, and Accounts modules
Hello all, We are excited to announce a new enhancement that will empower you to further customize the Tickets, Contacts, and Accounts modules. Now, you will be able to create custom lookup fields in your Tickets, Contacts, and Accounts layouts for more
DKIM cannot be enabled for the domain as no verified default selector present
Can't get the DKIM working. May you please check my account (nksy.us) to see what's wrong?
Collections Management: #3 Tackling Payment Failures
Sam refreshed the dashboard. "Payment failed". Same customer. Same subscription. This is happening for the third time. He sends a usual email: "Your renewal payment failed again. Could you please check and retry?" A couple of days passed, and there was
How do I increase the email attachment size in Zoho CRM ?
It looks like I'm limited to 10MB when sending an attachment using the email widget on a record in Zoho CRM. Is there a way to increase the size? Or can I use some other tool? From what I'm reading online, I'm maxed out at 10MB. Any insight would be greatly
Zoho sign and creator error message {"code":9043,"error_param":"Checked by","message":"Extra key found","status":"failure"}
Good day, I receive the error message: {"code":9043,"error_param":"Checked by","message":"Extra key found","status":"failure"} when running below code from creator to sign, void TestForSign(int ID) { //Fetch Template Details (Optional, for dynamic mapping)
Download a writer template as .docx instead of .pdf.
I have been trying to implement a feature to download a writer template as a .docx and got it working partly but it isn't good. Earlier I checked our code and I saw openurl("https://crm.zoho.com/crm/org121314/specific/Template.do?action=print&step=pdfPreview&id="
Allow the usage of Multi-Select fields as the primary field on "Layout Rules"
We want to force our users to enter some explanation strings when a multi-select field has been utilized. I can't understand the reason for the usage restriction of Multi-Select fields as a primary field. This is a simple "Display hidden mandatory field
Next Page