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

    • Google Fonts Integration in Pagesense Popup Editor

      Hello Zoho Pagesense Team, We hope you're doing well. We’d like to submit a feature request to enhance Zoho Pagesense’s popup editor with Google Fonts support. Current Limitation: Currently, Pagesense offers a limited set of default fonts. Google Fonts
    • Add Popup Rejection Metrics to Reports

      Hello Zoho PageSense Team, We would like to request improved reporting for popup interactions. Current Limitation: PageSense currently provides conversion data, but there is no clear visibility into: Popup rejections Popup closes (✕ button clicks) Dismissals
    • Ability to Reset / Reinitialize Popup Cookies

      Hello Zoho PageSense Team, We would like to request the ability to manually reset popup cookies. Current Limitation: At the moment, it is not possible to initiate a new popup cookie from the our side. Visitors who rejected or closed a popup will not see
    • Control Popup Cookie Expiration Duration

      Hello Zoho PageSense Team, We would like to request an enhancement related to popup cookie management. Current Limitation: Currently, PageSense popup cookies remain active for 365 days, and this duration cannot be modified by us. If a visitor closes or
    • Clone / Export Popup Design Across PageSense Projects

      Hello Zoho PageSense Team, We hope you’re doing well. We would like to request an enhancement that allows popup designs to be reused across different PageSense projects. Problem Statement: Currently, Zoho PageSense allows popups to be duplicated only
    • Are there settings for hyperlinks?

      Clicking a hyperlinked cell in Sheet creates this little pop-up with the actual hyperlink inside. Is it possible to have a 1-click link where if you click the cell it opens the link directly with no pop-up?
    • Automatically include all ticket attachments in the ticket resolution email

      Hello Zoho Community, We are implementing Zoho Desk in a real customer-facing production environment and have run into a limitation that is becoming a blocking requirement for our clients. The problem When a ticket is closed or resolved, Zoho Desk sends
    • Zoho Sheet for Desktop

      Does Zoho plans to develop a Desktop version of Sheet that installs on the computer like was done with Writer?
    • Finding text within a ticket: Expand All or Search this Ticket

      The auto-collapse feature within a ticket is nice for screen scrolling, however it makes it difficult to find text within the ticket if the email is collapsed. In fact you cannot find text if it is collapsed. I would like to propose a feature that allows
    • Books & Desk. Client mapping

      Hi, I’ve been using Zoho Books for several years and am now looking to improve my customer service. I'm experimenting with Zoho Desk and want to sync and map my client data from Zoho Books. However, it seems that mapping requires both contacts to have
    • String handling

      If I cut a currency string from a quote and try and paste it into the Deal "Amount", it will fail unless I manually delete any commas. Dollar signs are no problem, but comma's seem to fail. Please correct this Input Validation error.
    • Feature Request - Allow Customers To Pick Meeting Duration

      Hi Bookings Team, It would be great if there was an option to allow customers to pick a duration based on a max and minimum amount of time defined by me and in increments defined by me. For example, I have some slots which are available for customers
    • YouTube Live streaming? how to? Zoom has this feature, built-in. Can't find it on zoho meetings.

      YouTube Live streaming? how to? Zoom has this feature, built-in. Can't find it on zoho meetings.
    • Feature Request - A Way To Search Item Groups

      Hi Inventory Team, I can't find any way to filter or search by fields of Item Groups. It would be great to see that functionality added. I have a use case where a single product might come from 5 or more suppliers and each supplier's item is an Item in
    • Feature Reqeust - Include MPN In Selectable FIelds

      I have noticed that the MPN is not available to show in the list view of Items. Please consider adding it as EAN, UPC and ISBN are all available, so it doesn't make much sense to exclude this similar option. Thanks for considering my feedback.
    • Feature Request - Option To Hide Default System Fields on Items

      Hi Zoho Inventory Team, As far as I know it is not possible to hid some of the defult system fields on Items, such as UPC, MPN, EAN, ISBN. A good use case is that in many cases ISBN is not relevant and it would be an improved user experience if we could
    • Making an email campaign into a Template

      I used a Zoho Campaign Template to create an email. Now I want to use this email and make it a new template, but this seems to be not possible. Am I missing something?
    • Campaigns does not work!

      I am running into so many problems trying to use Zoho Campaigns, that I am seriously considering dropping the app from my (shrinking) list of Zoho applications I actually use. Apart from having to fight the software trying to create a design and email,
    • Feature Request - Make Available "Alias Name" Field In Item List View

      Hi Zoho Inventory Team, I have noticed that the "Alias Name" field does not appear on the list of selectable columns in the Customise Columns feature in the Items module. This would be very useful to see for businesses who are using the Alias Name field
    • Cliq iOS can't see shared screen

      Hello, I had this morning a video call with a colleague. She is using Cliq Desktop MacOS and wanted to share her screen with me. I'm on iPad. I noticed, while she shared her screen, I could only see her video, but not the shared screen... Does Cliq iOS is able to display shared screen, or is it somewhere else to be found ? Regards
    • How to filter Packages in zoho inventory api

      Hi Team, I want to perform some tasks in a schedular on the packages which are in "Shipped" state. I tried to use filter_by in my api call but in return I get response as {"code":-1,"message":"Given filter is not configured"} My Api request is as follows
    • CRM

      Is anyone else experiencing this issue? Our company is not moving out of using Gmail's web app. It just has more features and is a better email program than Zoho Mail. Gmail has an extension (Zoho CRM for Gmail) that we're using but we've found some serious
    • Syncing with Google calendar, Tasks and Events

      Is it possible to sync Zoho CRM calendar, task and events with Google Calendar's tasks and events. With the increasing adoption by many major tool suppliers to sync seamlessly with Google's offerings (for instance I use the excellent Any.do task planning
    • How can i view "Child" Accounts?

      It can be very useful in our field of business to know the parent-child account relationship. However, there seems to be a shortcoming in the parent account view: no child account list. How can we view the child accounts per each account?
    • Ability to assign Invoice Ownership through Deluge in FSM

      Hi, As part of our process, when a service appointment is completed, we automated the creation of the invoice based on a specific business logic using Deluge. When we do that, the "Owner" of the invoice in Zoho FSM is defaulted to the SuperAdmin. This
    • Easily perform calculations using dates with the new DATEDIF function

      Hey Zoho Writer users! We've enhanced Zoho Writer's formula capabilities with the new DATEDIF function. This allows you to calculate the difference between dates in days, months, and years. Function syntax: =DATEDIF(start_date, end_date, unit) Inputs:
    • Adding Comments Using Workflows - How to Change User Attributed

      We have worklflows in Desk where a comment is added to a ticket based on certain criteria. It seems that the comment added is always attributed to the user who last edited the workflow. This does not make sense for us because: - It's misleading to other
    • Add Attachment Support to Zoho Flow Mailhook / Email Trigger Module

      Dear Zoho Support Team, We hope you are well. We would like to kindly request a feature enhancement for the Mailhook module in Zoho Flow. Currently, the email trigger in Zoho Flow provides access to the message body, subject, from address, and to address,
    • Conect chat of salesiq with zoho cliq

      Is there any way to answer from zoho cliq the chat of salesiq initiated by customers?
    • Les dernières avancées en saisie de données et collaboration

      Après une année dédiée à la recherche et au développement, notre équipe est prête à dévoiler des améliorations majeures pour Zoho Sheet. Ces nouveautés seront lancées par étapes afin d’en assurer une prise en main optimale. Nous commençons avec des fonctionnalités
    • Rich Text For Notes in Zoho CRM

      Hello everyone, As you know, notes are essential for recording information and ensuring smooth communication across your records. With our latest update, you can now use Rich Text formatting to organize and structure your notes more efficiently. By using
    • Implement Meeting Polls in Zoho Bookings

      Dear Zoho Bookings Support Team, We'd like to propose a feature enhancement related to appointment scheduling within Zoho Bookings. Current Functionality: Zoho Bookings excels at streamlining individual appointment scheduling. Users can set availability
    • Zoho Bookings and Survey Integration through Flow

      I am trying to set up flows where once an appointment is marked as completed in Zoho Bookings, the applicable survey form would be sent to the customer. Problem is, I cannot customise flows wherein if Consultation A is completed, Survey Form A would be
    • Service Account Admin for API Calls and System Actions

      Hello, I would like to request the addition of a Service Account Admin option in Zoho product. This feature would allow API calls and system actions to be performed on behalf of the system, rather than an active user. Current Issue: At present, API calls
    • Please can the open tasks be shown in each customer account at the top.

      Hi there This has happened before, where the open tasks are no longer visible at the top of the page for each customer in the CRM. They have gone missing previously and were reinstated when I asked so I think it's just after an update that this feature
    • How to Customize Task Creation to Send a Custom Alert Using JavaScript in Zoho CRM?

      Hello Zoho CRM Community, I’m looking to customize Zoho CRM to send a custom alert whenever a task is created. I understand that Zoho CRM supports client scripts using JavaScript, and I would like to leverage this feature to implement the alert functionality.
    • Send Whatsapp with API including custom placeholders

      Is is possible to initiate a session on whatsapp IM channel with a template that includes params (placeholders) that are passed on the API call? This is very usefull to send a Utility message for a transactional notification including an order number
    • Add Israel & Jewish Holidays to Zoho People Holidays Gallery

      Greetings, We hope you are doing well. We are writing to request an enhancement to the Holidays Gallery in Zoho People. Currently, there are several holidays available, but none for Israel and none for Jewish holidays (which are not necessarily the same
    • Keep Zoho People Feature Requests in the Zoho People Forum

      Hello Zoho People Product Team, Greetings. We would like to submit a feature request regarding the handling of feature requests themselves, specifically for Zoho People. Issue: Feature Requests Being Moved to Zoho One Zoho People feature requests are
    • ZO25: The refreshed, more unified, and intelligent OS for business

      Hello all, Greetings from Zoho One! 2025 has been a remarkable year, packed with new features that will take your Zoho One experience to the next level! From sleek, customizable dashboards to an all-new action panel for instant task management, we’ve
    • Next Page