Kaizen 224 - Quote-driven Deal Reconciliation Using Zoho CRM Functions and Automation

Kaizen 224 - Quote-driven Deal Reconciliation Using Zoho CRM Functions and Automation


Hello everyone!
Welcome back to another instalment in the Kaizen series.

This post covers quote-driven deal reconciliation, emphasizing Functions and Automation to address practical sales challenges.

Business Challenge

Sales organizations often mark deals as Closed Won before commercial transactions fully conclude. Quotes generate promptly upon closure, yet businesses typically provide a brief window such as one week for renegotiation or payment. During this period, currency fluctuations, payment delays, and risk thresholds can significantly alter the final deal value.

This Kaizen demonstrates how Zoho CRM Functions and Automation work together to reconcile deal financials with quote activity over time. Sales, finance, and operations teams can thus access accurate, policy-compliant values.
Here is a typical sequence:
  1. Deal closes with Closed Won status
  2. Quote generates immediately
  3. Customer receives grace period (e.g., one week) for payment or adjustments
Key factors during this window:
  1. Exchange rates fluctuate
  2. Payments may succeed or fail
  3. Business absorbs limited losses(up to 10%, for example)
  4. Major variances trigger renegotiation
CRM must reflect actual outcomes rather than initial closure assumptions. Quotes serve as the authoritative commercial record, with final deal values depending on execution timing. This approach captures intermediate and final financial states to enable automated decisions and audits.

Key business scenarios covered

Scenario 1: Payment is made during the grace period

  1. Quote is generated on day 0
  2. Customer completes payment on day 7
  3. Exchange rate has changed since quote generation

Business Requirement

The business wants to calculate the actual payable amount using the exchange rate on the payment day and store it explicitly in CRM.

Outcome

The realized value is captured and stored, ensuring that reports and downstream systems reflect the true commercial result.

Scenario 2: Acceptable loss threshold (10%)

  1. Exchange rate movement results in a loss
  2. The business is willing to absorb losses up to 10%
  3. Loss exceeds the acceptable threshold

Business requirement

If the loss exceeds the defined tolerance, the quote should move to renegotiation instead of being accepted automatically.

Outcome

CRM enforces pricing policy consistently, without manual intervention or subjective judgment.

Scenario 3: Significant currency fluctuations

  1. Exchange rate volatility is unusually high
  2. Even if loss is within limits, risk exposure is significant

Business requirement

Large fluctuations should trigger renegotiation, regardless of absolute loss percentage.

Outcome

Financial risk is handled proactively based on measurable criteria.

Scenario 4: No payment after the grace period

  1. Customer does not pay within the allowed window
  2. Updated exchange rate is favorable to the business

Business Requirement

If the updated rate is profitable, the quote can be revised and reissued with the new amount.

Outcome

CRM reflects market-aligned pricing while maintaining transparency around why the amount changed.

Why Zoho CRM Functions is the best fit?

This reconciliation pattern requires the following capabilities beyond static configuration.
  1. Reading and reconciling data across Deals and Quotes
  2. Applying time-based and threshold-based business rules
  3. Writing calculated values into dedicated fields
  4. Supporting multiple decision paths(accept, renegotiate, revise)
  5. Running logic at specific business moments
Zoho CRM Functions provide the flexibility and control required to implement this logic cleanly, while automation ensures it runs consistently and reliably.

Custom fields used in this post

Deals

  1. Final Accepted Amount - Currency - Amount finally agreed and accepted
  2. FX Impact Percentage - Percent - Gain or loss due to exchange movement
  3. Reconciliation Status - Picklist - Accepted or Renegotiate
  4. Reconciled On - DateTime- Timestamp of final reconciliation

Quotes

  1. Quote Reference Amount - Currency - Amount at quote generation
  2. Quote Exchange Rate - Decimal - Exchange rate used in quote
  3. Payment Due Date - Date - End of grace period
  4. Potential Payable Amount - Currency - Recalculated amount at evaluation time
  5. FX Variance Percentage - Decimal - Difference vs quoted amount
  6. FX Evaluation Status - Picklist - Pending or Evaluated
  7. Recalculate FX - Checkbox - Explicit recalculation trigger
These fields capture commercial intent and outcome, not just static numbers.

High level automation flow

  1. Deal is marked Closed Won
    1. Workflow triggers a function to generate a Quote
  2. Business updates evaluation inputs when needed
  3. User explicitly triggers FX recalculation
  4. Function
    1. Calculates financial impact
    2. Updates quote and deal
    3. Applies business decisions
  5. CRM reflects finalized commercial reality

Function 1: Generate a Quote from the Deal

This function creates a Quote automatically when a Deal is closed, ensuring downstream processes start immediately and consistently.
void automation.generateQuoteFromDeal(int dealId)
{
deal = zoho.crm.getRecordById("Deals", dealId);
if(deal == null) return;

amount = deal.get("Amount");
exchangeRate = deal.get("Exchange_Rate");
account = deal.get("Account_Name");

productItem = Map();
productItem.put("product", {"id":"<PRODUCT_ID>"});
productItem.put("quantity", 1);
productItem.put("list_price", amount);

productList = List();
productList.add(productItem);

quoteMap = Map();
quoteMap.put("Subject", "Quote for Deal");
quoteMap.put("Deal_Name", dealId);
quoteMap.put("Account_Name", account.get("id"));
quoteMap.put("Product_Details", productList);
quoteMap.put("Quote_Stage", "Draft");
quoteMap.put("Valid_Till", zoho.currentdate.addDay(7));
quoteMap.put("Quote_Reference_Amount", amount);
quoteMap.put("Quote_Exchange_Rate", exchangeRate);

zoho.crm.createRecord("Quotes", quoteMap);
}

Function 2: Reconcile Deal from Quote

This function calculates payable values, evaluates financial impact, and updates the Deal with finalized financial information.
void automation.reconcileDealFromQuote(Int quoteId)
{
info "Starting FX reconciliation for Quote ID: " + quoteId;

// -------------------------------------------------
// Fetch Quote
// -------------------------------------------------
quote = zoho.crm.getRecordById("Quotes", quoteId);
if(quote == null)
{
info "Quote not found";
return;
}

dealInfo = quote.get("Deal_Name");
if(dealInfo == null)
{
info "Quote not linked to Deal";
return;
}

dealId = dealInfo.get("id");

deal = zoho.crm.getRecordById("Deals", dealId);
if(deal == null)
{
info "Deal not found";
return;
}

// -------------------------------------------------
// Mark FX Evaluation as PENDING
// -------------------------------------------------
zoho.crm.updateRecord(
"Quotes",
quoteId,
{"FX_Evaluation_Status" : "Pending"}
);

// -------------------------------------------------
// Read required FX inputs
// -------------------------------------------------
quotedAmount = quote.get("Quote_Reference_Amount");
quoteRate = quote.get("Quote_Exchange_Rate");
evaluationRate = quote.get("Evaluation_Exchange_Rate");

info "Quoted Amount: " + quotedAmount;
info "Quote Rate: " + quoteRate;
info "Evaluation Rate: " + evaluationRate;

if(quotedAmount == null || quoteRate == null || evaluationRate == null)
{
info "Missing required FX inputs";
return;
}

// -------------------------------------------------
// FX Calculations(rounded)
// -------------------------------------------------
payableAmount = (quotedAmount * evaluationRate / quoteRate).round(2);
fxVariance = (((payableAmount - quotedAmount) / quotedAmount) * 100).round(2);

info "Payable Amount: " + payableAmount;
info "FX Variance %: " + fxVariance;

// -------------------------------------------------
// Decide Quote Stage(Business decision here)
// -------------------------------------------------
quoteStage = "";
reconciliationStatus = "";

if(fxVariance <= 10)
{
quoteStage = "Acceptable FX Impact";
reconciliationStatus = "Accepted";
}
else
{
quoteStage = "FX Impact Exceeds Threshold";
reconciliationStatus = "Renegotiate";
}

// -------------------------------------------------
// Update Quote(Final state)
// -------------------------------------------------
quoteUpdate = Map();
quoteUpdate.put("Potential_Payable_Amount", payableAmount);
quoteUpdate.put("FX_Variance_Percentage", fxVariance);
quoteUpdate.put("FX_Evaluation_Status", "Evaluated");
quoteUpdate.put("Quote_Stage", quoteStage);
quoteUpdate.put("Recalculate_FX", false);

quoteResp = zoho.crm.updateRecord("Quotes", quoteId, quoteUpdate);
info "Quote update response:";
info quoteResp;

// -------------------------------------------------
// Update Deal
// -------------------------------------------------
dealUpdate = Map();
dealUpdate.put("Final_Accepted_Amount", payableAmount);
dealUpdate.put("FX_Impact_Percentage", fxVariance);
dealUpdate.put("Reconciliation_Status", reconciliationStatus);
dealUpdate.put(
"Reconciled_On",
zoho.currenttime.toString("yyyy-MM-dd'T'HH:mm:ssXXX")
);

dealResp = zoho.crm.updateRecord("Deals", dealId, dealUpdate);
info "Deal update response:";
info dealResp;

info "FX reconciliation completed successfully";
}

Workflow


Module: Quotes
Trigger: On create or edit
Condition: Recalculate FX = true
Action: Execute reconcileDealFromQuote
Argument: quoteId -> ${Quotes.id}

All decision logic lives inside the function.

Business Outcome

After implementing this pattern,
  1. Deals and quotes stay aligned with real-world behavior
  2. FX risk is measurable and auditable
  3. Renegotiation is policy-driven
  4. Reports reflect finalized values, not assumptions
  5. Sales and finance operate on the same truth.

Summary

Zoho CRM extends beyond static closures by reconciling deals against quote behavior. Functions plus Automation enforce pricing, limit exposure, and capture true outcomes reliably at scale.
The true value of this implementation is not the calculation itself, but the fact that it produces stable, auditable financial states that can be reused across reporting, approvals, integrations, and policy enforcement.

Further extensions

Executive reporting and dashboards

You can build Dashboards that answer questions like
  1. Total revenue before vs after FX reconciliation
  2. Total FX gain or loss by
    1. Region
    2. Currency
    3. Quarter
  3. Sales owner
  4. Percentage of deals renegotiated due to FX risk
Without the function,
  1. FX impact is implicit
  2. Numbers keep changing
  3. Finance does not trust reports
With the function,
  1. Final Accepted Amount is stable
  2. FX Impact % is explicit
  3. Reconciled On gives a time anchor

Policy enforcement and compliance

Examples
  1. Automatically flag deals where FX loss > 10% but status = Accepted
  2. Audit trail for
    1. Who recalculated FX
    2. When renegotiation was triggered
  3. SLA checks when Deals are not reconciled within 'X' days of quote creation
For many companies, FX policy violations are discovered at a later point in time, but you now enforce them at the moment of decision.

Sales coaching and deal hygiene

Unlock insights such as
  1. Which sales reps close deals with high FX volatility or frequently trigger renegotiation?
  2. Which regions or currencies produce unstable deals?
  3. Which deals are consistently over-optimistic at closure?

Other scenarios

  1. Approval and exception workflows
  2. Integration with ERP or accounting systems
  3. Predictive insights to forecast FX risk
  4. Historical snapshots for audit and analytics

We hope you found this post useful. Let us know your feedback in the comments or write to us at support@zohocrm.com.

Thanks!



=============================================================================



    • Sticky Posts

    • Kaizen #226: Using ZRC in Client Script

      Hello everyone! Welcome to another week of Kaizen. In today's post, lets see what is ZRC (Zoho Request Client) and how we can use ZRC methods in Client Script to get inputs from a Salesperson and update the Lead status with a single button click. In this
    • Kaizen #222 - Client Script Support for Notes Related List

      Hello everyone! Welcome to another week of Kaizen. The final Kaizen post of the year 2025 is here! With the new Client Script support for the Notes Related List, you can validate, enrich, and manage notes across modules. In this post, we’ll explore how
    • Kaizen #217 - Actions APIs : Tasks

      Welcome to another week of Kaizen! In last week's post we discussed Email Notifications APIs which act as the link between your Workflow automations and you. We have discussed how Zylker Cloud Services uses Email Notifications API in their custom dashboard.
    • 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
    • Kaizen #152 - Client Script Support for the new Canvas Record Forms

      Hello everyone! Have you ever wanted to trigger actions on click of a canvas button, icon, or text mandatory forms in Create/Edit and Clone Pages? Have you ever wanted to control how elements behave on the new Canvas Record Forms? This can be achieved
    • Recent Topics

    • Fail to send Email by deluge

      Hi, today I gonna update some email include details in deluge, while this msg pops up and restrict me to save but my rules has run for one year. can you tell me how to use one of our admin account or super admin account to send the email? I tried to update
    • Seeking help to be able to search on all custom functions that are defined

      Hello I have a lot of custom functions defined (around 200) and i would like to search some specific strings in the content of those. Is there a way to accomplish that? If not, is there a way to download all existing custom functions in some files locally
    • Totals for Sales Tax Report

      On the sales tax report, the column totals aren't shown for any column other than Total Tax. I can't think of a good reason that they shouldn't be included for the other columns, as well. It would help me with my returns, for sure. It seems ludicrous
    • Add Bulk Section / Grid Layout Duplicate Feature in Zoho Forms Builder

      Currently in Zoho Forms, users can only duplicate individual fields. There is no option to duplicate an entire section or two-column/grid layout with all internal fields. This becomes inefficient when building structured forms such as Family Details,
    • Leistungsdatum in Rechnungen (Zoho Books)

      Hallo, ist es irgendwie möglich den Leistungszeitraum in der Rechnung aufzuführen? Beste Grüße Aleks
    • Zoho Trident Windows - Streams Not Visible

      Namaste We’re having an issue with Streams not being visible in Trident (Windows), which is important for us as we share many emails internally. It appears that the feature to show Streams above the Inbox folder, as seen in the default mailbox view, is
    • Sales IQ Chat Widget is Only Displaying Last Name

      Can anyone suggest why the widget is only displaying "last name"?! We have the latest version of the wordpress plugin installed. Thanks Thanks!
    • Shopify - Item sync from Zoho Inventory

      Hi team, We’ve connected Shopify with Zoho Inventory. We want that when an item is created in Zoho Inventory, it must create a product in Shopify. But currently, new items created in Zoho Inventory are not getting created in Shopify even after clicking
    • Bulk upload image option in Zoho Commerce

      I dont know if I am not looking into it properly but is there no option to bulk upload images along with the products? Like after you upload the products, I will have to upload images one by one again? Can someone help me out here? And what should I enter
    • Is it possible to setup bin locations WITHOUT mandating batch tracking?

      Hi fellow zoho users, I'm wondering if anyone else has a similar issue to me? I only have some products batch tracked (items with shelf life expiry dates) but I am trying to setup bin locations for my entire inventory so we can do stock counting easier.
    • Kill zoho meeting

      Saying the quiet part out loud. Can zoho please just give up on the idea that they can make a meeting platform and just make our workplace licenses cheaper when you remove it so people can switch to zoom or teams. Tired of the excuses, you guys cant make
    • Utilisation de Zoho en conformité avec l’article 286 du Code général des impôts (CGI)

      Cher(e) client(e), Conformément à l’article 286 du Code général des impôts (CGI) impose aux entreprises assujetties à la TVA d’utiliser des systèmes de caisse ou de gestion commerciale certifiés lorsqu’elles enregistrent des ventes à des particuliers.
    • Unable to Create Task as a Support Administrator

      Hello! I want to ask for help regarding creating tasks within the tickets. I am by default the Support Admin. I should be able to create tasks or activities right? But there's a prompt that I need to contact the Administrator. See photos for reference.
    • Introducing Forms in Zoho Sheet

      We hereby bring you the power of ​forms in Zoho Sheet. ​Now, build and create your own customized forms using Zoho Sheet. Be it compiling a questionnaire or rolling out a survey, Zoho Sheet can do it all for you. Forms is an excellent feature that helps you collect information in the simplest of ways and having it in Zoho Sheet takes it a notch higher. Build Simple yet Powerful forms Building forms using Zoho Sheet is fairly simple. The exclusive 'Form' tab lets you create one quickly. Whether you
    • Layout one survey question in a time & redirect next Page based on previous response

      I have doubt while, I am scripting survey on the Zoho where I redirecting to next page based on my previous response but didn’t get success on this. Please help me on this and tell me how I layout one survey questions in a time when I submit response
    • Zoho Bookings form pre-filled with Zoho Forms in

      Hi, I've got a contact page on my website and I'd like to have the option to book an appointment (redirected to zoho bookings page) after an option is submitted on the contact form. how would I go about doing this? thanks
    • Support “Other” Option with Free Text in Dropdown Fields

      Hello Zoho Bookings Team, Greetings, We would like to request an enhancement to the registration form fields in Zoho Bookings, specifically for dropdown fields. Current Limitation: At the moment, dropdown fields do not support an “Other” option that allows
    • Sending automated messages that appear in the ticket's conversation thread

      Good morning, esteemed Zoho Desk community, warm greetings Today I am here to raise the following problem, seeking a solution that I can implement: I need to implement an automation that allows me to send reminder messages to customers when I am waiting
    • Introducing parent-child ticketing in Zoho Desk [Early access]

      Hello Zoho Desk users! We have introduced the parent-child ticketing system to help customer service teams ensure efficient resolution of issues involving multiple, related tickets. You can now combine repetitive and interconnected tickets into parent-child
    • Payment Card or Identity form-fill from Vault?

      Hello! I'm working on replacing Bitwarden with Vault and one issue I've run into is that I can't find any option to fill address and payment forms from Payment Card or Identity info that has been saved in Vault. Is there a way to do this? Is it a planned
    • Ability to add VAT to Retainer Invoices

      Hello, I've had a telephone conversation a month ago with Dinesh on this topic and my request to allow for the addition of VAT on Retainer Invoices.  It's currently not possible to add VAT to Retainer Invoices and it was mutually agreed that there is absolutely no reason why there shouldn't be, especially as TAX LAW makes VAT mandatory on each invoice in Europe!   So basically, what i'm saying is that if you don't allow us to add VAT to Retainer Invoices, than the whole Retainer Invoices becomes
    • Time Log Reminder

      Tracking the time spent on tasks and issues is one of the most important functions of a timesheet. However, users may forget to update the time logs because they have their own goals to achieve. But, time logs must be updated at regular intervals to keep
    • [Early-access] Introducing Zoho's CommandCenter - Cross-Zoho business process automation

        Resources to help Webinar recording | Documentation  Feature Restrictions Currently available on early-access only for US data center accounts Features Role CommandCenter as a Service uses signals across Zoho services to propel the movement of records
    • Tip #58- Accessibility Controls in Zoho Assist: Learning- 'Insider Insights'

      Learning should be clear and interruption-free for everyone. Timely feedback plays an important role in helping users understand actions as they happen, without breaking their focus. In this post, we’ll explore the final section of Accessibility: Learning.
    • ZIA "Generate Content" action doesn't have contexual data from the ticket

      "Generate Content" action doesn't have contexual data from the ticket. I try to get AI to help me with this ticket but it doesn't seem to have any ticket information as context. Although the ticket has a lot of information in it.
    • Zoho Desk - Zoho FSM Integration issue on Mobile and iPad

      Hello Team, I am trying to create a Work Order (WO) using the Zoho FSM integration (Add-on Service) that is integrated with Zoho Desk. The issue is that the integration is not working on mobile devices and iPads. While I am able to create the WO, Request,
    • E-File Form 1099 Directly With the IRS From Zoho Books

      The Form 1099 filing season has begun, and businesses are required to e-file certain forms with the IRS to report payments made to vendors and contractors. If your business made qualifying payments during the year, you must e-file the appropriate Form
    • Suggestions for showing subscribed Topics in CRM (contact record)

      We have several Topics set up in ZMA. We also have a sync set up between ZMA and CRM. I'd like to display the subscribed topics on the CRM Contact record. This will allow the Sales team (who uses CRM) to see at a glance what topics a Contact is subscribed
    • Replies sometimes creating separate ticket

      Sometimes when a customer responds to an email coming from Zoho Desk, instead of adding a reply to the original ticket, a separate ticket is created. This happens even though the response subject line contained the ticket number, and the person responding
    • Re-hide fields when option is unselected

      Hi all Can anyone help me with this - when I create a 'show' field rule for when a dropdown option is selected, how to I make it so the 'show' option re-hides if that option is no longer selected?
    • Custom Fields

      There is no way to add a custom field in the "Timesheet" module. Honestly, the ability to add a custom field should be available in every module.
    • Consultant-Only Booking Page

      Zoho Bookings does not allow for Meeting Type OR Workspace-Wide booking pages to be turned off. This is detrimental to organizations that have territory-based or assigned accounts, because if prospects can go to these booking pages and either select the
    • Call result pop up on call when call ends

      I’d like to be able to create a pop up that appears after a call has finished that allows me to select the Call Result. I'm using RingCentral. I have seen from a previous, now locked, thread on Zoho Cares that this capability has been implemented, but
    • Custom Sorting based on other columns in table

      I need the ability to apply custom sorting to a text-based dimension in the X axis where the sorting is based on another column in the table. For example, I have a chart report where the X axis is a text label. I would like to be able to sort those text
    • Feature Request: Enable Custom PDF Layout Editor for All Modules (Including Package Slips)

      Hello Zoho Community and Product Team, I am writing to share a suggestion that would significantly enhance the customization capabilities within Zoho Books. We all appreciate the power of the Custom PDF Layouts (the "New" template engine) that allows
    • Is there a way to invoke deluge function from within a widget?

      Hi! I have custom functions in deluge and I was wondering whether there is any way to call this function through a widget? Something like on click of a button inside a widget, run the deluge custom function. Would this be possible?
    • Can a default task Priority be set?

      The "Priority" field in the Task layout does not allow a default to be set. Is there another way of doing it? Because the current default is "None" and the Zoho Kanban board design has selected this field as critical information to surface by including
    • Adding a threshold to a line chart based on date range

      I have a line chart that is tracking a percentage over time. It also has a filter for 50 different clients. I would like to create a threshold that is based on a portion of the date range. As I understand it, this would be done by adding a column to the
    • Resize Signature field dynamically

      On the tablet, it is perfect. But on smaller mobile devices and PCs, both web and application, it is too small for people to sign. Is there any plan to make the signature field size dynamically in the future update?
    • Super Admin Logging in as another User

      How can a Super Admin login as another user. For example, I have a sales rep that is having issues with their Accounts and I want to view their Zoho Account with out having to do a GTM and sharing screens. Moderation Update (8th Aug 2025): We are working
    • Next Page