User Tips: Adding Multiple Products (Package) to a Quote v2.0 (with Client Script)

User Tips: Adding Multiple Products (Package) to a Quote v2.0 (with Client Script)

This solution is an improvement on the original idea which used deluge. My solution was posted in the comments are: https://help.zoho.com/portal/en/community/topic/adding-multiple-products-package-to-a-quote

The updated version uses client script instead of deluge.

Hopefully this might help a few people. It helps our reps speed up the process of creating quotes and quoting accurately.

Details below:


Problem:

We run numerous manufacturer promotions with various bundled items and discounts. Reps struggle to remember all details, leading to incorrect discounts on quotes.


Solution

I created a custom module for Product Packages. For each promotion, we create a "Package" including all products, discounts, and start/end dates. A quote lookup field allows users to select a package, automatically adding the related products with accurate pricing and information.

When a user selects a package, a client script retrieves all related products and discounts, adding them to the quote. The lookup field is then reset for additional product entries.

Some fields on the package layout include:

  1. Promotion type
  2. Status
  3. Start / End dates for the promotion. 
  4. Pop-up message field if we want to show the rep a message when quoting the package

I also have a workflow that sets the package to “Expired” when the record expiration date hits. The lookup is filtered in the quotes module to only show “Active” packages.

In Action (with lookup field to the package module):



The Setup:
Create a custom module “Package Items”. Add the fields as below. 



Additional Info
1. I also use client script to hide the “Auto-Quote” field when in a standard view page
2. When I name a package, a deluge script runs to append the Package ID number which is an auto-number field.


The Code: 

  1. try {
    // List of funny loading messages
    var loadingMessages = [
    "Cranking up the quote machine...",
    "One sec... just stepped out for coffee.",
    "Hold tight! The hamsters are running the wheels.",
    "Almost there... giving it a little extra attention.",
    "Loading... probably faster than your internet speed.",
    "Please hold while we make magic happen.",
    "Just a moment... our servers are stretching their legs.",
    "Your patience is appreciated... and rewarded!",
    "Brewing up your quote right now...",
    "Give us a second... we're flexing our technical muscles.",
    "Our system is doing some yoga... stay calm!",
    "Loading... don't worry, it's not stuck!",
    "Fetching your data... hopefully with no detours!",
    "Keep calm and let us handle the rest.",
    "Processing... taking a coffee break, be right back!",
    "Stay tuned... greatness is loading.",
    "Our system is running... faster than a cheetah!",
    "Looks like you're going all in on this quote!",
    "Getting things ready... just need a moment.",
    "Hold on... we're aligning some stars for you.",
    "Please wait... we're feeding the server squirrels.",
    "One moment... your quote is coming fresh out of the oven.",
    "Loading... just making sure everything is perfect!",
    "Generating your quote... thanks for your patience!",
    "Almost there... your quote is worth the wait!"
    ];

    // Select a random message from the list
    var randomMessage = loadingMessages[Math.floor(Math.random() * loadingMessages.length)];

    // Log the entire value object to see its structure
    log("Full value object: " + JSON.stringify(value));

    // Ensure value.id is defined before proceeding
    if (!value || !value.id) {
    log("No product selected or value.id is undefined");
    return; // Exit the script quietly since no valid product was selected
    }

    // Show loader
    ZDK.Client.showLoader({ type: 'page', template: 'vertical-bar', message: randomMessage });

    // Extract the product ID and name from the value passed in
    var packageId = value.id;
    var packageName = value.name;
    log("Product ID: " + packageId);
    log("Package Name: " + packageName);

    // Get the subform field from Quotes module
    var quotedItemsSubform = ZDK.Page.getField("Quoted_Items");

    // Fetch product information for the package ID
    var packageDetails = ZDK.Apps.CRM.Auto_Quote_Packages.fetchById(packageId);


    var packageStatus = packageDetails.Status; // Active or Expired.
    var popUpMessage = packageDetails.Pop_Up_Message; // Check the package for any Pop-up message we want to show
    log("Package Details: " + JSON.stringify(packageDetails));
    log("Package Status: " + packageStatus);
    log("Pop-Up Message: " + popUpMessage);

    // Initialize array for existing line items.
    var existingLineItems = quotedItemsSubform.getValue() || [];
    log("Existing line items: " + JSON.stringify(existingLineItems));
    //
    // Only include rows with products. Excude any blank rows from the quote
    var filteredExistingLineItems = existingLineItems.filter(function(item) {
    return item.Product_Name && item.Product_Name.id;
    }).map(function(item) {
    return {
    id: item.Product_Name.id // Include only the item ID
    };
    });
    log("Filtered existing line items: " + JSON.stringify(filteredExistingLineItems));

    // Array to hold new line items we are adding
    var newLineItemArray = [];

    // Check if package is active and populate new line items
    if (packageStatus === "Active") {
    var packageItems = packageDetails.Package_Details;
    packageItems.forEach(function(item) {
    var productLineItem = {
    Product_Name: {
    id: item.Item_Code.id,
    name: `${item.Item_Code.name} (${item.Item_Name})`
    },
    Product_List_Price: item.Item_Price,
    Description: item.Item_Description,
    List_Price: item.Item_Price,
    Quantity: item.Item_Quantity ?? 1, // Default to 1 if Qty is null or undefined
    Discount: Math.abs(item.Item_Discount ?? 0) // Get the discount or default to 0 if null
    };
    log("New product line item: " + JSON.stringify(productLineItem));
    newLineItemArray.push(productLineItem);
    });
    } else {
    // Show error message if the package is not active
    // My layout to only show Active items but if you don't do that this solves it.
    ZDK.Client.showMessage('This package / promo is no longer active. Please contact the admin for details.', { type: 'error' });
    ZDK.Client.hideLoader();
    return; // Exit the script since the package is not active
    }

    // Combine existing line items with new line items
    var updatedLineItemArray = filteredExistingLineItems.concat(newLineItemArray);
    log("Updated line items array: " + JSON.stringify(updatedLineItemArray));

    // Add all updated items to the Quotes page
    quotedItemsSubform.setValue(updatedLineItemArray);

    // Reset the pick list field so user can re-use
    ZDK.Page.getField("Auto_Quote").setValue(null);

    // Hide loader
    ZDK.Client.hideLoader();

    log("Final updated line items: " + JSON.stringify(updatedLineItemArray));

    // Function to show confirmation and number of items added back to the user
    var showSuccessMessage = function() {
    ZDK.Client.showMessage(`${value.name} selected. ${newLineItemArray.length} items added successfully.`, { type: 'success' });
    };

    // Function to show popup message and then success message
    var showAlertAndSuccess = function(message, heading, buttonText) {
    ZDK.Client.showAlert(message, heading, buttonText);
    showSuccessMessage();
    };

    // Check for pop-up message and show alert if it exists
    if (popUpMessage) {
    showAlertAndSuccess(popUpMessage, "Important Information", "Got It!");
    } else {
    // No pop-up message, show the success message
    showSuccessMessage();
    }
    } catch (error) {
    // Log the error
    log('Error: ' + error.message);

    // Show error message
    ZDK.Client.showMessage('An error occurred while adding items. Please try again.', { type: 'error' });

    // Hide loader
    ZDK.Client.hideLoader();
    }


      Zoho Campaigns Resources


        • Desk Community Learning Series


        • Digest


        • Functions


        • Meetups


        • Kbase


        • Resources


        • Glossary


        • Desk Marketplace


        • MVP Corner


        • Word of the Day


        • Ask the Experts


          Zoho CRM Plus Resources

            Zoho Books Resources


              Zoho Subscriptions Resources

                Zoho Projects Resources


                  Zoho Sprints Resources


                    Zoho Orchestly Resources


                      Zoho Creator Resources


                        Zoho WorkDrive Resources



                          Zoho CRM Resources

                          • CRM Community Learning Series

                            CRM Community Learning Series


                          • Tips

                            Tips

                          • Functions

                            Functions

                          • Meetups

                            Meetups

                          • Kbase

                            Kbase

                          • Resources

                            Resources

                          • Digest

                            Digest

                          • CRM Marketplace

                            CRM Marketplace

                          • MVP Corner

                            MVP Corner




                            Zoho Writer Writer

                            Get Started. Write Away!

                            Writer is a powerful online word processor, designed for collaborative work.

                              Zoho CRM コンテンツ








                                ご検討中の方

                                  • Recent Topics

                                  • 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
                                  • Knowledge Base Module

                                    How to enable the knowledge base module in zoho crm account. I saw this module in one crm account but unable to find it other zoho crm account. can anyone know about this?
                                  • Zoho sign changed Indexing of signing_order

                                    Because I missed this Announcement (is there even one?): when you work with the indexes of actions > signing_order. Previous those started with 0 now starts with 1. Changed somewhere between 15.07 and 23.07
                                  • How to Invoice Based on Timesheet Hours Logged on a Zoho FSM Work Order

                                    Hi everyone, We’re working on optimizing our invoicing process in Zoho FSM, and we’ve run into a bit of a roadblock. Here’s our goal: We want to invoice based on the actual number of hours logged by our technicians on a job, specifically using the timesheets
                                  • Zoho CRM Community Digest - June 2025 | Part 2

                                    Welcome back to the Zoho CRM Community Digest! We’re wrapping up June with more fresh updates, smart discussions, and clever workarounds shared by the community. Product Updates: Struggling to keep track of scattered customer interactions? Zoho CRM's
                                  • Allow Variable Insertion in Prebuilt "Update Record" Action in Schedules

                                    Hi Zoho Creator Team, Hope you're doing well. We’d like to submit a feature request based on our experience using Zoho Creator schedules to manage workflows integrated with Zoho Desk. We currently have an app where Zoho Desk tickets create records in
                                  • Rich Text Field Editor in Form Builder is Too Small and Not Resizable

                                    Hello, I am experiencing a significant usability issue with the rich text field in the Zoho Forms builder. The editor window for this field is fixed-size and extremely small. It does not adapt to the screen size, which makes it very difficult to manage
                                  • Publicar Formulário

                                    Obs. Não consigo publicar meus formulários, pesquisei alguns artigos, mas me deixou perdido, fala de campo sensível, não consigo entender o que significa. Segue Imagem do problema. Todo formulário que faço sempre termina assim sem o botão de publicar..
                                  • Anyone else unable to login to ZMA this weekend?

                                    Hey Is anyone else unable to log into Zoho Marketing Automation at all this weekend? I've been trying on multiple devices - despot and mobile - and multiple browser. I've reset browsing data, gone incognito. Nothing - since Friday I've been unable to
                                  • Custom Action for Subform row

                                    Dears, As for now, we only have 2 actions for each subform row: Edit and Delete. I would suggest to have custom action here, instead of create a button with Fx field within the subform. For example, I would create Duplicate button, which duplicates the
                                  • Urgent: Unable to Receive OTP Email for Portal User Registration in Zoho Creator

                                    I paid to enable the Portal User feature on 2/25, and followed the official instructions (Youtube video: Customer Portals | Zoho Creator) to set up the Portal User using my Gmail account. However, I am not receiving the OTP email and am unable to successfully
                                  • Sole Trader - Financial Advisor (Appointed Representative) - Paid via Capital Account but no Invoicing...

                                    Hi. I'm about to venture into a new business after 12 months of intensive learning/exams. A little chuffed if I may say so especially at 52! I really like the look of ZoHo Books for my modest enterprise but I'm in need of some guidance, please. My services
                                  • Display multiple fields in lookup dropdown

                                    I have a module called Technicians and a related module called submissions that registers technicians for different assignments. The lookup in Submissions to Technicians is the Technician ID (auto generated unique number). How do I display in the dropdown
                                  • Integrate with Power BI

                                    Hi, How to connect Zoho CRM dashboards & reports with POWER BI ?
                                  • No "Import Users" option in Zoho FSM

                                    I recently noticed that there is no option to import Users into Zoho FSM, and this has become a serious challenge for us. When migrating data, especially technicians or other user profiles, we often have hundreds of users to bring into the system. Currently,
                                  • Finding "like" projects

                                    Hi Everyone! My team is running into several duplicating deals. I've been trying to get them all to name things the same way ex. State is 2 letters not spelled out. Things like that. What I am wondering if there is anything I can do as the superadmin
                                  • Não consigo localizar o Botão de Publicar Formulário no meu app

                                    Depois que finalizar meus formulários, não consigo localizar o botão de publicar para concluir meu aplicativo
                                  • DATEV-Export Erfahrungen?

                                    Wir würden gern den DATEV-Export in Books nutzen, jedoch ist dieser nicht wirklich nutzbar. Gibt es positive Erfahrungen von Alternativ-Lösungen?
                                  • Kaizen #191: Implementing "Login with Zoho" using Python SDK

                                    Welcome back to another week of Kaizen!! This week, we are diving into how to implement secure user authentication using Login with Zoho and integrate it with Zoho CRM through our Python SDK. To ground this in a real-world scenario, we will look at how
                                  • WhatsApp Business Calling API

                                    Dear Zoho SalesIQ Team, I would like to request a feature that allows users to call WhatsApp numbers directly via Zoho SalesIQ. This integration would enable sending and receiving calls to and from WhatsApp numbers over the internet, without the need
                                  • Custom modules not showing in developer console

                                    I'm trying to create a custom summing function for a custom module I made in my CRM. When I go to create the function, my module isnt showing up. Do I need to share the custom moldule with my developer console or something of the like?
                                  • Following retainer invoice for partial payment of a sales order

                                    HI, We issue sales orders when a client buy a product from us. We also issue multiple retainer invoices for partial payment (2 to 4 depending of the client). Team wants to follow payment of these retainer invoices for this Sales Order. If they are paid
                                  • Zoho CommunitySpacesとzoho CRM連携について

                                    お世話になっております。 いつもご質問に丁寧に回答いただき大変助かっております。 今、当団体ではZoho CommunitySpacesを利用しており、利用ユーザ一覧をzoho CRMに自動登録(連携)したいと考えております。 そもそも可能なのか、もしあれば具体的な手順や方法はあるのかをご教授いただきたいです。 上記がないのなら、ユーザ一覧のエクスポート方法(メールアドレスと姓を含む)でもよいです。 お手数となりますが、お願いいたします。
                                  • Zoho Wiki or new Zoho Learn

                                    We are currently evaluating if we should move off confluence. At present in Confluence we have multiple levels within our documentation but with learn it looks like you can only have Space       - Manual             - Chapter Is it possible to have levels below Chapter? Also the same question for the existing wiki, can I have more sub-levels?
                                  • New user After moving over from QBO

                                    New user observations/suggestions. QBO took away a lot of features I was used to with the desktop version. Chaos ensued. Zoho Books has a lot of what I was used to and a bit more. Good deal Some things I have run into and suggest some upgrades. 1: The
                                  • Sales without an invoice

                                    Sales without an invoice is not included on the “payments received” report. Also, sales without an invoice is not listed in the transactions under the customer’s profile, also making it easy to do a double entry. Is there a way for me to see my sales
                                  • Zoho Sign API - Create a document from template.

                                    1. I would like to create a document from a template and send the document to the customer for signing. Is this possible using the Zoho Sign API? If so, please share the api reference link. 2. Is there sand box for Zoho Sign to test the APIs without using
                                  • Zoho Sign embedded iframe

                                    Hello, we are looking for any of these options: a) some iframe that we can paste into our website for every signer, for onpage signing document. b) or get direct link for signers from Zoho sign API which we can redirect manually. Is any of these options
                                  • Goods in transit

                                    When creating a purchase order in Zoho Books, how can I properly reflect the inventory as "Goods in Transit" until it reaches its final destination?
                                  • how to coming soon, holding site, or "under construction"

                                    Hi! I was wandering if was possible to create a website with the simple sign of "Under construction or coming soon" while i work on the site. if possible, how? Cheers
                                  • Announcing Agentic AI - Ask Zia!

                                    We are delighted to roll out the new agentic AI capabilities in Ask Zia, where every stage of the BI workflow is assisted by AI. With a human-in-the-loop approach, Ask Zia ensures that you’re in command of the decision, while AI handles the complexity.
                                  • Zoho People LMS VS Zoho Connect Manuals VS Zoho Learn

                                    in the past I came accross Zoho WIKI but did not like the platform because it could use a lot of upgrade. Over the time I have noticed Zoho People come out with a LMS module which allows us to created a shared knowledge for our internal team I also came across Zoho Connect which as a knowledge-based for internal team referred to as Manual Now I am seeing Zoho Learn which is a new and fine-tuned version of Zoho Wiki. All of these platforms are very similar but I am wondering what are the differences
                                  • Marketing Automation Activities in Zoho CRM

                                    Hello, I've connected Zoho CRM and Marketing Automation, sent a campaign, but no data are displayed in CRM, neither in "campaigns" section inside contact profile. It is possible to display Marketing Automation activities in CRM? Also in CRM Timelines?
                                  • How do we get a follow up to Experts 22: Scale up your customer support with integrations & extensibility

                                    Hi, How do we get a followup and answers to the questions we have asked during 'Experts 22: Scale up your customer support with integrations & extensibility'. I have repsonded to the answers but have no way of following up. Thanks Brett
                                  • Frustrating Email Duplication and Timeline Issues Between Zoho Mail and CRM

                                    Hi Zoho team, Can someone please help clarify what’s going on here? Here’s what’s happening: I initiate an email to a lead using Zoho Mail. The lead is created in Zoho CRM via the integration, and the email is correctly associated with that lead. Sometimes,
                                  • Best Strategy to import contacts and when to create leads

                                    Hi, I'm new to Bigin and looking for a "best" strategy. I had and have the following idea for an use case: 1. Search for websites which I want to contact 2. Create a contact in Bigin with all the required information based on this website (via API if
                                  • Better implementation of Item Category on Invoices and Estimates

                                    1) I have added Item Category as a custom field. Honestly, this should be a native part of the item itself, and either required, optional, or not used.  2) When entering an item on an invoice, you have to enter the first character(s) of the item, otherwise
                                  • Bulk Update (via the 'Accountant' menu)

                                    Why can't we bulk update Expenses to Owner's Drawings? It always ends in failure with the error "Involved account types are not applicable". If such conversion isn't possible, why make the option available? Better to allow it though.
                                  • Set Reply_to parameter for "Email an Invoice" API Endpoint

                                    Is there a way to set "Reply To" email address when using the Email an invoice API endpoint? It doesn't seem to be in documentation, but sometimes there are undocumented parameters. If it doesn't exist, please consider adding it as parameter since all
                                  • Zoho Books adaptado a la legislación española. ¿Sustitutos?

                                    Buenas a tod@s No tenemos información sobre la adaptación de Zoho Books a la nueva ley de facturación en España. Me preguntan usuarios de zoho que deberían hacer. Propongo una lista de alternativas, si al final se opta por no desarrollar la funcionalidad
                                  • Next Page