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

    • Introducing Multi-Asset Support in Work Orders, Estimates, and Service Appointments

      We’re excited to announce a highly requested enhancement in Zoho FSM — you can now associate multiple assets with Work Orders, Estimates, and Service Appointments. This update brings more clarity, flexibility, and control to your field service operations,
    • [Product Update] Locations module migration in Zoho Books integration with Zoho Analytics

      Dear Customers, As Zoho Books are starting to support an advance version of the Branches/Warehouses module called the Locations module, users who choose to migrate to the Locations module in Zoho Books will also be migrated in Zoho Analytics-Zoho Books
    • Introducing Schedules for smarter availability management

      Greetings from the Zoho Bookings team! We’re excited to introduce Schedules, a powerful enhancement to manage availability across your workspace. Schedules are reusable working-hour templates that help you define and maintain consistent availability across
    • Why Zoho Contracts Prefers Structured Approvals Over Ad-hoc Approvals

      Approvals are one of the most important stages in a contract’s lifecycle. They determine whether a contract moves forward, gets revised, or needs further discussion. The approval process also defines accountability within the organization. Zoho Contracts
    • Whatsapp Connection Status still "Pending" after migration

      Hello, I migrated my WhatsApp API to Zoho from another provider a day ago. So far the connection status is still “Pending”. There is a problem? How long does it usually take?
    • 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
    • How to Filter timewise question to check uploaded one month or two months before in these community question ?

      i want to find the question that is asked some month or before any particular year, so how can i filter it ?
    • Proposal for Creating a Unique "Address" Entity in Zoho FSM

      The "Address" entity is one of the most critical components for a service-oriented company. While homeowners may change and servicing companies may vary, the address itself remains constant. This constancy is essential for subsequent services, as it provides
    • Workflow Down/Bug

      We have a workflow that sends an email to one of our internal departments 10 minutes after a record is created in a custom module. The workflow actually works correctly. However, we have now noticed that on January 8, between 3:55 p.m. and 4:33 p.m.,
    • Service Locations: Designed for Shared Sites and Changing Customers

      Managing service addresses sounds simple—until it isn’t. Large facilities, shared sites, and frequently changing customers can quickly turn address management into an operational bottleneck. This is where Service Locations deliver clarity and control.
    • Can I re-send the Customer Satisfaction Survey after a ticket closure?

      Hello, Some customers does not answer the survey right after closure, is it possible to re-send after a few days or weeks? Best Regards!
    • Filter contacts based on selected category in Zoho Desk ticket

      Hello community, I’m setting up the Tickets module in Zoho Desk and I need help implementing the following: When a category is selected in a ticket, I want the Contact field to be filtered so that it only displays contacts that are related to that category.
    • Mapping a new Ticket in Zoho Desk to an Account or Deal in Zoho CRM manually

      Is there any way for me to map an existing ticket in Zoho desk to an account or Deal within Zoho CRM? Sometimes people use different email to put in a ticket than the one that we have in the CRM, but it's still the same person. We would like to be able
    • Assign Income to Project Without Invoice

      Hello, Fairly new user here so apologies if there is a really obvious solution here that I am just missing... I have hundreds of small deposits into a bank account that I want to assign to a project but do not want to have to create an invoice every time
    • Tracking Non-Inventory Items

      We have several business locations and currently use zoho inventory to track retail items (sales and purchase orders). We were hoping to use zoho inventory to track our non-inventory items as well (toilet paper, paper towels, etc). I understand that we
    • Profile Page View Customization

      I need to change the fields, sections from the profile view of an emplyoyee.
    • Zoho Desk Android app update: Filter, Sort and Saved filters Enhancements

      Hello everyone! We are excited to introduce the below features on the Android version Zoho Desk mobile app: 1. Filter & Sort support has been introduced for the Contacts and Accounts modules. 2. Sort options is now available in Custom Modules as well.
    • Accessing shared mailboxes through Trident (Windows)

      Hi, I have a created a couple of shared mailboxes. The mailboxes are showing up on the browser based Zoho workplace, but I cannot seem to figure out how to access my shared inboxes through Trident (Windows). Am I missing something or is this feature not
    • Feature Request: Ability to set Default Custom Filters and apply them via URL/Deluge

      I've discovered a significant gap in how Zoho Creator handles Custom Filters for reports, and I'm hoping the Zoho team can address this in a future update. This limitation has been raised before and continues to be requested, but remains unresolved. The
    • Closing the Loop: Why Lookup Asymmetry is Harming Data Integrity in Creator

      TL;DR: Lookup fields allow users to add new related records inline via the "+" icon, but there's no equivalent ability to edit an existing related record without navigating away and losing form context. Adding a native "Edit" icon—with automatic User
    • filtering lookup field options based on information in another module.

      In our CRM system. We have the standard Accounts and Deals modules. We would like to introduce the ability to classify Accounts by Sector. Our desired functionality is to have a global list of all sectors that an Account can select, with the ability to
    • Service op locatie organiseren met Zoho FSM: waar lopen organisaties tegenaan?

      Bij organisaties met service teams op locatie merken we vaak dat de complexiteit niet zozeer in de planning zelf zit, maar in wat er rond die planning gebeurt. Denk aan opvolging na interventies, consistente servicerapporten, en het bijhouden van installaties
    • Introducing Assemblies and Kits in Zoho Inventory

      Hello customers, We’re excited to share a major revamp to Zoho Inventory that brings both clarity and flexibility to your inventory management experience! Presenting Assemblies and Kits We’re thrilled to introduce Assemblies and Kits, which replaces the
    • Does the ability exist to make tax on the customer profile mandatory?

      I am reaching out to inquire about the possibility of making the "Customer Tax" field mandatory when creating a new customer in Zoho. We want to ensure that all customers have their tax information recorded to maintain compliance with our internal processes.
    • Error AS101 when adding new email alias

      Hi, I am trying to add apple@(mydomain).com The error AS101 is shown while I try to add the alias.
    • email association with CRM

      Why is it 2024 (almost 2025) and Zoho has not figured out how to integrate email with CRM? It is so inconsistent at associating emails within CRM. I am an attorney. I have clients and work with other attorneys. Attorney John Doe is associated with multiple
    • Credit Note for Shipped and Fatoora pushed invoices

      We have shipped a Sales Order and created an Invoice. The Invoice is also pushed to Fatoora Now we need to create a credit note for the invoice When we try it, it says we need to create a Sales Return in the Zoho Books, we have already created a Sales
    • FSM - Timesheet entires for Internal Work

      Hi FSM Team, Several of my clients have asked how they can manage internal timesheets within Zoho FSM. Since their technicians already spend most of their day working in FSM, it would be ideal if they could log all working hours directly in the FSM app.
    • Add a way of clearing fields values in Flow actions

      It would be great if there was an option to set a field as Null when creating flows. I had an instance today where I just wanted to clear a long integer field in the CRM based on an action in Projects but I had to write a custom function. It would be
    • Role Management

      I am creating an analytics dashboard for a company that will be utilized by its various departments such as Finance, Marketing, and HR. My goal is to design the dashboard with separate tabs for each department. Additionally, I plan to implement role-based
    • Highlight a candidate who is "off limits"

      Hello: Is there a way to highlight a candidate who is "off limits"?  I would like to have the ability to make certain candidate and / or Client records highlighted in RED or something like that.   This would be used for example when we may have placed a candidate somewhere and we want everyone in our company to quickly and easily see that they are off limits.  The same would apply when we want to put a client or former client off limits so no one recruits out of there. How can this be done? Cheers,
    • Announcing new features in Trident for Windows (v.1.37.5.0)

      Hello Community! Trident for Windows just received a major update, with a range of capabilities that strengthen email security and enhance communication. This update focuses on making your mailbox safer and your overall email experience more reliable.
    • Early Payment Discount customize Text

      Hi, I’m currently using Zoho Books and am trying to customize the standard “Early Payment Discount” message that appears in the PDF invoice template. I’ve reviewed the documentation here: https://www.zoho.com/books/help/invoice/early-payment-discount.html
    • Deprecation of SMS-based multi-factor authentication (MFA) mode

      Overview of SMS-based OTP MFA mode The SMS-based OTP MFA method involves the delivery of a one-time password to a user's mobile phone via SMS. The user receives the OTP on their mobile phone and enters it to sign into their account. SMS-based OTPs offer
    • DKIM Now Mandatory - Changes to Zoho Forms Email Policies

      Hello Zoho Forms Users, This post is to inform you about an important update regarding the authentication of all email domains in your Zoho Forms account. This year, we are doubling down on our commitment to deliver a secure, seamless, and empowering
    • Call description in notes

      When completing a call, we type in the result of the call in the description. However, that does not show up under the notes history on the contact. We want to be able to see all the calls that have taken place for a contact wihtout having to go into
    • Email Address for Contact not Populating

      When I click "Send Mail" from a Contact's page, their email address does not auto populate the "To" field. How do I make this happen?
    • New in CRM: Dynamic filters for lookup fields

      Last modified on Oct 28, 2024: This feature was initially available only through Early Access upon request. It is now available to all users across all data centers, except for the IN DC. Users in the IN DC can temporarily request access using this form
    • Why hybrid project management might be the best fit for you?

      Project management techniques are designed to equip teams with proven methods for easy and efficient project execution. While management teams may have apprehensions about adopting the hybrid method of project management, we’ve compiled the top reasons
    • Allow all Company Users to view all projects, but only owner/admins can change projects

      I was wondering if there was a permission setting I could adjust to allow all our company users to see all projects created. Then, only the project owners and admins with the change permission. Thanks
    • Next Page