Kaizen 215 - Workflow APIs - Part 3

Kaizen 215 - Workflow APIs - Part 3



Welcome back to another week of Kaizen!

Over the last couple of weeks, we’ve joined Zylker Cloud Services as they review and improve their workflows. In Part 1, we discovered and audited their sprawling workflow landscape. In Part 2, we learned how to use the Configuration API to understand valid triggers and actions, preventing errors before they happen.

Now, it is time to take action. Zylker has identified the "VP Alert - High Value Deal" workflow as a prime candidate for an update. It is old, has never run, and its logic might be too narrow. We will also explore how to create a new workflow from scratch to handle a new business requirement.

 STEP 5: Update an Existing Workflow 

From our audit in Step 2, we know that the existing ‘VP Alert - High Value Deal’ workflow (id: 4876876000016390024) hadn’t triggered even once. The original $50,000 threshold missed many valuable deals. Most winning opportunities actually land above $30,000. It has never executed, suggesting the criteria are too strict.

Let us use the Update Workflow Rule API to fix it. We'll change the criteria to trigger for deals greater than or equal to $30,000 and add an additional email notification.

 What you can and cannot update 

When working with the Update Workflow Rule API, not every field in a workflow is open for modification. Think of it like editing an existing automation blueprint. Some foundations are fixed, while others are flexible.

You can update:

  • Name and Description

  • Trigger : You can update triggers, but only within the same trigger type. For example, you can change a Record Action trigger from create to edit, but not from a Record Action trigger to a Score-based trigger. For more details on this, please refer to our detailed help documentation here.

  • Conditions and Criteria : add, remove, or refine them.

  • Actions : add new ones, remove existing ones, or update their configuration.

  • Status : activate or deactivate a workflow rule. 

What cannot be updated

There are a few key restrictions to remember:

  • You cannot change the module associated with the workflow.

  • You cannot switch trigger categories (e.g., from Record Action to Email Trigger).

  • You cannot retain unsupported actions when changing to a trigger that doesn’t support them. For instance, if you change a trigger from Edit to Delete, but keep an Assign Owner action, the update will fail, because “Assign Owner” isn’t valid for Delete triggers.

Updating an existing workflow is not about replacing everything. it is about editing precisely what needs to change.

Here is how to do it:

  • Fetch the workflow details using the Get Workflow Rule API. This gives the full structure,  including condition IDs, action IDs, and trigger details.

  • Identify what needs to change.

In this case, to fix the  “VP Alert - High Value Deal” workflow, we can update the Workflow rule to:

  • lower the threshold to $300,000

  • change the comparator to greater_than. 

To make the workflow more useful, Zylker has also decided to add a few new actions.

But before doing that, the developers needed to confirm which actions are supported for this workflow’s trigger type. That is where last week’s Configuration API comes in handy. Since we already know this is a Record Action trigger (create_or_edit), we can refer to the configuration response we explored in Part 2 to see which actions are valid. 

  {

                "api_name": "create_or_edit",

                "deprecated": false,

                "name": "CreateorEdit",

                "scheduled_actions_supported": true,

                "actions": [

                    "field_updates",

                    "assign_owner",

                    "add_tags",

                    "remove_tags",

                    "email_notifications",

                    "tasks",

                    "create_record",

                    "create_connected_record",

                    "add_meeting",

                    "webhooks",

                    "functions",

                    "circuits",

                    "flow"

                ]

},

 

The response clearly shows that email notifications, field updates, and tags are all supported for this trigger type. With that confidence, in addition to updating the condition, we can also add a 'Priority' tag to those records that trigger the Workflow. This makes the workflow more visible and actionable across the sales hierarchy.

Sample Request:

PUT {{api-domain}}/crm/v8/settings/automation/workflow_rules/4876876000016390024

{

    "workflow_rules": [

        {

            "description": "Notify sales leadership and track strategic opportunities",

            "name": "VP Alert - High Value Deal.",

            "conditions": [

                {

                    "sequence_number": 1,

                    "criteria_details": {

                        "criteria": {

                            "group_operator": "AND",

                            "group": [

                                {

                                    "comparator": "greater_than", // change in comparator operator

                                    "field": {

                                        "api_name": "Amount"

                                    },

                                    "value": "300000"   // Lowered threshold

                                },

                                {

                                    "comparator": "equal",

                                    "field": {

                                        "api_name": "Stage"

                                    },

                                    "value": "Negotiation/Review"

                                }

                            ]

                        }

                    },

                    "instant_actions": {

                        "actions": [

                            {

                                "type": "add_tags",

                                "module": "Deals",

                                "details": {

                                    "tags": [

                                        {

                                            "name": "Priority"

                                        }

                                    ],

                                    "overwrite": true

                                }

                            }

                        ]

                    },

                    "id": "4876876000016390025" // id of the condition to be updated

                }

            ]

        }

    ]

}

 

After this update, the workflow now triggers for any deal worth more than $300,000 in the Negotiation/Review stage. Apart from sending the email notifications and adding the follow up task, it also tags these deals as Priority.

 Edit vs Add: 

To edit an existing condition or action, include its existing id in your update payload. Zoho CRM will recognize it as an update to that object.

To add a new condition or action, simply omit the id. CRM treats any object without an ID as a new addition.

 STEP 6: Create a new Workflow Rule 

With the VP Alert - High Value Deal workflow now fixed and performing as expected, Zylker’s sales team quickly began to see results.
But their sales team noticed that deals often stall after proposals are sent, with no systematic follow-up. Zylker has hence refined the requirements for a new Workflow.

They want to automatically trigger follow-up actions when a high-value deal (above ₹30,000) is marked “Closed Lost” due to pricing reasons. This workflow must ensure that every lost opportunity is reviewed, tagged, and re-engaged after a cooling-off period. To achieve this, they want to create a workflow to be triggered whenever a deal’s Stage is updated to Closed Lost. It must perform the following actions:

  • Add tags Lost due to Pricing and Re-engagement Pending.

  • Send an email alert to the Sales team, with the details of the failed Deal, so they can look into the reasons.

  • After 30 business days, automatically create another “Lost Deal - Feedback” task to remind the owner to re-contact the customer for feedback, and for future opportunities. 

Before proceeding, Zylker makes an API call to the Workflow Configuration endpoint. This ensures that their chosen trigger type and actions are supported. From the response snippet below, it is clear that a field_update trigger supports scheduled actions and the required action types.

  {

                "api_name": "field_update",

                "deprecated": false,

                "name": "FieldUpdate",

                "scheduled_actions_supported": true,

                "actions": [

                    "field_updates",

                    "assign_owner",

                    "add_tags",

                    "remove_tags",

                    "email_notifications",

                    "tasks",

                    "create_record",

                    "create_connected_record",

                    "add_meeting",

                    "webhooks",

                    "functions",

                    "circuits",

                    "flow"

                ]

}

 

With these details validated, we can now move on to adding a new workflow for Zylker using the Create Workflow Rule API request.

Understanding the input JSON structure 

Every workflow definition follows the same hierarchy - defining when the rule runs, what conditions it checks, and which actions it performs.

The top-level input object contains a workflow_rules array. You must include just one workflow rule object per request. Each workflow rule defines its name, trigger type, and one or more condition blocks, each with its own criteria and actions.

Here is a breakdown of what is inside a single workflow rule:

{

  "workflow_rules": [

    {

      "name": "VP Alert - High Value Deal.",   //name of the workflow rule

      "description": "Notify leadership when high-value deals are lost due to pricing.",

      "module": { "api_name": "Deals" },   //module to which the workflow applies

      "execute_when": { ... },         //trigger configuration (e.g., on record edit, field update, etc.)

      "conditions": [

        {

          "sequence_number": 1,          // order of execution. this is the first condition

          "criteria_details": { ... },           // condition logic (criteria group)

          "instant_actions": { "actions": [ ... ] },  //instant actions executed instantly

          cheduled_actions": [              // schedules actions executed after a delay

            {

                      "execute_after": { ... },              // delay period for the scheduled action

                        "actions": [ ... ]

            }

          ]

        },

        {

          "sequence_number": 2,                      // second condition

          "criteria_details": { ... },

          "instant_actions": { "actions": [ ... ] }

        }

      ]

    }

  ]

}




Associative vs. Non-Associative Actions 

Every workflow rule performs one or more actions like sending an email, creating a task, or updating a field, etc. These actions fall into two broad categories: associative and non-associative.

Type

Description

Example Actions

Non- Associative Actions

These are defined inside the workflow rule itself. They do not need to exist beforehand. You can configure their details directly within the workflow payload.

Create record, schedule a call, add a meeting, convert records, social actions, create record on email received, assign owner,

Associative Actions

These are reusable actions created separately in CRM and referenced by their IDs. They can be used across multiple workflows and other automation tools.

Field updates, Email notifications, tasks, Webhooks, Add/Remove tags

 

When you create or update a workflow via API, the associative actions require you to pass their existing action IDs. These IDs can be fetched using the corresponding Actions APIs : Field Updates, Email Notifications, Webhooks, and Tasks. In the coming weeks of Kaizen, we will take a closer look at each of these Actions APIs. We will see how to create, manage, and delete them within your workflow automation strategy.

Sample Request:

POST {{api-domain}}/crm/v8/settings/automation/workflow_rules

{

    "workflow_rules": [

        {

            "execute_when": {

                "details": {

                    "trigger_module": {

                        "api_name": "Deals",

                        "id": "4876876000000002181"

                    },

                    "criteria": {

                        "comparator": "equal",

                        "field": {

                            "api_name": "Stage",

                            "id": "4876876000000002565"

                        },

                        "type": "value",

                        "value": "Closed Lost"

                    },

                    "repeat": false,

                    "match_all": false

                },

                "type": "field_update"

            },

            "module": {

                "api_name": "Deals",

                "id": "4876876000000002181"

            },

            "description": "Triggers tasks, tags, and follow-up reminders for high-value deals lost due to pricing",

            "name": "Lost Deal due to Pricing - Follow Up",

            "conditions": [

                {

                    "sequence_number": 1,

                    "instant_actions": {

                        "actions": [

                            {

                                "name": "Lost Deal - Feedback",

                                "id": "4876876000016794047",

                                "type": "tasks"

                            },

                            {

                                "details": {

                                    "module": {

                                        "api_name": "Deals",

                                        "id": "4876876000000002181"

                                    },

                                    "over_write": false,

                                    "tags": [

                                        {

                                            "name": "Lost due to Pricing",

                                            "id": "4876876000016794071",

                                            "color_code": "#658BA8"

                                        },

                                        {

                                            "name": "Re-engagement pending",

                                            "id": "4876876000016794075",

                                            "color_code": "#879BFC"

                                        }

                                    ]

                                },

                                "type": "add_tags"

                            },

                            {

                                "name": "Deal Lost Alert",

                                "id": "4876876000016794062",

                                "type": "email_notifications"

                            }

                        ]

                    },

                    "scheduled_actions": [

                        {

                            "execute_after": {

                                "period": "business_days",

                                "unit": 30

                            },

                            "actions": [

                                {

                                    "name": "Lost Deal - Feedback",

                                    "id": "4876876000016794047",

                                    "type": "tasks"

                                }

                            ]

                        }

                    ],

                    "criteria_details": {

                        "criteria": {

                            "group_operator": "AND",

                            "group": [

                                {

                                    "comparator": "greater_equal",

                                    "field": {

                                        "api_name": "Amount",

                                        "id": "4876876000000002557"

                                    },

                                    "type": "value",

                                    "value": "30000"

                                },

                                {

                                    "comparator": "equal",

                                    "field": {

                                        "api_name": "Reason_For_Loss__s",

                                        "id": "4876876000002440001"

                                    },

                                    "type": "value",

                                    "value": "Price"

                                }

                            ]

                        }

                    }

                }

            ]

        }

    ]

}

 

The execute_when defines when the workflow should fire.

  • type = field_update means this rule runs when a field’s value changes.

  • criteria : Stage = Closed Lost so the rule triggers whenever the Stage field is updated to Closed Lost.

  • repeat = false ensures it will not trigger multiple times for the same record. 

In simple terms: “Whenever a deal is marked as Closed Lost, run this workflow.” The criteria_details section refines the trigger. The workflow only runs when the Amount ≥ ₹30,000 AND Reason for Loss = Price.

The instant_actions section inside the conditions array has the actions to be executed immediately when the criteria are met.

  • Add Tags : labels the record for easy filtering and reporting.

  • Send Email Alert : notifies the sales team instantly about the lost deal.

The scheduled_actions defines what happens after some time has passed. In this case, after 30 business days. Here, the workflow automatically creates a “Lost Deal - Feedback” task, reminding the deal owner to follow up with the customer to get feedback, and for future opportunities.

The criteria_details defines which records the workflow applies to. In this case, the rule applies to the records that satisfy the following conditions:
  1. The Amount is greater than or equal to ₹30,000, and  

  2. The Reason for Loss is “Price.”  

By combining these elements, this workflow achieves a full closed-loop follow-up system.

Conclusion:  

Zylker’s updated and new workflows make their automation smarter and more responsive. They are now able to spot key deals and ensure lost opportunities are revisited.  

And this is just the beginning. There are countless use cases you can build with workflows. We have included many examples in our Postman collection. Please check them out to get more out of the Workflow APIs. If you have a unique scenario you would like us to address, or a specific automation challenge you are facing, please let us know! We will address them in the upcoming weeks.


We hope you are now well on your way to mastering Workflow APIs. Share your thoughts in the comments or write to us at support@zohocrm.com.

Additional Reading:

  1. Workflow APIs - Part 1 - Auditing Workflows
  2. Workflow APIs - Part 2 - Find out what actions and triggers are supported for each module


    • Sticky Posts

    • 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
    • Kaizen #142: How to Navigate to Another Page in Zoho CRM using Client Script

      Hello everyone! Welcome back to another exciting Kaizen post. In this post, let us see how you can you navigate to different Pages using Client Script. In this Kaizen post, Need to Navigate to different Pages Client Script ZDKs related to navigation A.
    • Kaizen #210 - Answering your Questions | Event Management System using ZDK CLI

      Hello Everyone, Welcome back to yet another post in the Kaizen Series! As you already may know, for the Kaizen #200 milestone, we asked for your feedback and many of you suggested topics for us to discuss. We have been writing on these topics over the
      • Recent Topics

      • Problem with Schedule Email parameters in "Send Reply to an Email" API

        Hello, This is my Json script: { "fromAddress": "test@gmail.com", "toAddress": "{{8.fromAddress}}", "subject": "{{8.subject}}", "content": "{{4.result}}", "action": "reply", "isSchedule": true, "scheduleType": 6, "timeZone": "Europe/Lisbon", "scheduleTime":
      • What's New? - May 2025 | Zoho Backstage

        Hi everyone, A May-zing month for you! As summer rolls in and event season picks up the pace, we’ve been working on a set of updates in Zoho Backstage to help make your day-to-day life a little easier. This month’s improvements are all about tackling
      • Integrate Zia AI into Zobot with Support for Hebrew and Bot Context

        Dear Zoho SalesIQ Team, Greetings. We would like to submit a feature request that would significantly enhance the functionality and intelligence of Zobot: native integration of Zia AI into Zobot scripts and blocks—with full support for Hebrew language
      • Mail Merge: Need Transparent Background for Signatures

        I'm using ZohoCRM and Zoho sign to send documents to customers to sign. We use zohoCRM's "Mail merge" option to create the templates. The problem is that those "Signature" fields have a solid white background so it looks like a stamp on the page instead
      • Zoho Flows

        Basically I can't build a connection that works between Excel on OneDrive and Zoho. I wanted to have 1 flow checking on a row added to an excel file and then intiate an import of that row. I'm doing that manually now and thought that this could be automated.
      • Zoho time tracking with automated screenshots

        Time tracking option with automated screen shots would be an exeptuonally good feature, any plans to develop something like that?
      • Sharing my portal URL with clients outside the project

        Hi I need help making my project public for anyone to check on my task. I'm a freelance artist and I use trello to keep track on my client's projects however I wanted to do an upgrade. Went on here and so far I'm loving it. However, I'm having an issue sharing my url to those to see progress. They said they needed an account to access my project. How do I fix this? Without them needing an account.
      • Zoho Campaigns Forms not Responsive on Website

        I have a mobile responsive Zoho Sites website and when I add a Zoho Campaigns form, it is not responsive. I have used the website code and ensured that the 'responsive' checkbox is selected. But, the form is not responsive to mobile. I have attached a
      • Oldest mail on top?

        I am old, and probably missing something simple, but how do I flip my zoho mail so oldest mail is on top?  Thanks in advance, and a HUGE thank you to the entire ZOHO team.  You just keep getting better!
      • Desk API to add or change commenterId to a comment

        Please let me know how to add comments on tickets for different agents using the API. When adding a comment it will take commenterId but then ignores that and used the API agentId. Did not see in API docs which values are readonly. I pleased to see commentedTime worked for past times. Regards, Glenn
      • How send a ticket attachment using the Sendreply API in Zoho Desk

        API document references : you make use of the Upload file API and gather the attachment ID. This ID is be passed with the Send email Reply API to deliver responses with the attachment intact. Code template is as below: // ORGID ORGID = "XXXXXXX"; // Masked
      • First Insight - Find your Fields

        The Wheels of Ticketing - Desk Stories Find your Fields What are fields? Fields are crucial in ticketing modules that capture information about Tickets, Customers, Organizations, Products, and more. Depending on the kind of data being stored, users can
      • Automation#30: Auto-Update Time Entry to the Nearest 5 Minutes

        Hello Everyone, Time tracking is a feature in Zoho Desk to help businesses stay organized and efficient. For Zylker Techfix, this feature has helped to track the duration of gadget services to generate accurate bills. However, Zylker Techfix faced a unique
      • Email adding to existing ticket

        hello Is there some syntax i can add e.g. to the subject line / body of my email that when it reaches the Zoho portal will add the request to an existing ticket. e.g {123} Currently if i have an open ticket and a customer emails me direct, i then forward
      • How to define different shift timings for each weekday in Zoho People?

        Hi everyone, We’re using Zoho People for attendance tracking and need to configure a standard 39-hour workweek that is structured like this: Monday to Thursday: 8 hours per day Friday: 7 hours Currently, our service provider has set up the workweek as
      • add two date range

        Hi, How can I add two date range selections to compare two different column values in a single pivot view? I have attached a snap for your reference.
      • Announcing new features in Trident for Windows (v.1.26.5.0)

        Hello Community, Trident for Windows is here with exciting new features to elevate your email communication and enhance productivity. Let’s dive into what’s new! Open .eml files in Trident. You can now open .eml files directly using Trident. This makes
      • Adjust The max character in Specification Field

        Is there another way to adjust the maximum character limit for the Specifications field in Zoho Commerce? I need to accept responses with fewer than 200 characters.
      • Customize the Sign In And Sign Up in Zoho Commerce

        Is there another way to customize the Sign In and Sign Up in website Zoho Commerce like this i want to customize to edit it like change the "Sign In" word into "Login Zoho Commerce" it is possible or other way to do that?
      • Territories : Deluge and APIs

        I am trying to work out how to filter a deluge query by territory eg "SELECT Total_Amount, Stage, Closing_Date, Created_Time, Deal_Name FROM Deals WHERE Stage in (" + varBaseCriteria + ") AND Territory = 'Territory1'" The problem being that Territory
      • Tidying up messes file system on Site

        I'm been given access to a new site that's been managed by several different people over the years, each with different ways of managing images and files. If I move an image from one folder to another, it shows a missing image icon on the site's page.
      • Move Archive Button in Zoho Mail to Main Toolbar?

        Is there a way to add the Archive Button to this tool bar so I don't have to click the three dots every time?
      • Introducing Bigin 360: Our new pricing edition with increased feature limits and pre-installed toppings

        Dear Biginners Club, Today, we're pleased to launch a brand-new pricing edition called Bigin 360, our highest pricing edition that will sit on top of Express and Premier editions. It's been over four years since our launch, and we're receiving some great
      • URL field display value

        Is it possible to give a URL stored in a project a display value, rather than showing the whole url? I have a lot of projects connected to issues filed on a separate site, each with a distinct URL. For example: https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=40000
      • need payment link excl. TDS Amount.

        Dear Team Zoho, Kindly generate a payment link excluding TDS amount. So that TDS can be submitted through portal. Thanks & Regards, Arijit S.
      • CRM is very slow now

        CRM is very slow now. Plz check ASAP
      • Access error when running invokeurl

        Hi, I'm running the following code: string standalone.test_api() { LoroToken=zoho.crm.getOrgVariable("LoroToken"); info "LoroToken:"+ LoroToken; headersMap = Map(); headersMap.put("Authorization", "Bearer "+LoroToken ); headersMap.put("Content-Type",
      • Disable Column Freeze in PWA View but Keep It on Desktop — Zoho Creator Reports

        Zoho Creator offers a useful feature to freeze up to two columns in a report view, which works well on desktops. However, our users access the app on both laptops and mobile devices, and freezing columns makes reports nearly unusable on smaller screens.
      • How do I add more space to a note in ‘draw’?

        I’m taking handwritten notes using the draw note, but I don’t seem to be able to scroll down to get more room on the page. How do I make more room to take notes?
      • Overtime per week vs. per day

        In the United States 90% of the states calculate overtime as working more than 40 hours per week. It appears that Zoho People can only calculate overtime per day.  How do we fix this? Here is an example: Mon      8 hours Tues      7 hours Wed      9 hours Thur      8 hours Fri            8 hours -----       Total      40 hours (no overtime) However, Zoho people says 1 hours of overtime because the employee worked 9 hours on Wednesday. Maybe I have something setup wrong in Zoho People?  
      • Add Hebrew Language Support in SalesIQ Idle Chat Handling and Reminders

        Dear Zoho SalesIQ Team, Greetings. We would like to request the addition of Hebrew language support in the Idle Chat Handling and Reminders functionality within Zoho SalesIQ. 🗣️ Background & Use Case Currently, we have successfully configured our Zobot
      • notebook synchronization - problem

        Good afternoon, Since yesterday when trying to create a new notebook, it does not let me and when creating the notes they are not synchronized with the cloud, I think the error may be with the encryption of images because in the pages appears the image
      • Notebook 3.5.0 -- Sort order Name A-Z not working

        Just updated to Notebook 3.5.0 on Windows 10. Sort order by Name, A to Z is backwards, like Z to A. Selecting Z to A still works as expected.
      • Stay organized with chat-to-ticket timers

        Hi there! Ever lost track of a customer’s message? Or found yourself scrolling through long chat threads trying to figure out what’s what? Setting up a chat-to-ticket timer can help. It decides when a reply should stay in the old ticket or create a new
      • New notecards not syncing across devices

        Hi, I'm having the same problem where my notes are not syncing from my Android to my laptop. Please help
      • Please add custom sort in Windows ver. of Notebook!

        Dear Zoho, I love the custom sort (drag and order notes) in the Android version of Notebook, but when I sync onto the Notebook on Windows, the note orders all get messed up because it doesn't support custom sorting yet. This makes it impossible to do
      • Formula to return string "WK 26 - 6.2.25 - 6.8.25

        Here's what I've got but syntatic failure: if(not(isnull(${Deals.GS_Due})), "Week " + Tostring(ceil(dayofyear(${Deals.GS_Due}) / 7)) + " - " + Tostring(month(${Deals.GS_Due})) + "." + Tostring(day(${Deals.GS_Due})) + "." + Tostring(year(${Deals.GS_Due}))
      • Introducing LeadChain in Bigin to sync leads from Social Ads easily

        We're excited to introduce a new topping in Bigin called LeadChain by Zoho Social. LeadChain instantly syncs lead information from social media lead ads to Bigin, making it easier to turn them into customers. It also helps you send conversion data back
      • Templates Access

        There should be an option to grant users access to templates but not allow them to edit/delete templates. In setup there is only one tick option for templates. This will give any user access to view as well as delete/edit. This doesnt make sense as they
      • Generate a Zoho Sign link

        From time to time I get a response "I never received your you e-document for electronic signature" is there a way to generate a Zoho Sign link to share.
      • Next Page