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 #198: Using Client Script for Custom Validation in Blueprint

        Nearing 200th Kaizen Post – 1 More to the Big Two-Oh-Oh! Do you have any questions, suggestions, or topics you would like us to cover in future posts? Your insights and suggestions help us shape future content and make this series better for everyone.
      • 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

        • Recent Topics

        • Sub Folders

          It would be great if there could be sub-folders in reports. We have a ton of individual reports and folders that would be easier to navigate this way 
        • Zoho CRM Community Digest - November 2025 | Part 2

          Hello Everyone! Second half of November brought several exciting updates, especially around Zia, making AI assistance smarter, faster, and more context-aware. We also feature engaging community snippets highlighting members who went the extra mile to
        • Zoho CRM - Writing Assistant Tone

          Hi Zoho CRM Team, Text in my emails often gets underlined in yellow because I tend to use a more informal tone with my client's, like using "I'm" instead of "I am". Is there some way for me to tell the system that this is my preferred writing tone, so
        • Hide Contact Number for Field Users & Agents

          Is it possible to hide the contact number in both the Service Appointment and Work Order modules for field users and agents? The agents are using the Zoho FSM mobile app, and we want to restrict them from viewing the contact number.
        • Form Submission Emails

          Is there a current delay with submission emails being sent? We've had 10-20 forms completed today but only a handful of emails.
        • Subform edits don't appear in parent record timeline?

          Is it possible to have subform edits (like add row/delete row) appear in the Timeline for parent records? A user can edit a record, only edit the subform, and it doesn't appear in the timeline. Is there a workaround or way that we can show when a user
        • 【Zoho CRM for Everyone】設定画面のアップデート

          ユーザーの皆さま、こんにちは。コミュニティチームの藤澤です。 今回は「Zoho CRM アップデート情報」の中から、Zoho CRM for Everyone の設定画面のアップデート情報をご紹介します。 目次 設定ホーム画面の追加 設定画面での検索結果の表示形式の変更 設定画面でのよく使用する機能の表示 設定メニューの展開/折りたたみ状態の保持 1. 設定ホーム画面の追加 ホーム画面の設定項目は、直感的に分類できるように"カテゴリごと"で分けられています。 このような一元化された表示により、各ツールが1つの画面に集約され、必要な機能をより簡単に見つけられるようになりました。
        • What's New - November 2025 | Zoho Backstage

          A new month, a new set of updates. With a mix of new features and thoughtful improvements, you get smoother workflows and better control across registrations, exhibitors, and communications. Let's take a look at what's new and enhanced in Zoho Backstage
        • Zoho Checkout - Duplicate Customer record created for each payment received

          Hi All. We are using Zoho Checkout to capture online payments for a club membership form (in Zoho Forms). We've noticed that each new payment seems to create a new customer record, regardless of whether the customer already exists in the Zoho Finance
        • Templates for Zoho Desk - Knowledge Base

          We are looking at migrating our Knowledge base into Zoho Desk. Is there a way of creating templates for article in Knowledge base. We want to be able to set templates for certain types of content. Is this possible
        • Import KB template OR Export template for zoho desk?

          Greetings. Can you tell me if there is a way to get an EXPORT of my KB articles? OR is there a template you supply for importing KB articles into my zoho desk? I am looking for a method of understanding what fields can be imported, and what their possible
        • What KPIs Do You Use to Measure Your Support Team’s Performance in Zoho Desk?

          Hi everyone, We hope you’re all doing well. We are trying to improve how we measure the performance and effectiveness of our support department, and we would really appreciate learning from the community. We assume there are several common and widely-used
        • Backorder quantity change

          New Purchase Order × Almost there, but... Quantity of items in this purchase order is greater than the quantity that can be backordered from that sales order. Why can't I change the quantity of a backorder purchase? It looks like a normal order form and I would like to use it as one because I increased the amount and added some items. 
        • How to Associate multiple contacts with deal in Sales Inbox

          Hello, I have many deals that have multiple potential customers associated with a single deal, for example an engineer and a manager. The manager is the Deal's primary contact in CRM and the Engineer is added to the deal in the "Contact Roles" Associated
        • "code": "500","description": "Account not exists", mail api

          I have been through all the steps and have a functioning Oath access_token etc etc... I then GET https://mail.zoho.com/api/organization And get my zoid then GET http://mail.zoho.com/api/organization/<hidden>/accounts and get the account details, which
        • RTL Support for Webforms in Zoho CRM

          Dear Zoho CRM Support Team, We are writing to request an enhancement to the webform builder functionality within Zoho CRM. Currently, to create a webform in a right-to-left (RTL) language, the entire CRM instance must be set to RTL, which can be inconvenient
        • Imported contacts succesful but contacts do not show up in Contacts

          I imported +300 contacts. I can see them in import history. When clicking on a contact in import history I see all the imported contact details for any given contact. So import seems to be successful.   However the imported contacts do not show up in the contacts tab. Not in All contacts, and not in a filtered view where they absolutely should show up. The search function also does not find any imported contact.   Help?
        • Saving sent email campaign as PDF

          I'm looking to add all campaigns sent to an archive folder in sharepoint. Is there anyway to accomplish this in Zoho Flow ? I'm falling at the first hurdle ... can I automatically save a sent campaign as a PDF to a folder location ?
        • Zoho Voice lance BYOC (Bring Your Own Carrier) : intégrez votre opérateur

          Pour accompagner sa croissance, une entreprise a besoin d’une infrastructure téléphonique flexible et évolutive. Les solutions de téléphonie s’adaptent aux exigences du centre de contact, tout en intégrant aisément les opérateurs locaux de votre choix.
        • Zoho Social API for generating draft posts from a third-party app ?

          Hello everyone, I hope you are all well. I have a question regarding Zoho Social. I am developing an application that generates social media posts, and I would like to be able to incorporate a feature that allows saving these posts as drafts in Zoho Social.
        • Digest Novembre - Un résumé de ce qui s'est passé le mois dernier sur Community

          Bonjour chers utilisateurs, Avec l'arrivée du dernier mois de l'année, il est temps de résumer les activités de novembre dans la communauté Zoho France. Ce mois-ci, Zoho Webinar se dote de deux nouvelles intégrations ! La première est avec Zapier : connectez
        • E-Invoicing in Belgium with Zoho Books

          Starting January 1, 2026, Belgium is introducing mandatory electronic invoices (e-invoicing) for all B2B transactions between VAT-registered businesses. This means that invoices and credits notes must be exchanged in a prescribed digital format. How E-Invoicing
        • Announcing new features in Trident for Mac (1.30.0)

          Hello everyone! We’re excited to introduce the latest updates to Trident, bringing you a more seamless, intuitive, and secure communication experience. Let’s take a quick look at what’s new. Work with PST/EML files more efficiently. You can now do more
        • Open Form in Same window as Page from embedded Report

          I have a page that has an embedded report, as shown below. When I click the + sign to add a new record, the form shows up inside the page where the report was embedded. I know that I can add a custom action to the report grid or report detail view and
        • Pricing Strategies: #4 Counting on Discounts

          "Is there any chance I can get a little discount on this month's service?" Maya hears this almost every time at her fitness studio. She offers monthly subscription plans for various services, including yoga, strength training, wellness sessions, and personal
        • Introducing Query Workbench in Zoho CRM

          Hello everyone! We’re excited to announce the Query Workbench, a brand-new interface designed to improve developer experience of building Queries in Zoho CRM faster, simpler, and more intuitive. In the past, constructing queries required navigating across
        • Limitation with Dynamic Email Attachment Capture

          I've discovered a flaw in how Zoho Creator handles email attachments when using the Email-to-Form feature, and I'm hoping the Zoho team can address this in a future update. The Issue According to the official documentation, capturing email attachments
        • Add Customer in Books on Creator Form Submit Params

          Hi guys, Were integrating a creator app with books however what were doing is adding a books customer on submit of creator form.  We have some parameters but some fields aren't coping, All were seeing is the contact name in books,.  Any help of the params for this would be great. below is a sample of the script... response = zoho.books.createRecord("contacts", "XXXXXXXXX", { "contact_name" : input.Name, "address" : input.Email }); 
        • Weekly Tips: Protect Confidential Information with PGP in Zoho Mail

          We deal with confidential information almost every day, whether it is being sent out or received. Though emails sent using Zoho Mail are encrypted both during transit and at rest, attempts to access and steal your sensitive data are always a threat that
        • Suggestion : link KB with Accounts

          Hi Zoho teams.  I think it could be good to link KB articles with  : accounts in order to easily  find articles dedicated to some account specificities. I tried to use tags , but tags are free text with not easy way  to retrieve it directly from ticket or list article for one tag. Tickets : It would be a good way to measure usage of KB directly from ticket when we don't need to copy/paste KB in solution. And : Great Tool , keep going ! 
        • Drag and Drop in Creator Application

          Hi, I am in the planning phase of a new application and I would like to use 'Drag and Drop' in the user interface of my new Creator application that I am sketching out, but I don't seem to be able to find any reference that this is available to developers. In my instance I have table of entries and I would like to be able to allow users to move an entry to another table (much like you do in your own interface when creating a Pivot Table report. In addition, I would like the user to be able to re-order
        • Is there any way to integrate Zoho with Zapier?

          Is there any way to integrate Zoho with Zapier? I'd like to use it to create a workflow, sharing posts from our Wordpress website to all our channels.
        • Popular Articles Report

          From data to decisions: A deep dive into ticketing system reports Content management teams can use various metrics to assess the effectiveness of knowledge base articles, improve content quality, and ensure articles are regularly updated. Predefined article
        • Invoice Ref. Field

          Hello Team, Currently, the Invoice Ref. field is set to a Number type with a maximum limit of 9 digits. However, we often receive customer invoices that contain up to 12 digits. In some cases, the invoice reference includes not only numbers but also letters
        • 60 Days Into Zoho - Tiktok Branding Startup -7 Questions?!

          Wsp Everybody I co-own a TikTok Branding / Consulting Startup & have been using Zoho for the past 60 days - Am now looking to make our overall operations & processes more Efficient & Effective! Curious to know how others are using the platform & what's
        • Turning off the new UI

          Tried the new 'enhanced' UI and actively dislike it. Anyone know how to revert back?
        • XML format to import knowledgebase into Zoho Desk

          Hi, We just started to use Zoho Desk and want to import our knowledgebase from our old support system (Freshdesk) to Zoho Desk. Can anyone give us information about the format of xml file to import? There is no explanation on the related page.
        • Pushing Zoho People leave into Microsoft calendar: how to chose how "event" is shown (busy, free etc)

          Hi, how can I select how a "leave" event is pushed into Microsoft calendar? I want for leave "working elsewhere" to show as working elsewhere and NOT as busy.
        • Duplicate Accounts

          Hi There, I am looking for a solution, script, workflow or anything to solve an issue we have - in our customers section we have a rule that doesn't allow duplicates, however Zoho will allow customers with xxxxx and xxxxx PLC or LTD so effectivley we
        • Error with If formula

          I've got this super simple If formula, what is the reason for the error? If ( LEN(${Leads.Trial Slot Option}) == 3,'y','n') Syntax Error. Check the examples for any functions you're using to see if you formatted them correctly. Make sure your fields are
        • Next Page