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

                                  • User can import contacts into Campaign even without permission

                                    Hi everyone! We have a role that's configured with "Import records: Calls" only, but when a user with that role enters a Campaign, the "Contacts" section shows a "Import contacts" button. Is this expected?
                                  • Allow moving closed Issues between Zoho Projects without reopening them

                                    Hello Zoho Projects Team, We hope you are doing well. We would like to submit a feature request regarding moving closed Issues between projects in Zoho Projects. Current Limitation: As of now, Zoho Projects allows users to move closed Tasks between projects,
                                  • Improve Back Navigation (X Button) Inside Nested Milestones, Task Lists, Tasks, and Issues

                                    Hi Zoho Projects Team, We would like to request an improvement to the X / close button navigation behavior inside milestones. Currently, the milestone area behaves as a nested hierarchy (tree structure): Project → Milestone → Task List → Task So when
                                  • Accept credit card payment for multiple invoices

                                    We have a problem with Zoho Books.  While we can charge a customer's credit card for an individual customer invoice, we cannot charge a customer's credit card for more than one invoice. In our business, it is common for a client to phone up and say, "Here
                                  • Zoho Books | Product updates | February 2026

                                    Hello users, We’ve rolled out new features and enhancements in Zoho Books. From Advanced Reporting Tags to the ability to mark projects as completed, explore the latest updates designed to improve your bookkeeping experience. Introducing Advanced Reporting
                                  • How is Covid affecting the 2021 Super Bowl Commercials

                                    Super Bowl, the annual championship game of the National Football league, USA has an incredible viewer base of 100 million viewers on an average and is also one of the most-watched television broadcasts in the USA of all time. Nine out of ten Americans
                                  • Columns with no data still displayed despite "Show missing values" disabled

                                    I have a table with missing data, but columns are still being displayed even though the "Show missing values" option is disabled. The table contains 3 columns split across 12 months. I suspect the issue is caused by one of the columns using an aggregation
                                  • How can we get payment status updates for payment links in Zoho Books using webhooks?

                                    When we create and share a payment link in Zoho Books, is there a way to know when the payment is updated? Can we use webhooks to get real-time updates for payment link status instead of checking manually?
                                  • How do I automate my package and shipment process

                                    Hey, I have a very basic problem regarding automating my package and shipment. My business does not require me to have those modules and manage them currently and since I'm new to zoho I want to start with just the basics. I just need to automatically
                                  • Accounts Receivable Balances Differs in Balance Sheet, Customer Balance Report, AR Ageing Summary, and AR Ageing Details.

                                    Hello Zoho Accounts Receivable Balances Differs in Balance Sheet, Customer Balance Report, AR Ageing Summary, and AR Ageing Details. Please clarify and fix the issues here. Thanks
                                  • Zoho Books Inter-company integration

                                    We have an Indian parent entity, and its accounting is managed in Zoho Books. We also have a subsidiary company in Dubai under the same parent entity, for which we have procured a separate Zoho Books license. I want to understand whether Zoho supports
                                  • Not able to import transactions from Razorpay

                                    Hi, tried implementing Razorpay integration with books,also added a webhook, but while this added a razorpay clearing account it does not have any data in it. Neither is it getting updated with new transactions happening on Razorpay. This problem is compounded
                                  • **Building Role-Appropriate Accountability Layers in Zoho Projects - Looking for Real-World Experience**

                                    We're a small ISP/telecom operator on Zoho One and I'm trying to solve what I think is a common organizational problem. Would love to hear from others who've tackled it. **The Core Problem** Staff will only consistently use a project management system
                                  • 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.
                                  • Choosing the Right Automation in Zoho Projects

                                    In any project, different types of actions are needed at different points. Some projects require control on how tasks move, some require reacting to updates, and some require executing additional actions beyond the task. Automation in Zoho Projects is
                                  • Ignroe_filtrers and drill through

                                    I have two charts, where one is connected to the other using drill-through. The issue is with the second chart (the drill-through target). It contains an aggregation formula that uses the ignore_filters function. Under normal conditions, the formula works
                                  • Dropshipping Address - Does Not Show on Invoice Correctly

                                    When a dropshipping address is used for a customer, the correct ship-to address does not seem to show on the Invoice. It shows correctly on the Sales Order, Shipment Order, and Package, just not the Invoice. This is a problem, because the company being
                                  • Cancelled Transfer order problem

                                    Hello, We've canceled a transfer order, and we can't add the related items to a new Transfer Order. The system tells us that the bin doesn't have the required quantity, but when we check the item, it indicates that there are 2 units in the bin. It also
                                  • Sales Allowed Beyond Available Stock and Payment Recorded Without Restriction

                                    Hi, While testing in Zoho Inventory, I noticed that a sales order can be created with a quantity exceeding the available stock in the selected warehouse. In my case: Available stock: 5 units Ordered quantity: 6 units Despite this: I was able to convert
                                  • Zoho Sign Webhooks Security

                                    in Zoho Sign, what protection is in place - if any - so that the receiving endpoint can verify the authenticity of the sender (Zoho DC / app). otherwise anyone knowing the https address of my endpoint can forge the request. webhooks signatures would be
                                  • Issue with attaching files to a task through the API

                                    Hello! I've implemented a function that creates a task for every new bill that is created but I haven't been able to attach to the task the files which are attached to the bill. I have encountered multiple errors but the most common one is error 33003:
                                  • E-Invoicing Automation

                                    Do you have an API endpoint for pushing the invoice through the e-tims for Kenya
                                  • Can I write a check in Zoho Books with no associated bill?

                                    This currently does not seem possible, and I have a client that desperately needs this function if I am able to convert them with Quickbooks. Thank you in advance for your reply. 
                                  • Backorder process review - Automating Removal of Sales Order from "On Hold" When PO is Received

                                    Hello Zoho Inventory Team, Currently, sales orders in On Hold status are released only when the bill for the purchase order is created. In our workflow, it would be much more efficient if the sales order could automatically move out of On Hold as soon
                                  • Zoho Inventory - Managing Items With Multiple Suppliers

                                    Hi community, I'm working on a project at the moment for a car parts wholesale business. Each Item (part) has its own original manufacturer part number (sometimes more than one part number for the same item). When purchasing parts from 3rd party suppliers,
                                  • Gear up for the Zoho Finance & Operations Workshop 2026! [India]

                                    Hello everyone! 👋 We're excited to announce that the Zoho Finance & Operations Workshop 2026 is now underway! As our global community continues to grow, we’re expanding our locations to connect with users around the world—giving you more opportunities
                                  • Introducing the Zoho Books/Invoice Integration

                                    Recruitment doesn’t end with a successful hire. That’s usually when billing begins, and for most teams, that still means switching systems, re-entering data, and manually aligning numbers. This disconnect between hiring and billing often leads to delays,
                                  • Problem with local database connection to Zoho Analytics On Premise

                                    For days now I have been trying to connect my local database to Zoho Analytics On Premise, but it won't let me. No one from Zoho support has been able to help me, in fact I did connection tests with the cloud version and it allowed me to make the connection,
                                  • Record-Level Cliq Conversations Inside Zoho CRM

                                    It would be extremely useful to bring the Zoho Projects + Cliq conversation experience into Zoho CRM records. Today, in Zoho Projects, each project or task can have its own related chat conversation through Cliq, allowing team members to discuss that
                                  • Manage WhatsApp conversations across Zoho services using one phone number

                                    If your teams use multiple Zoho services to handle different business functions, such as support, sales, or other Zoho tools, you might have asked this question: Can we manage all WhatsApp conversations using the same business phone number across these
                                  • Tickets without registration

                                    Hi, would it be possible to give customers the opportunity to be able to read their tickets without registration?
                                  • Handling Hard Bounce Contacts with Active Phone-Based Users (WhatsApp Use Case)

                                    In Zoho Marketing Automation, when a contact is marked as “Hard Bounce”, we noticed that the contact stops receiving updates from CRM fields and may be excluded from automations. Is this expected behavior? In our case, the primary identifier and verified
                                  • Enhancing user experience with Audio/Video Upload in Zoho Forms

                                    Hello form builders! Today, interactive forms are an integral part of websites and applications. While text-based inputs serve a variety of purposes, audio and video uploads can open up a world of possibilities for businesses. Imagine you are a talent
                                  • Gear up for the Zoho Finance & Operations Workshop 2026!

                                    Hello everyone! 👋 We're excited to announce that the Zoho Finance & Operations Workshop 2026 is officially underway! As our global community continues to grow, we're expanding our locations to connect with users around the world. If you haven't had a
                                  • Gear up for the Zoho Finance & Operations Workshop 2026!

                                    Hello everyone! 👋 We're excited to announce that the Zoho Finance & Operations Workshop 2026 is officially underway! As our global community continues to grow, we're expanding our locations to connect with users around the world. If you haven't had a
                                  • Zoho Analytics - Business Hour reporting doesn't use Business Hours

                                    Hi, I've been having an issue where metrics that state they are reporting based on business hours, like "First response time (in Business Hours)" and "Total response time (in Business Hours)" but are being calculated based on 24 hour days (instead of the 9-5 business hours we have setup). Any help would be much appreciated.  I've provided an example and more details in this ticket: https://help.zoho.com/portal/en/ticket/39690706
                                  • Analytics : Highlighting a single bar in a bar chart

                                    I have a bar chart showing values across a year by week. I have a user filter to change the selected week, however the year graph will remain as showing the full year. Is there anyway to conditionally format or construct the year graph to highlight the
                                  • New Income Tax Act 2025 and Rules 2026 for India (Effective 1 April 2026)

                                    Hello everyone, The Income Tax Act 2025 came into effect from 1 April 2026. This new law replaces the old Income Tax Act of 1961. Along with the new Act, the Income Tax Rules 2026 have also been released by the government. These updates bring practical
                                  • Cancelled appointments still block out timeslot

                                    I haven't had to test this before, but I've just found a problem. I had an appointment in a certain timeslot, and that appointment was cancelled. However, Bookings won't let another appointment be booked in that slot - it makes that time unavailable until
                                  • Item Categories in Zoho Books

                                    I realize this feature is available in Inventory, but we do not keep track of inventory. Basically, we have 2 product offerings, residential and commercial. Right now we can only run sales reports for all items. What is the best way to keep track of sales
                                  • Next Page