Add Claude in Zoho Cliq

Add Claude in Zoho Cliq


Let’s add a real AI assistant powered by Claude to your workspace this week, that your team can chat with, ask questions, and act on conversations to run AI actions on.

This guide walks you through exactly how to do it, step by step, with all the code you'll need.

Just copy, paste, replace the placeholders and you'll be good to go.


By the end of this guide, you’ll have:

  1. A Claude bot inside Zoho Cliq to have real back-and-forth conversations.
  2. The ability to @mention Claude in any channel and reply to a message and ask Claude to act on it.
  3. A message action to act on messages in Cliq by Claude. Additionally, pre-built actions to review code, generate mind maps, draft a reply for the selected message, or explain it like you’re new.
IdeaBefore you start:
1. A Zoho Cliq account with Developer access.
2. An Anthropic API key
3. Basic comfort with Deluge (optional — all code is provided
😉)

A. How to get an Anthropic API key?



1. To get an Anthropic API key, sign up at the Anthropic Console (console.anthropic.com).
2. Navigate to the API Keys tab, and click Create Key. 
3. You must add credits via the Billing section to activate the key. Copy the key immediately, as it cannot be viewed again.

Alert
Note: In this guide, the API key is pasted directly into the code for simplicity. But never, ever share your API key to others and double-check before sharing screenshots or code.

B. Create a Connection 

Claude needs permission to: Read chat messages and Fetch attachments (like PDFs) when prompted, for that let's create a connection for it.  ⓘ Learn more about connections

1. Go to the Connections module (in Bots & Tools) → Create Connection
2. Add a Connection name, for eg. "readmessageandfile"
3. Select:
ZohoCliq.Attachments.READ
ZohoCliq.Messages.READ
4. Create
Click Create, then authorize the connection. Copy the connection name, you'll paste it into the handlers in the next steps.

How to start

Go to Zoho Cliq → Settings → Bots & Tools 

Claude Bot:




  • Go to Bots → Create Bot.

  • Name it Claude and give it any description of choice.

  • First, let's create a Message handler to handle the conversations first.

  • Click edit code and copy paste the below code in it (follow along the comments to understand what each part does)

Idea

One API endpoint. That's all.


Both the bot and the message action use the same single Anthropic endpoint: POST /v1/messages. The only thing that changes between them is the system prompt and what you put in the messages array. Once you understand that, the rest is just assembly.
Explore API docs →


Message Handler:



What does this do: Fetches last 10 (customizable - but keep message limit small ( around 10–15 to avoid token overuse)) chat messages for additional context and enables natural chat conversations 


  1. info environment;
  2. botUniqueName = "BOT-UNIQUE-NAME";
  3. // Replace with your bot unique name
  4. cliqBaseUrl = environment.get("base_url");
  5. fetchRecentMessages = invokeurl
  6. [
  7. url :cliqBaseUrl + "/api/v2/chats/" + chat.get("id") + "/messages?limit=10"
  8. type :GET
  9. connection:"CONNECTION-NAME"
  10. //Read below how to create a connection, and paste here:
  11. ];
  12. info fetchRecentMessages;
  13. contentList = list();
  14. contentList.add({"role":"user","content":"Act as a conversational assistant. Reply to the message below in a friendly, informative, and well-organized way.\n\nGuidelines:\n- Respond only to the message provided.\n- Do not use memory or external context.\n- Be warm but professional.\n- Be clear and structured (use short paragraphs or bullet points if helpful).\n- Provide helpful details or clarification where useful.\n- If something is unclear, ask a polite follow-up question.\n- If action is needed, suggest a simple next step.\n- Do not include meta commentary.\n- Output only the reply.\n\n\nSTRICTLY USE * FOR BOLD, AND NEVER ** FOR BOLD MARKDOWN."});
  15. allMessages = fetchRecentMessages.get("data");
  16. for each  data in allMessages
  17. {
  18. type = data.get("type");
  19. if(type == "card" || type == "text")
  20. {
  21. getMessage = data.get("content").get("text").replaceAll("\n"," ");
  22. senderID = data.get("sender").get("id");
  23. if(senderID.startsWith("b-"))
  24. {
  25. contentList.add({"role":"assistant","content":getMessage});
  26. }
  27. else
  28. {
  29. contentList.add({"role":"user","content":getMessage});
  30. }
  31. }
  32. }
  33. info contentList;
  34. // Set up API headers
  35. apiHeaders = Map();
  36. apiHeaders.put("anthropic-version","2023-06-01");
  37. apiHeaders.put("Content-type","application/json");
  38. apiHeaders.put("X-Api-Key","INSERT-API-KEY-HERE");
  39. // Don't forget your API key!
  40. model = "claude-sonnet-4-5-20250929";
  41. requestPayload = {"max_tokens":1024,"messages":contentList,"model":model};
  42. // Make API call to Claude
  43. claudeApiResponse = invokeurl
  44. [
  45. url :"https://api.anthropic.com/v1/messages"
  46. type :POST
  47. parameters:requestPayload + ""
  48. headers:apiHeaders
  49. detailed:true
  50. ];
  51. info claudeApiResponse;
  52. if(claudeApiResponse.get("responseCode") == 200)
  53. {
  54. responseBody = claudeApiResponse.get("responseText");
  55. parsedResponse = responseBody.toMap();
  56. claudeMessage = parsedResponse.get("content").get(0).get("text").replaceAll("\n\n","\n").remove("---").remove("#");
  57. if(claudeMessage.length() > 4000)
  58. {
  59. claudeMessage = claudeMessage.subString(0,4000) + "...";
  60. }
  61. info "Claude's Response: " + claudeMessage;
  62. }
  63. else
  64. {
  65. responseBody = claudeApiResponse.get("responseText");
  66. parsedResponse = responseBody.toMap();
  67. claudeMessage = "*" + parsedResponse.get("error").get("type") + "* \n" + parsedResponse.get("error").get("message");
  68. info "API Error: " + claudeApiResponse;
  69. }
  70. responseContent = {"text":claudeMessage,"card":{"title":"Claude says...","icon":"https://uxwing.com/wp-content/themes/uxwing/download/brands-and-social-media/claude-ai-icon.png"}};
  71. info responseContent;
  72. info zoho.cliq.postToBot(botUniqueName,responseContent);
  73. return Map();


⚙️ Replace These Placeholders

BOT-UNIQUE-NAME (ⓘ How to find it?)
CONNECTION-NAME
INSERT-API-KEY-HERE



Mention Handler:



What does this do: This is to allow Claude to be @mentioned in any chat.
  1. userMessageText = "";
  2. fileAction = false;
  3. repliedMessage = false;
  4. if(message_details.get("message").containKey("replied_message"))
  5. {
  6. repliedMessage = true;
  7. replyMessageID = message_details.get("message").get("replied_message").get("id");
  8. messageType = message_details.get("message").get("replied_message").get("type");
  9. if(messageType == "text" || messageType == "card")
  10. {
  11. userMessageText = message_details.get("message").get("replied_message").get("text");
  12. }
  13. else
  14. {
  15. fileType = message_details.get("message").get("replied_message").get("file").get("type");
  16. if(fileType != "application/pdf")
  17. {
  18. return {"type":"banner","text":"Only PDF files are supported for this action","status":"failure"};
  19. }
  20. else
  21. {
  22. fileAction = true;
  23. }
  24. }
  25. }
  26. promptInstruction = "\"### Instructions ⓘ \nProvide a human-digestible, highly organized response (300-500 characters). Break down your output into bite-sized paragraphs and use bolding to guide the reader's eye. *Strictly avoid tables.* Use plenty of white space and only ### headings for a clean look. \n\n ### Formatting Protocol • \n - Bold: *text* \n - Italic: _text_ \n - Strike: ~text~ \n - Underline: __underline__ \n - Headers: ### Title \n - Quote: \"quote\" \n - Blockquote: > text \n - Bullets: Use • or → for lists \n - Emojis: Use ✨, 🚀, or 💡 to highlight key takeaways \n - Separator: --- \n\n ### and replace ** to *";
  27. userPrompt = "";
  28. if(message.trim().length() > 0)
  29. {
  30. userPrompt = "Action: " + message + "\n\n\n" + userMessageText + "\n\n\n" + promptInstruction;
  31. }
  32. else
  33. {
  34. userPrompt = "Action: " + userMessageText + "\n\n\n" + promptInstruction;
  35. }
  36. // Set up API headers
  37. apiHeaders = Map();
  38. apiHeaders.put("anthropic-version","2023-06-01");
  39. apiHeaders.put("Content-type","application/json");
  40. apiHeaders.put("ENTER-APIKEY-HERE");
  41. // Don't forget your API key!
  42. // Check if message is text-only or contains a file
  43. if(!fileAction)
  44. {
  45. // Handle text-only message
  46. requestPayload = {"max_tokens":1024,"messages":{{"content":userPrompt,"role":"user"}},"model":"claude-sonnet-4-5-20250929"};
  47. }
  48. else
  49. {
  50. // Handle message with file attachment
  51. uploadedFile = invokeurl
  52. [
  53. url :message_details.get("message").get("replied_message").get("file").get("url")
  54. type :GET
  55. connection:"ENTER-CONNECTION-NAME"
  56. ];
  57. info uploadedFile;
  58. // uploadedFile = message.get("content").get("file").get("name");
  59. base64EncodedFile = zoho.encryption.base64Encode(uploadedFile);
  60. if(message_details.get("message").get("replied_message").containKey("comment"))
  61. {
  62. comment = message_details.get("message").get("replied_message").get("comment");
  63. userPrompt = userPrompt + "\n" + comment;
  64. }
  65. else
  66. {
  67. userPrompt = userPrompt;
  68. }
  69. mediaType = "application/pdf";
  70. requestPayload = {"max_tokens":1024,"messages":{{"role":"user","content":{{"type":"document","source":{"type":"base64","media_type":mediaType,"data":base64EncodedFile}},{"type":"text","text":userPrompt}}}},"model":"claude-sonnet-4-5-20250929"};
  71. }
  72. info requestPayload;
  73. // Make API call to Claude
  74. claudeApiResponse = invokeurl
  75. [
  76. url :"https://api.anthropic.com/v1/messages"
  77. type :POST
  78. parameters:requestPayload + ""
  79. headers:apiHeaders
  80. detailed:true
  81. ];
  82. info claudeApiResponse;
  83. // Extract the actual text response
  84. if(claudeApiResponse.get("responseCode") == 200)
  85. {
  86. responseBody = claudeApiResponse.get("responseText");
  87. parsedResponse = responseBody.toMap();
  88. claudeMessage = parsedResponse.get("content").get(0).get("text").replaceAll("\n\n","\n").remove("---").remove("#");
  89. if(claudeMessage.length() > 4000)
  90. {
  91. claudeMessage = claudeMessage.subString(0,4000) + "...";
  92. }
  93. info "Claude's Response: " + claudeMessage;
  94. }
  95. else
  96. {
  97. responseBody = claudeApiResponse.get("responseText");
  98. parsedResponse = responseBody.toMap();
  99. claudeMessage = "*" + parsedResponse.get("error").get("type") + "* \n" + parsedResponse.get("error").get("message");
  100. info "API Error: " + claudeApiResponse;
  101. }
  102. responseContent = {"text":claudeMessage,"card":{"title":"Claude says...","icon":"https://uxwing.com/wp-content/themes/uxwing/download/brands-and-social-media/claude-ai-icon.png"}};
  103. info responseContent;
  104. if(repliedMessage)
  105. {
  106. responseContent.put("reply_to",replyMessageID);
  107. }
  108. info zoho.cliq.postToChat(chat.get("id"),responseContent);
  109. return Map();



Message Action
What does it do: Allow Claude to act on any message or file.

Quoteⓘ For files, we've extended this to only PDF file formats for now to keep implementation predictable and to avoid unsupported file formats

What we're adding:
1. When executed on any message, a form opens to prompt:

A. 🔍 Review code
Claude acts like a senior engineer who finds bugs, lists risks, suggest improvements, provides corrected code.



B. ✨ Explain like I'm new
Claude teaches you what it is, why it matters, how it works, an analogy or common mistakes for any concept.


C. 🧠 Make Mindmap

Converts content into a structured ASCII flow chart for explaining system designs, feature breakdowns or general product thinking.


D. 📌 Draft a reply
Give professional, concise business replies to address, asks clarifications, suggests next steps in a human tone. 


How to create:

1. Create a
Message Action, name it Ask Claude and give any description of your choice.



2. Message properties:  Text messages, Attachments, Links
3. Enter code as instructed below:
(Copy the function name and replace it in Line. 14)
  1. info message;
  2. returnForm = false;
  3. if(message.get("type") == "file")
  4. {
  5. fileType = message.get("content").get("file").get("type");
  6. if(fileType != "application/pdf")
  7. {
  8. return {"type":"banner","text":"Only PDF files are supported for this action","status":"failure"};
  9. }
  10. }
  11. inputs = list();
  12. inputs.add({"label":"Choose an action","name":"action","mandatory":true,"type":"radio","options":{{"value":"reviewcode","label":"🔍 Review Code"},{"value":"explainthis","label":"🧠 Make Mindmap"},{"value":"ExplainlikeImnew","label":"✨ Explain like I’m new"},{"value":"Draftreplyforthis","label":"📌 Draft reply for this"}}});
  13. inputs.add({"label":"More instructions","name":"additionalInstructions","placeholder":"You can provide additional instructions if needed.","min_length":"0","max_length":"500","mandatory":false,"type":"textarea"});
  14. return {"type":"form","title":"Ask Claude","hint":"What would you like Claude to do? Choose an action or write your own.","name":"INSERT-FUNCTION-NAME","button_label":"Submit","inputs":inputs,"action":{"type":"invoke.function","name":"INSERT-FUNCTION-NAME"}};
Next, let's create a function and then link it up to the built-Message action to open the form:



Form Function:



1.Go to Functions → Name your function (Eg. askclaude) and add description
2. Select Form function
3. Create



Once created, in the Form Submit Handler, paste this code:
  1. info form;
  2. info message;
  3. // Set up API headers
  4. apiHeaders = Map();
  5. apiHeaders.put("anthropic-version","2023-06-01");
  6. apiHeaders.put("Content-type","application/json");
  7. apiHeaders.put("ENTER-APIKEY-HERE");
  8. // Don't forget your API key!
  9. actionType = form.get("values").get("action").get("value");
  10. promptInstruction = "\"### Instructions ⓘ \nProvide a human-digestible, highly organized response (250-300 characters). Break down your output into bite-sized paragraphs and use bolding to guide the reader's eye. *Strictly avoid tables.* Use plenty of white space and only ### headings for a clean look. \n\n ### Formatting Protocol • \n - Bold: *text* \n - Italic: _text_ \n - Strike: ~text~ \n - Underline: __underline__ \n - Headers: ### Title \n - Quote: \"quote\" \n - Blockquote: > text \n - Bullets: Use • or → for lists \n - Emojis: Use ✨, 🚀, or 💡 to highlight key takeaways \n - Separator: --- \n\n ### and replace all ** to *";
  11. if(actionType == "reviewcode")
  12. {
  13. userPrompt = "🔍 You are a senior engineer. \nReview this code: \n• List bugs or logical errors \n• Note assumptions and risks \n• Suggest improvements \n• Provide corrected code \n• Explain why your version is better\n\n\n" + promptInstruction;
  14. }
  15. else if(actionType == "explainthis")
  16. {
  17. userPrompt = "🧠 You are a systems thinker. \n•Convert the input into a visual flow chart using plain text. \n•Strict Output Rules \n•Output ONLY inside a triple backtick code block \n•Do NOT use Mermaid \n•Do NOT write paragraphs \n•Do NOT explain anything \n•Do NOT use bullet lists outside structure \n•Use ASCII connectors to form a real flow chart \n•Use arrows (→, ↓, ↳, ├──, └──) to show relationships \n•Maintain clear hierarchy and spacing \n•One single root at the top \n•Logical directional flow (top → down) \n•Structure Requirements \n•Root node at top \n•First-level branches below \n•Subpoints indented \n•Cross-links if relevant \n•Clean spacing \n•No duplicated nodes \n•Required Format Example \n•MAIN IDEA \n•Branch 1 -> Subpoint -> Subpoint \n•Branch 2 -> Subpoint ->Subpoint \n•Branch 3 -> Subpoint -> Subpoint\n\n\n" + promptInstruction;
  18. }
  19. else if(actionType == "ExplainlikeImnew")
  20. {
  21. userPrompt = "✨ You are a teacher for beginners. \nExplain: \n• What it is \n• Why it matters \n• How it works (steps) \n• A simple analogy \n• One common beginner mistake\n\n\n" + promptInstruction;
  22. }
  23. else if(actionType == "Draftreplyforthis")
  24. {
  25. userPrompt = "📌 You are a professional responder. \nReply to this message: \n• Directly address main point \n• Ask for clarification if needed \n• Suggest next steps \n• Keep it concise and clear \n• Make sure message in a buisness casual tone, consise, human written.\n\n\n" + promptInstruction;
  26. }
  27. if(form.get("values").get("additionalInstructions").length() > 0)
  28. {
  29. userPrompt = userPrompt + "\n" + form.get("values").get("additionalInstructions");
  30. }
  31. // Check if message is text-only or contains a file
  32. if(message.get("type") == "text" || message.get("type") == "card")
  33. {
  34. // Handle text-only message
  35. userMessageText = message.get("text");
  36. requestPayload = {"max_tokens":1024,"messages":{{"content":userPrompt + "\n\n" + userMessageText,"role":"user"}},"model":"claude-sonnet-4-5-20250929"};
  37. }
  38. else
  39. {
  40. // Handle message with file attachment
  41. uploadedFile = invokeurl
  42. [
  43. url :"https://cliq.zoho" + environment.get("tld") + "/api/v2/files/" + message.get("content").get("file").get("id")
  44. type :GET
  45. connection:"ENTER-CONNECTION-NAME"
  46. ];
  47. info uploadedFile;
  48. base64EncodedFile = zoho.encryption.base64Encode(uploadedFile);
  49. if(message.get("content").containKey("comment"))
  50. {
  51. comment = message.get("content").get("comment");
  52. userPrompt = userPrompt + "\n" + comment;
  53. }
  54. else
  55. {
  56. userPrompt = userPrompt;
  57. }
  58. mediaType = message.get("content").get("file").get("type");
  59. mediaType = "application/pdf";
  60. requestPayload = {"max_tokens":1024,"messages":{{"role":"user","content":{{"type":"document","source":{"type":"base64","media_type":mediaType,"data":base64EncodedFile}},{"type":"text","text":userPrompt}}}},"model":"claude-sonnet-4-5-20250929"};
  61. }
  62. info requestPayload;
  63. // Make API call to Claude
  64. claudeApiResponse = invokeurl
  65. [
  66. url :"https://api.anthropic.com/v1/messages"
  67. type :POST
  68. parameters:requestPayload + ""
  69. headers:apiHeaders
  70. detailed:true
  71. ];
  72. // info claudeApiResponse;
  73. // Extract the actual text response
  74. if(claudeApiResponse.get("responseCode") == 200)
  75. {
  76. responseBody = claudeApiResponse.get("responseText");
  77. parsedResponse = responseBody.toMap();
  78. claudeMessage = parsedResponse.get("content").get(0).get("text").replaceAll("\n\n","\n").remove("---").remove("#");
  79. if(claudeMessage.length() > 4000)
  80. {
  81. claudeMessage = claudeMessage.subString(0,4000) + "...";
  82. }
  83. info "Claude's Response: " + claudeMessage;
  84. }
  85. else
  86. {
  87. responseBody = claudeApiResponse.get("responseText");
  88. parsedResponse = responseBody.toMap();
  89. claudeMessage = "*" + parsedResponse.get("error").get("type") + "* \n" + parsedResponse.get("error").get("message");
  90. info "API Error: " + claudeApiResponse;
  91. }
  92. responseContent = {"text":claudeMessage,"card":{"title":"Claude says...","icon":"https://uxwing.com/wp-content/themes/uxwing/download/brands-and-social-media/claude-ai-icon.png"},"reply_to":message.get("id")};
  93. info responseContent;
  94. info zoho.cliq.postToChat(chat.get("id"),responseContent);
  95. return Map();

When triggered: Opens a form → User selects an action → Adds additional instructions → Submits → Claude processes the selected message


And that's it. You're Claude integration is ready to be used. 



What's Next:

What you built today is just the foundation.

Shape it around how your team actually works. Extend it to turn discussions into action items, review PRs before they’re merged, generate standup updates, extract tasks automatically, or create knowledge snippets from resolved threads.

Start with one real pain point. Solve it well. Then layer more intelligence on top.

The structure is already there. The possibilities are yours.

🔗 Explore Zoho Cliq: Developer Platform
🔗 Explore Anthropic API Docs

Questions? Comments below. 
Looking forward how you'll build and go make it your own. 🚀
    • Sticky Posts

    • Cliq Bots - Post message to a bot using the command line!

      If you had read our post on how to post a message to a channel in a simple one-line command, then this sure is a piece of cake for you guys! For those of you, who are reading this for the first time, don't worry! Just read on. This post is all about how
    • Add Claude in Zoho Cliq

      Let’s add a real AI assistant powered by Claude to your workspace this week, that your team can chat with, ask questions, and act on conversations to run AI actions on. This guide walks you through exactly how to do it, step by step, with all the code
    • Automating Employee Birthday Notifications in Zoho Cliq

      Have you ever missed a birthday and felt like the office Grinch? Fear not, the Cliq Developer Platform has got your back! With Zoho Cliq's Schedulers, you can be the office party-cipant who never forgets a single cake, balloon, or awkward rendition of
    • Automate attendance tracking with Zoho Cliq Developer Platform

      I wish remote work were permanently mandated so we could join work calls from a movie theatre or even while skydiving! But wait, it's time to wake up! The alarm has snoozed twice, and your team has already logged on for the day. Keeping tabs on attendance
    • Customer payment alerts in Zoho Cliq

      For businesses that depend on cash flow, payment updates are essential for operational decision-making and go beyond simple accounting entries. The sales team needs to be notified when invoices are cleared so that upcoming orders can be released. In contrast,
    • Recent Topics

    • Zoho Flow: Stripe a Zoho Marketing Automation

      Hola! Quiero hacer un flujo con Zoho Flow, para que cuando se haga un pago en Stripe, añada el lead en Zoho Marketing Automation. Lo he configurado, configurando el disparador como "Payment created" y mapeando el campo de Stripe "Receipt email address".
    • Need Customer Item Inward Module along with QC

      Need Customer Item Inward Module along with QC 1. Using Transfer Orders hit the item balance sheet 2. Items without inventory it becomes difficult for tracking purpose. 3. Custom Modules become tedious to capture multiple items, item subforms are not
    • LESS_THAN_MIN_OCCURANCE - code 2945

      Hi I'm trying to post a customer record to creator API and getting this error message. So cryptic. Can someone please help? Thanks Varun
    • Invalid tax authority ID.

      How do I correct this ?
    • Zoho email

      I need a list of email addresses of all contacts on my zoho
    • Shift-Centric View for Assigning and Managing Shifts in Zoho People

      Hello Zoho People Product Team, Greetings and hope you are doing well. This feature request is related to Zoho People - please don't move it to zoho one! We would like to submit a feature request regarding the shift assignment and management view in Zoho
    • cant upload images in signature- urgent help needed. ta!

      HI, I have been trying to insert the company logo in the signature. i have tried it several times since yesterday, the longest I waited was 1 hour and 12 minutes for the pop up window to upload a 180 KB .jpg file. what am i doing wrong.. an urgent reply
    • Add Ticket button in Home view

      When I go to the My Tickets or the Knowledge Base view in our Help Centre, the Add Ticket button is available, but not in the Home view. I would really like for it to be displayed in the Home view as well. Is this possible? Thanks.
    • Problem using Zoho Desk API

      Goodmorning, I am trying to use the Zoho Desk API to create a dashboard in Grafana, but I am having a problem. Following the instructions in the API documentation, I created the API Console application (server-based application). Then I created the string
    • Add zoho calendar to google calendar

      Hi I keep seeing instructions on how to sync Zoho CRM calendar with google calendar but no instructions on how to view Zoho calendar in my google calendar.
    • How to print a label from zoho creator app?

      Hello, I would like to print a label from zoho creator app record similar to attached one. Size 74mm x 102mm. I tried record template. It leaves plenty of space around the content and also I couldn't set the height of the page. So it is not printing properly. Could someone please direct me to right direction for this requirement?
    • City field suggestion in Zoho Books

      Hi team, We are using Customers module in Zoho Books. In the Address section, we want to understand whether the City field can show suggestions while typing using any API or built-in feature. For example, if a user types “Mum”, can the system suggest
    • Non-responsive views in Mobile Browser (iPad)

      Has anyone noticed that the creator applications when viewed in a mobile browser (iPad) lost its responsiveness? It now appears very small font size and need to zoom into to read contents. Obviously this make use by field staff quite difficult. This is not at all a good move, as lots of my users are depending on accessing the app in mobile devices (iPads), and very challenging and frustrating. 
    • How can I check all announce?

      Hiii, May I ask how can I check all the announce based on broadcast date instead of reply date based So that I will not will miss out any new function
    • What are the create bill API line item requiered fields

      While the following documentation says that the line items array is requiered it doesn't say what if any files are requiered in the array. Does anyone know? API documentation: https://www.zoho.com/inventory/api/v1/bills/#create-a-bill I'm trying to add
    • Cannot connect to imap.zoho.eu on iOS26

      Hey, I recently migrated to another iPhone and since then use iOS26. Every since then, I was not able to connect to "imap.zoho.eu" from Apple Mail. I tried deleting the account and adding it again, did not work. I tried creating an app password, didn't
    • Personalize your booking pages with Custom CSS

      Greetings from the Zoho Bookings team! We’re introducing Custom CSS for Zoho Bookings, designed to give you complete control over the look and feel of your booking pages. With this new feature, you can upload your own CSS file to customize colors, fonts,
    • Marketer's Space: Plan smarter with Zoho Campaigns' Calendar

      Hello Marketers, Welcome to another post! Today, we'll talk about a discreet yet significant feature that's neatly tucked inside Zoho Campaigns: the calendar. It might look like an optional but somewhat unnecessary feature that you can use occasionally,
    • Accounting for Territories

      We have different territories i.e. Europe and US and although we can manage the sales process for each and allocate different currencies in the CRM - we want to keep the accounting separate for each territory as there are different reporting and accounting requirements - is there any way to do this?   We want to avoid having two separate instances of zoho.
    • User

      If user is already part of manage engine endpoint central , what hapens when i try to add them to another Zoho org / directory? Are these users added as external users?
    • Create static subforms in Zoho CRM: streamline data entry with pre-defined values

      Last modified on (9 July, 2025): This feature was available in early access and is currently being rolled out to customers in phases. Currently available for users in the the AU, CA, and SA DCs. It will be enabled for the remaining DCs in the next couple
    • Outlook - Zoho CRM Calendar Integration

      I'm facing an issue integrating Outlook with Zoho CRM. Has anyone successfully connected their Outlook to Zoho, and are all your meetings and emails being captured correctly in the CRM? Any insights or troubleshooting tips would be appreciated
    • 【Zoho CRM】ポータル機能のアップデート

      ユーザーの皆さま、こんにちは。コミュニティチームの藤澤です。 今回は「Zoho CRM アップデート情報」の中から、ポータル機能のアップデートをご紹介します。 ポータル管理の新機能「自動招待」により、Zoho CRMからポータルへの招待を自動化できるようになりました。これまで必要だった、ユーザーごとの手動設定は不要になります。設定した条件に基づいて、対象ユーザーに自動で招待が送信されます。 ポータルの新機能 条件に基づく自動招待:指定した条件を満たすユーザーに、自動で招待を送信 招待設定:招待メールの言語を選択し、言語ごとに条件を設定可能
    • Contact data removes Account data when creating a quote

      Hi, Our customer has address fields in their quote layout which should be the address of the Account. They prefill the information, adding the account name - the address data is populated as per what is in the account - great. However when they then add
    • Export all of our manuals from Zoho Learn in one go

      Hi, I know there's a way to export manuals in Zoho Learn, but I want to export everything in one go so it won't take so long. I can't see a way to do this, can I get some assistance or is this a feature in the pipeline? Thanks, Hannah
    • Automation#31: Automate Splitting Names for New Contact Records

      Hello Everyone, This week, we present to you a custom function, which allows you to split the first and last names from the user's email ID based on the separator used in the ID. Having grown into a large firm, Zylker Techfix aims to optimize its processes,
    • Automatically remove commas

      Team, Please be consistent in Zoho Books. In Payments, you have commas here: But when we copy and paste the amount in the Payments Made field, it does not accept it because the default setting is no commas. Please have Zoho Books remove commas autom
    • Project Change Orders and Additions

      We are in the process of migrating from QuickBooks Online to Zoho Books. We have Zoho One and like the ability to sync all of our data across everything. And I like that projects work in a way that's less dumb than QuickBooks. I'm trying to figure out
    • ZOHO Desk - Description of slave ticket disappeared after Merge

      Dear Support, On Zoho Desk the description of a ticket disappeared after merging two ticket. The one which was the slave one completely disappeared. The problem that in this description there was an image which i had only on Desk in that ticket. Could
    • How do I insert a cross-reference link to a different section within one Knowledge Base article using Zoho Desk?

      I would like to insert a link within a Knowledge Base article to a different section of that same article. The section I want to link to is formatted with the Heading 3 style and is displayed within my TOC. However, I do not see any way to add a link
    • Problem Adding Facebook Account

      Hi, I'm new here, I'm having trouble setting up my Facebook account as a social channel. I think the issue is down to how my Facebook is set up, which is pretty confusing. I have a personal Facebook account (let’s called it A) which is my main Facebook
    • Zoho Desk Teams App is not loading

      Hi Zoho Desk support. Need an assistance on the Zoho Desk Teams app. Once I click View Ticket, it isn't showing anything. Kindly refer to attached: ZohoDesk Teams App_View Ticket Error.jpg For our Dashboard, we are still experiencing the same issue. Kindly
    • Mapping a new Ticket in Zoho Desk to an Account or Deal in Zoho CRM manually

      Is there any way for me to map an existing ticket in Zoho desk to an account or Deal within Zoho CRM? Sometimes people use different email to put in a ticket than the one that we have in the CRM, but it's still the same person. We would like to be able
    • Which WhatsApp API works seamlessly with Zoho CRM?

      I’m exploring WhatsApp API solutions that integrate seamlessly with Zoho CRM for customer communication, lead nurturing, and automation. I would love to hear insights from those who have successfully implemented WhatsApp within Zoho CRM. My Requirements:
    • Allow people to sign a zoho form by using esign or scanned signature

      Allow people to sign a zoho form by using esign or scanned signature
    • Button to Reapply Filters on Sheet(s)

      I wrote a macro that I attached to a button to reapply the filters on all my sheets and it says it works, but it doesn't actually do anything. What is wrong with it? Is there another way? Or even make it work for one sheet? Sub UniversalFilterRefresh()
    • Integrate Multiple ZohoBooks organization with zoho projects

      We have successfully connected our Zoho Books with Zoho Projects for synronizing timesheet data. Our Business specialty is, that the staff of the Main company (A) is working on several projects, but the Clients are sometimes contracted and paying to a
    • Zoho OAuth Connector Deprecation and Its Impact on Zoho Desk

      Hello everyone, Zoho believes in continuously refining its integrations to uphold the highest standards of security, reliability, and compliance. As part of this ongoing improvement, the Zoho OAuth default connector will be deprecated for all Zoho services
    • How do I add todays date to merge field

      I don't see any selection of todays date when creating a letter. Surely the date option of printing is standard? John
    • Tracking Emails sent through Outlook

      All of our sales team have their Outlook 365 accounts setup with IMAP integration. We're trying to track their email activity that occurs outside the CRM. I can see the email exchanges between the sales people and the clients in the contact module. But
    • Next Page