Home Channels and inboxes
📲

Channels and inboxes

How to connect and configure Instagram, Web Widget and email.
Ian Kraskoff
Manuela Farias
By Ian Kraskoff and 8 others
• 18 articles

How to connect Instagram to Cloud Chat

When to use - You want to handle Instagram direct messages (DMs) inside Cloud Chat - You want to reply to comments on your posts and reels without leaving Cloud Chat - You want to follow mentions and replies to your stories Prerequisites - Be logged in as an administrator in Cloud Chat - Have a professional Instagram account (Business or Creator) - Have the login and password for that Instagram account :::info A linked Facebook Page is no longer required: the connection is made directly with your Instagram login. ::: About this article In this article you will learn how to connect your Instagram account to Cloud Chat using the native Instagram integration. If your Instagram is already connected to Cloud Chat through a Facebook Page (legacy integration), do not create a new inbox: follow the article Migrate your Instagram from a Facebook Page to the native integration. This way you keep your conversation history. Step by step Step 1 — Add an inbox Go to Settings → Inboxes and click Add Inbox. Inboxes screen with the Add Inbox button highlighted Step 2 — Choose the Instagram channel In the channel list, choose Instagram. Channel list with the Instagram card highlighted Step 3 — Connect with Instagram Click Connect with Instagram. You will be redirected to the Instagram login: sign in with the account you want to connect and approve the requested permissions. Instagram Channel screen with the Connect with Instagram button highlighted Step 4 — Name the inbox and choose the interactions Back in Cloud Chat, you will see the message Instagram account connected successfully!. Set the Inbox Name and choose which interactions you want to manage: - Direct messages: receive and reply to your customers' DMs - Comments on posts and reels: read, reply to, hide or delete comments - Story mentions and replies: get notified when customers mention you or reply to your stories - Reply to customers after 24 hours: lets you send follow-up messages after the 24-hour window (up to 7 days — see Instagram: how to enable replying after 24 hours) Then click Create Instagram Channel. Instagram inbox setup screen with name, interactions and the Create Instagram Channel button Step 5 — Add agents Choose the agents who will handle this inbox and click Add agents. Done! Your Instagram inbox is connected to Cloud Chat. If you have used another integration — Set the default routing app If your Instagram was previously connected to another tool (or to the legacy integration through a Facebook Page), the Cloud Chat app must be the default reply app at Meta. Otherwise, when you reply, the error (#100) not the thread owner appears and the message is not sent. In the Instagram inbox, open the Advanced Settings tab and go to the Conversation routing section. Click Open Meta conversation routing settings and set the Cloud Chat Instagram app as the default. Advanced Settings tab with the Conversation routing section highlighted Notes - You can turn the interactions (direct messages, comments, stories) on or off at any time in the inbox's Advanced Settings tab. - If the Instagram connection expires, or if you need to grant new permissions (for example, for comments), use the Reauthorize Instagram button in the Advanced Settings tab. Direct messages keep working while you reauthorize. - If your Instagram is connected through a Facebook Page, see Migrate your Instagram from a Facebook Page to the native integration.

Last updated on Sep 23, 2026

How to Install the Cloud Chat Web Widget: Public, with Data, or Logged-in Area (HMAC)

When to Use - You want to add the Cloud Chat widget to any page of your website - You want to automatically pass contact data (name, email, phone, attributes) without the client typing - You want to validate the user's identity (HMAC) to prevent impersonation - You want to allow multiple simultaneous conversations and access to history within the widget - You want to restrict the widget to specific domains (e.g., production only) Prerequisites - Be logged in as admin on Cloud Chat - Access to the source code of the website where the widget will be installed - For Scenario 3 (logged-in area with HMAC): a custom backend to generate the identifier_hash — it cannot be done on the frontend (exposes the secret key) About this Tutorial This article covers the full cycle of installing the Cloud Chat Web Widget. Before following the coding steps, you need to decide which of the 3 scenarios fits your use case — they have very different requirements and complexity. Which scenario is yours? | Scenario | When to use | Pass customer data? | Needs HMAC? | | --- | --- | --- | --- | | 1. Public widget (no data) | Public site / landing page / blog. The customer enters their name and email to start the chat. | ❌ No | ❌ No | | 2. Widget with data, outside logged-in area | Pages that already know the contact but do not require strong authentication (e.g., single link sent via email/CRM, post-registration form). | ✅ Yes | ❌ No | | 3. Logged-in area widget (with HMAC) | Customer portal, internal dashboard, authenticated app. Any scenario where user login is required to access. | ✅ Yes | ✅ Mandatory | :::warning If your case is Scenario 3 (logged-in area), you must configure HMAC. Without it, the conversation will not be created. ::: :::info The contact's custom attribute must be created beforehand — see Creating custom contact and conversation fields. ::: Common Step — Create the Website Inbox Before configuring any scenario, you need to create a Website-type inbox in Cloud Chat. The process is the same for all 3 scenarios. 1. Access the Inboxes Screen In the Cloud Chat dashboard, go to Settings → Inboxes and click on the Add Inbox button (top right corner). 2. Choose the Website Channel Select the Website card from the available channels. 3. Configure the Website Channel Fill in the fields: - Site Name — name shown to the customer (e.g., "Cloud Humans") - Website Domain — domain where the widget will run (e.g., cloudhumans.com) - Widget Color — primary color of the button and header - Welcome Title — initial widget title (e.g., "Hello!") - Welcome Message — greeting message - Activate Channel Greeting — whether to send an automatic message at the start of chat Click Create Inbox. 4. Add Agents Select the agents who will have access to this inbox. As an administrator, add yourself if you want to see all conversations. Click Add Agents. 5. Script Configuration On the final screen (“Your inbox is ready!”), Cloud Chat displays the basic installation script for the widget. However, other configuration options are available depending on your scenario. Click More Settings. In this section, you'll see the three available script options for installation, which we will explain below. :::success Done. Now proceed to the scenario that applies to your case (1, 2, or 3 below) and follow the specific instructions for each. ::: Scenario 1 — Public Web Widget (no customer data passing) Use when the widget is on a public page (landing, blog, institutional site). The customer types their name/email/phone at the start. How to Install Paste the script copied in the Common Step (Step 5) just before the closing </body> tag of your page's HTML: :::info That's it. This scenario requires nothing beyond the base script. Do not call setUser(), do not pass identifier_hash. The customer fills in their data in the widget's initial form. ::: Scenario 2 — Web Widget passing customer data, outside logged-in area Use when you already know the contact but the page does not require login. Examples: - Unique link sent via email or WhatsApp with the identifier in the URL - Post-registration page (customer just filled out a form) - Page accessed via CRM campaign deep link Here, you want to pre-fill name, email, phone, and custom attributes without the customer typing. How to Install :::error ⚠️ The first argument of setUser(...) is the identifier — it must be unique per user (internal ID, database UUID, etc). If you leave the identifier fixed (hardcoded, placeholder, copy-paste example), Cloud Chat will merge all accesses as the same contact — merging tickets from different people and irreversibly breaking history. Before deploying to production, confirm with your engineering team that the identifier is being dynamically populated with the actual user ID. ::: :::info You must pass at least email or phone — these are the identifiers Cloud Chat uses to match contacts. ::: Scenario 3 — Logged-in Web Widget (with HMAC + optional multiple conversations) Use when the widget is inside a logged-in area (client portal, dashboard, authenticated app). HMAC is mandatory here. This scenario is also the only one where enabling multiple conversations + history makes sense. 3.1 — How HMAC Works Validation uses HMAC SHA-256: a code generated from the user's identifier combined with a secret key (token) of the inbox. :::warning The generation of identifier_hash is the client's responsibility. It needs to happen on the backend (server), never in the browser. If the secret key leaks in the frontend, protection ceases to exist. Cloud Humans provides the token per inbox; implementing the hash calculation and passing it to the widget is the client's technical team's responsibility. ::: 3.2 — Copy the inbox token In Settings → Inboxes → (your Website inbox) → Advanced Settings → User Identity Validation → Copy. This token is secret — store it only in your backend, never in the frontend. 3.3 — Calculate identifier_hash on backend When the user authenticates in your system, the backend calculates: identifier_hash = HMAC_SHA256(inbox_token, identifier) Where identifier is the user's unique ID (internal UUID, corporate email, etc). Server-side examples: // Node.js const crypto = require('crypto'); const hash = crypto .createHmac('sha256', '<inbox-token>') .update('<identifier>') .digest('hex'); # Python import hashlib, hmac hash = hmac.new(b'<inbox-token>', b'<identifier>', hashlib.sha256).hexdigest() // PHP $identifier_hash = hash_hmac('sha256', '<identifier>', '<inbox-token>'); 3.4 — Send the hash to the widget via setUser <script> (function(d,t) { var BASE_URL="https://cloudchat2.cloudhumans.com"; var g=d.createElement(t),s=d.getElementsByTagName(t)[0]; g.src=BASE_URL+"/packs/js/sdk.js"; g.defer = true; g.async = true; s.parentNode.insertBefore(g,s); g.onload=function(){ window.cloudchatSDK.run({ websiteToken: 'YOUR_TOKEN_HERE', baseUrl: BASE_URL }); window.addEventListener('cloudchat:ready', function() { window.$cloudchat.setUser('<user-identifier>', { identifier_hash: '<hash-generated-backend>', email: '[email protected]', name: 'João da Silva', phone_number: '+5511999999999' }); }); } })(document,"script"); </script> 3.5 — Force validation in the inbox In Advanced Settings, enable "Force user identity validation". Requests without a valid identifier_hash are rejected. :::error Activate "Force validation" only after your backend is sending the correct identifier_hash. If activated prematurely, conversations without the hash will be rejected and the chat will stop working. Test first in a test inbox. ::: :::success Best practices: - Use a stable identifier — never change the ID of an existing user - Do not expose the HMAC token in the frontend - Generate the hash always on backend and send only during widget initialization - Regenerate the identifier_hash every time the widget loads for an authenticated user ::: 3.6 — (Optional) Enable multiple conversations and history With HMAC enabled, you can activate the feature of multiple conversations + history: the same user can have several open conversations simultaneously and see the history of closed conversations within the widget. Useful for SaaS, B2B, or e-commerce with high repurchase/retargeting. How the user sees: the widget will now display two tabs — Active Conversations (open) and Conversation History (closed, with date range and ticket ID search; loads 5 at a time). Demonstrative videos: https://www.loom.com/share/5e1ffa9996814752b4e745191d5059f7 https://www.loom.com/share/184de48c78c440dfaf6169c14b244f94 How to enable: 1. In Cloud Chat dashboard, go to Inboxes → (your Website inbox) → Settings 2. Enable the Multiple conversations per user flag 3. Copy the new script displayed after activation — it already includes user_id and identifier_hash in the correct format 4. Replace the current page script with the new one :::error The multiple conversations and history feature depends on HMAC being active and working. Do not enable it on public widget (Scenario 1) or non-logged-in widget (Scenario 2) — without identity validation, anyone can access another user's history. ::: Domain Validation (optional, all scenarios) Configure the domains where the widget can operate — useful to prevent usage outside authorized domains (staging, unauthorized third parties). In Inboxes → (your inbox) → Settings, under the Domain Validation section: | Setting | Behavior | | --- | --- | | Empty field | No restrictions — works on any domain | | example.com | Allows use only on this domain | | *.example.com | Allows use on all subdomains (e.g., app.example.com, login.example.com) | How to Test 1. Open the page with the widget installed 2. Check if the widget appears at the corner of the screen 3. Scenarios 2 and 3: verify that name, email, phone, and attributes already appear pre-filled without customer input 4. Scenarios 2 and 3: test with at least 2 different users — open the widget with one, then with another, and check if they appear as separate contacts (not merged into one). If they appear merged, the identifier is fixed — fix it before deploying to production 5. Scenario 3: test with an invalid identifier_hash and verify that the widget rejects the request when "Force validation" is enabled 6. Scenario 3 with multiple conversations: open two tickets in parallel and check that they appear as separate conversations inside the widget Frequently Asked Questions What happens if there is already previous contact information? The new data sent via script overwrites the old data. The most recent information prevails. What if I make a mistake in a custom field name? No error is thrown. The incorrect field is silently ignored. Only existing fields are updated. Can I pass conversation attributes as well? :::warning Not at the moment. Passing custom conversation attributes has not been released in version 0 due to technical limitations. Use the initial conversation form as an alternative. ::: What formatting does the widget accept? The Widget accepts most Markdown formats: - Bold / Strikethrough / Italic - Code block - Links - Images - Bullet points Can I use HMAC without enabling multiple conversations? Yes. HMAC is an independent security layer — you can enable only HMAC (Scenario 3, steps 3.1 to 3.5) without enabling multiple conversations (step 3.6). The reverse is not recommended. Can I use this in mobile apps? Yes, via WebView. See How to integrate the Web Widget into mobile apps. Notes - To share the widget session across browser tabs: How to share the Web Widget session between browser tabs - To use the widget in mobile apps via WebView: How to integrate the Web Widget into mobile applications - To create custom attributes before passing via script: How to create custom contact and conversation fields - To enable conversation continuity via email: How to enable conversation continuity via email - To activate the widget in the Help Portal: How to activate the Web Widget in the Help Portal

Last updated on May 26, 2026

How to Connect an Email Box to Cloud Chat (Google, Microsoft, IMAP/SMTP)

When to Use - You want to connect an email box to Cloud Chat to receive and reply to customer emails in the same inbox as chat and WhatsApp - Your inbox is Gmail / Google Workspace, Outlook / Microsoft 365, or from another provider (Zimbra, Yahoo, self-hosted, etc.) - You need to reconnect an existing inbox that is experiencing errors Prerequisites :::error Disconnect ClaudIA from the inbox before creating the connection. When a new email is connected, Cloud Chat pulls the email history as new conversations — if ClaudIA is active, it will start responding to them. ::: - Logged in as administrator in Cloud Chat - The email must be a user mailbox (login + password) — cannot be a group - For Microsoft: the email needs to be the primary account of the Microsoft account - For IMAP/SMTP: access to provider settings to enable IMAP and obtain server address/port About this tutorial Cloud Chat supports three methods to connect an email inbox: - Google (OAuth) — for Gmail and Google Workspace, via Sign in with Google - Microsoft (OAuth) — for Outlook.com and Microsoft 365, via Sign in with Microsoft - Other providers (IMAP/SMTP) — for any other provider, with manual configuration :::info Google and Microsoft deprecated support for IMAP integrations — for these two, we use native integrations (OAuth). For all other providers, IMAP/SMTP is the way. ::: Go directly to your provider’s step: - Path A — Google (Gmail / Workspace) - Path B — Microsoft (Outlook / 365) - Path C — Other providers via IMAP/SMTP Reference videos: https://www.loom.com/embed/f97da4387d464ce998ca54a6c271dcc9 https://www.loom.com/embed/c28480dab2b5482c93f2801b4c9355a9 https://www.loom.com/embed/1114432b7f2a4c8b99f592b9dd002a3f Step-by-step Guide Step 1 — Access Mailbox Settings 1. Go to Settings in Cloud Chat 2. Navigate to Inbox → Add Inbox 3. Select the Email channel — then choose the provider (Google, Microsoft, or Others) Path A — Google (Gmail / Workspace) Use when the inbox is Gmail or Google Workspace — OAuth integration (Sign in with Google). :::info The native connection app with Gmail is in beta awaiting Google approval but is functional. ::: 1. Select Google as provider After choosing Email, click on Google. 2. Log in with Google 1. Enter the email address you want to connect 2. Click Sign in with Google and follow the login process 3. Select the account and accept the requested permissions 3. Add agents Select the agents that will have access to the inbox. :::success Done! The Gmail inbox is now integrated with Cloud Chat. ::: Synchronization limitations (Google): - Only Inbox messages are synchronized with Cloud Chat - Messages in other folders or in spam are not automatically synchronized To automatically move spam messages, create a rule in Gmail: https://www.loom.com/share/4dde1712265c411c841c37d7a1e264df Path B — Microsoft (Outlook / 365) Use when the inbox is Outlook.com or Microsoft 365 — OAuth integration (Sign in with Microsoft). 1. Enable POP/IMAP in Outlook 1. Go to Settings → Mail → Forwarding and IMAP in outlook.live.com 2. In the POP and IMAP section, activate Let devices and apps use IMAP 3. Click Save 2. Confirm that the email is the primary account 1. Go to Microsoft Account → Your Info → Edit Account Info 2. Check that the email you want to connect is the primary account :::warning If the email is not the primary, mark it as such by clicking Make primary. Secondary inboxes cannot connect. ::: 3. Log in with Microsoft in Cloud Chat After selecting Email and choosing Microsoft: 1. Enter the email address 2. Click Sign in with Microsoft — you will be redirected to Microsoft login :::warning If you have other Microsoft accounts on the same machine, one may be autofilled. Log out of the previous Microsoft account before proceeding or — preferably — do this in private browsing. ::: 4. Add agents After redirection back to Cloud Chat, select the agents that will have access and click Add agents. :::success Done! Your Outlook/Microsoft 365 inbox is now integrated with Cloud Chat. ::: Path C — Other providers via IMAP/SMTP Use when the inbox is from any other provider (Zimbra, Yahoo, self-hosted, etc.) — manual setup via IMAP/SMTP. 1. Enable IMAP on the provider 1. Access your email settings 2. Enable IMAP forwarding 3. Copy the connection details (address, port) 2. Name the inbox in Cloud Chat After selecting Email and choosing Other providers: 1. Name the inbox and enter the email 1. Click Create email channel 3. Add agents Select the agents that will operate on the inbox and click Add agents. 4. Configure IMAP 1. Click on More settings 2. Go to Configuration and enable IMAP 3. Enter address, port, login, and password :::warning If your provider has two-factor authentication, use the app password generated — not the personal password. ::: Default address and port examples: | Provider | IMAP address | Port | | --- | --- | --- | | Google | imap.gmail.com | 993 | 4. Click Update to reconfigure IMAP settings Step 5 — Configure SMTP 1. Enable SMTP 2. Enter address, port, login, and password (for two-factor, use app password) Default SMTP address and port examples: | Provider | SMTP address | Port | | --- | --- | --- | | Google | smtp.gmail.com | 587 | 3. In the Domain field, enter the same as the SMTP address :::info For most cases, keep encryption options (SSL, authentication) at default (STARTTLS, none, login). ::: 4. Click Update to apply the SMTP configuration :::success Your email box is now connected to Cloud Chat. ::: Reconnecting in case of errors Applicable for Google and Microsoft inboxes (Paths A and B). If there's an error, a red alert appears on the inbox. To reconnect: 1. Go to Settings → Inboxes → Settings 2. Click Click here to reconnect in the red banner 3. Log in again with Google or Microsoft as per the original method :::info It is not necessary to delete the inbox to reconnect. ::: Additional Notes - To send proactive messages via email: How to send individual proactive messages in Cloud Chat - To enable continued conversation across channels (chat → email): How to enable conversation continuity via email - Google Workspace Error 550 5.7.515: How to fix error 550 5.7.515 — Email authentication with Google Workspace

Last updated on May 26, 2026

💬 Cloud Chat Web Widget — Enable Multiple Conversations per User and Conversation History (requires login area)

What is the Multiple Conversations Mode? The multiple conversations mode allows a single user to keep different support tickets separate within the Web Widget. Additionally, when this feature is enabled, the user also gains access to the history of resolved conversations, allowing them to view previous interactions, reopen contexts, and review past information. This functionality was designed for logged-in areas, where each user can be securely identified. These two features are especially useful when the same client tends to open more than one support ticket at the same time. For SaaS, B2B, or e-commerce companies with high repurchase rates, these features work very well. 📖 How do multiple conversations and their history work? With the extension of this functionality, the Web Widget displays two tabs for the user: - Active Conversations - Conversation History In the active conversations tab, the user can see and continue all their ongoing conversations or start a new one. In the history tab, the user can view closed conversations, making it easier to follow up on previous interactions and avoid losing context. Initially, the history shows the 5 most recent conversations. If the user wants to see older conversations, they can click "See More", and the system will load additional entries in blocks of 5. It is also possible to search conversations using one or more of the following filters: - Start Date - End Date - Ticket ID How does the customer view multiple conversations? https://www.loom.com/share/5e1ffa9996814752b4e745191d5059f7 How does the history work? And how does the customer see it? https://www.loom.com/share/184de48c78c440dfaf6169c14b244f94 🧩 Prerequisites To activate the multiple conversations mode in CloudChat Web Widget, you need to: 1. Enable User Identity Validation. This ensures that each authenticated user on your site is who they claim to be. 2. Integrate the Web Widget script on your site, using the code provided in your Web Widget inbox within the CloudChat dashboard. ⚠️ Important: The multiple conversations and history feature was designed exclusively for logged-in areas of your site, where there is a unique identifier per user. It should not be used in public or anonymous areas, as it depends on identity validation to guarantee: - Correct separation of conversations - Secure access to history - User data privacy ⚙️ How to enable multiple conversations and history 1. Access the CloudChat dashboard. 2. Go to Inboxes → Web Widget → Settings. 3. Enable the "Multiple Conversations per User" toggle. 4. Copy the script shown after activation and insert it into your application's HTML (usually before the closing </body> tag). 🧾 Script Example You can find this script example in Inboxes → Web Widget → Widget Scripts. 🔐 About user_id and identifier_hash These two parameters are fundamental for user authentication: - user_id → a unique and permanent identifier of the user in your system (e.g., the UUID from the users table). - identifier_hash → a cryptographic signature generated by your backend, ensuring the integrity of user_id. CloudChat uses identifier_hash to validate that the user_id was indeed authenticated by your system and was not tampered with on the client side. 🧮 How to generate the identifier_hash on the backend The hash should be generated on your backend, never on the frontend, because it uses the private User Identity Validation token provided by CloudChat. This prevents the token from being exposed in public website code. import { createHmac } from 'node:crypto'; /** * Generates an HMAC SHA256 hash to identify the user * @param {string|number} userIdentifier - Unique ID of the user * @param {string} hmacToken - Private token provided by CloudChat * @returns {string} HMAC hash in hexadecimal format */ function generateUserIdentifier(userIdentifier, hmacToken) { if (!userIdentifier) { throw new Error('userIdentifier is required'); } const identifierHash = createHmac('sha256', hmacToken) .update(userIdentifier.toString()) .digest('hex'); console.log('Generated Identifier Hash:', identifierHash, 'for user:', userIdentifier); return identifierHash; } The backend endpoint might look like: GET /cloudchat/identity-hash?user_id=12345 Returning: { "identifier_hash": "d35b5c2e3b7b2f..." } ✅ Best Practices 1. Use a stable user_id (never change the identifier of an existing user). 2. Do not expose the HMAC token on the frontend. 3. Always generate the hash on your backend and send it to the client only when initializing the widget. 4. The identifier_hash should be regenerated every time the widget loads for an authenticated user.

Last updated on Jan 26, 2026

Limitation: Using WhatsApp Desktop

Summary: When the WhatsApp number is connected to the official app (with coexistence), messages sent or received on unsupported devices (such as the WhatsApp Windows App) are not reflected in Cloud Chat, although they remain visible on the main phone. What Meta Says - Messages on unsupported devices do not trigger webhooks: “WhatsApp users who use an unsupported companion client to message an onboarded business can do so, but the message will not trigger smb_message_echoes webhooks, so the business won't be able to mirror the message in their own app.” 🔹 What happens with numbers using the WhatsApp app (with coexistence)? When the WhatsApp number is connected to the official app, messages sent or received on unsupported apps are not reflected in Cloud Chat, although they remain visible on the main phone. 🔹 Which apps are not supported? According to Meta documentation, examples of unsupported clients include: - WhatsApp Desktop (Windows) - WhatsApp on WearOS Messages exchanged through these channels do not generate webhooks (smb_message_echoes), and are therefore not mirrored in Cloud Chat. 🔹 Does WhatsApp Web work? ✅ Yes. WhatsApp Web (browser) is supported and messages continue to be reflected normally via API. 🔹 Where can I find more information? - https://developers.facebook.com/docs/whatsapp/embedded-signup/custom-flows/onboarding-business-app-users/?utm_source=chatgpt.com#linked-devices - https://developers.facebook.com/docs/whatsapp/embedded-signup/custom-flows/onboarding-business-app-users/?utm_source=chatgpt.com#errors

Last updated on Nov 03, 2025

Web Widget in Mobile Applications

Integration of CloudChat with mobile applications (Flutter, React Native, iOS, and Android) Currently, CloudChat can be integrated into mobile applications via the web widget, using each platform's WebView component. 🔧 How It Works Our CloudChat widget is distributed as a JavaScript script, automatically made available during the setup of a “Web Widget” type inbox within the CloudChat dashboard. This script can be embedded in a WebView within your mobile app (whether developed in Flutter, React Native, native Android, or native iOS). This approach allows the chat to be rendered directly inside the app, providing an experience close to the original web widget. 💡 Use case example: In React Native, you can embed the widget in a <WebView> pointing to the URL where the script was inserted, ensuring full communication with CloudChat. 🚫 Native SDKs We currently do not offer official native SDKs for Flutter, React Native, Android, or iOS. We plan to release official SDKs in the future, but no specific date has been set for this release. In the meantime, using WebView remains the recommended and officially supported way to integrate CloudChat into mobile apps. ✅ Advantages and Limitations WebView aspects Compatibility Works in any app with WebView support Implementation effort Low — just include the script generated by CloudChat User experience Similar to the web widget Limitation Less flexibility for customization and performance compared to a native SDK 🧭 Next Steps 1. In CloudChat, create a new “Web Widget” type inbox. 2. Copy the script generated during the setup. 3. Insert this script into a simple HTML page hosted by your app, and load it inside a WebView. 4. Test the communication and appearance of the widget within your application. 🗓️ Future Roadmap We are exploring the development of native SDKs for Flutter and React Native, aiming to provide a smoother integration and advanced features such as push notifications and native session control. However, no specific release date has been set for these SDKs at this time.

Last updated on Dec 23, 2025

Shared Web Widget Session Across Browser Tabs

1. Introduction This guide explains how to maintain the same user session of the Cloud Chat web widget across two or more browser tabs without requiring each tab to be authenticated individually in the host application. Typical scenario: a user opens your website in two tabs and starts a conversation via the widget in one tab. In the second tab, the widget should recognize the same user and display the same conversation history. When to use this guide - Your application allows multiple tabs to be open simultaneously. - You already use (or want to use) the widget's Identity Validation. - You want the widget to identify the same contact across all tabs without requiring login in each. 2. Prerequisites 3. How it works (simplified explanation) Think of it like this: 1. user_id is the "name on the badge" — identifies who the user is. 2. identifier_hash is the "authentication stamp" — proves the badge is genuine. 3. Cloud Chat verifies the stamp (using a secret key known only to the server) before granting access to the history. Tab-to-Tab Flow Key point: each tab must call setUser() independently. The cw_user_* cookie is shared automatically between tabs (same domain), but the authToken within the widget is per instance (per tab). Therefore, both tabs need access to user_id and identifier_hash to initialize correctly. 4. Implementation 4.1 Recommended option: Server-side endpoint This is the most secure option. The identifier_hash is never stored in the browser — it is obtained on demand from a protected endpoint authenticated with your app. Backend (Node.js/Express example) const crypto = require('crypto'); // Endpoint protected by your app’s authentication app.get('/api/widget-identity', authMiddleware, (req, res) => { const userId = String(req.user.id); // Logged-in user ID const hmacToken = process.env.CLOUDCHAT_HMAC_TOKEN; // Widget secret key const identifierHash = crypto .createHmac('sha256', hmacToken) .update(userId) .digest('hex'); res.json({ user_id: userId, identifier_hash: identifierHash, name: req.user.name, email: req.user.email, }); }); Backend (Ruby on Rails example) # app/controllers/api/widget_identity_controller.rb class Api::WidgetIdentityController < ApplicationController before_action :authenticate_user! def show user_id = current_user.id.to_s hmac_token = ENV['CLOUDCHAT_HMAC_TOKEN'] identifier_hash = OpenSSL::HMAC.hexdigest('sha256', hmac_token, user_id) render json: { user_id: user_id, identifier_hash: identifier_hash, name: current_user.name, email: current_user.email } end end Backend (Python/Django example) import hmac import hashlib from django.http import JsonResponse from django.contrib.auth.decorators import login_required from django.conf import settings @login_required def widget_identity(request): user_id = str(request.user.id) identifier_hash = hmac.new( settings.CLOUDCHAT_HMAC_TOKEN.encode(), user_id.encode(), hashlib.sha256 ).hexdigest() return JsonResponse({ 'user_id': user_id, 'identifier_hash': identifier_hash, 'name': request.user.get_full_name(), 'email': request.user.email, }) Frontend (any tab) <script> window.CloudChatSettings = { // ... widget configuration }; window.addEventListener('CloudChat:ready', async function () { try { const response = await fetch('/api/widget-identity', { credentials: 'include', // Send session cookies }); if (!response.ok) { console.error('Failed to obtain widget identity'); return; } const { user_id, identifier_hash, name, email } = await response.json(); window.$CloudChat.setUser(user_id, { identifier_hash: identifier_hash, name: name, email: email, }); } catch (error) { console.error('Error configuring widget user:', error); } }); </script> Advantages: - The hmac_token never leaves the server. - The identifier_hash is never stored in the browser. - Each tab gets fresh data, maintaining consistency. - If the user logs out, the endpoint returns 401, and the widget is not identified. 4.2 Alternative: localStorage (with caveats) Use this only if your app does not have a backend available to provide identifier_hash (e.g., static SPAs). Security Notice localStorage is accessible by any JavaScript running on the same domain. If your site is vulnerable to XSS (Cross-Site Scripting), an attacker could read the stored identifier_hash. See section 5 (Security) for risks. Tab that generates data (e.g., login page) // After authentication, your backend returns user_id and identifier_hash const userData = { user_id: '12345', identifier_hash: 'abc123def456...', // Generated by your backend name: 'Maria Silva', email: '[email protected]', }; localStorage.setItem('CloudChat_user', JSON.stringify(userData)); Any tab that loads the widget window.addEventListener('CloudChat:ready', function () { const stored = localStorage.getItem('CloudChat_user'); if (!stored) return; try { const { user_id, identifier_hash, name, email } = JSON.parse(stored); window.$CloudChat.setUser(user_id, { identifier_hash: identifier_hash, name: name, email: email, }); } catch (e) { console.error('Invalid widget data in localStorage'); localStorage.removeItem('CloudChat_user'); } }); On logout localStorage.removeItem('CloudChat_user'); window.$CloudChat.reset(); 4.3 Advanced option: sessionStorage + BroadcastChannel This combines the non-persistence of sessionStorage with real-time synchronization between tabs via the BroadcastChannel API. Data exists only while at least one tab is open. Initialization (in all tabs) const CHANNEL_NAME = 'CloudChat-session'; const STORAGE_KEY = 'CloudChat_user'; const channel = new BroadcastChannel(CHANNEL_NAME); // When receiving data from another tab channel.onmessage = (event) => { if (event.data.type === 'session-data') { sessionStorage.setItem(STORAGE_KEY, JSON.stringify(event.data.payload)); initWidget(event.data.payload); } if (event.data.type === 'session-request') { // Another tab requests data — send if available const stored = sessionStorage.getItem(STORAGE_KEY); if (stored) { channel.postMessage({ type: 'session-data', payload: JSON.parse(stored) }); } } if (event.data.type === 'session-clear') { sessionStorage.removeItem(STORAGE_KEY); window.$CloudChat.reset(); } }; function initWidget(userData) { window.$CloudChat.setUser(userData.user_id, { identifier_hash: userData.identifier_hash, name: userData.name, email: userData.email, }); } window.addEventListener('CloudChat:ready', function () { // Check if data already exists in this tab const stored = sessionStorage.getItem(STORAGE_KEY); if (stored) { initWidget(JSON.parse(stored)); return; } // Request data from other tabs channel.postMessage({ type: 'session-request' }); // Timeout: if no response in 2 seconds, this becomes the first tab // (user will need to log in normally) }); On authentication (main tab) // After receiving user_id and identifier_hash from backend const userData = { user_id, identifier_hash, name, email }; sessionStorage.setItem(STORAGE_KEY, JSON.stringify(userData)); channel.postMessage({ type: 'session-data', payload: userData }); initWidget(userData); On logout sessionStorage.removeItem(STORAGE_KEY); channel.postMessage({ type: 'session-clear' }); window.$CloudChat.reset(); Advantages: - Data does not persist after closing all tabs. - Real-time synchronization between tabs. - No dependency on JavaScript-accessible cookies. Limitations: - BroadcastChannel is not supported in IE11 (but works in all modern browsers). - If all tabs are closed and reopened, user must log in again. 5. Security What NEVER to do Never expose the hmac_token (secret key) in the frontend. This key is used by your server to generate the identifier_hash. If an attacker obtains the hmac_token, they can generate valid hashes for any user_id, impersonating any user. // WRONG — NEVER do this const hmacToken = 'your-secret-key-here'; const hash = CryptoJS.HmacSHA256(userId, hmacToken).toString(); Risks of storing identifier_hash in localStorage Context of the risk: The identifier_hash itself is not a high-value secret: - It is a signature (HMAC) of the user_id, not an access token. - An attacker needs the corresponding user_id AND the HMAC validation to impersonate someone. - identifier_hash does not grant access to systems beyond the chat widget. - The impact of a leak is limited: at worst, an attacker could initiate conversations as that user within the widget. However, the server-side endpoint option is preferred to eliminate exposure entirely. Storage approach comparison table Best Practices 1. Protect against XSS — the number one threat to any data in the browser. Use Content Security Policy (CSP), sanitize inputs, and keep dependencies up to date. 2. Generate identifier_hash on the server — never in the frontend. 3. Use HTTPS — always. No exceptions. 4. Limit attack surface — if possible, load the widget only on pages where it’s needed. 5. Clear data on logout — remove data from localStorage/sessionStorage and call $CloudChat.reset(). References: - OWASP HTML5 Security Cheat Sheet - Auth0 — Secure Browser Storage 6. Session Reset Use window.$CloudChat.reset() to clear the widget session. Internally, reset performs: 1. Closes the chat if open. 2. Removes the cw_conversation cookie (session token). 3. Removes the cw_user_{websiteToken} cookie (user identity). 4. Reloads the widget iframe, starting a clean session. When to use Example: full logout function onLogout() { // 1. Clear stored data (if using localStorage) localStorage.removeItem('CloudChat_user'); // 2. Reset the widget if (window.$CloudChat) { window.$CloudChat.reset(); } // 3. Redirect to login page window.location.href = '/login'; } 7. Troubleshooting Issue: Widget shows "Start new conversation" instead of history Likely cause: setUser() was not called, or called with an invalid identifier_hash. Solution: 1. Check in browser console for network errors (HTTP 401 at /widget/contact). 2. Confirm that the identifier_hash was generated with the correct hmac_token (from widget panel). 3. Make sure the user_id passed to setUser() matches the one used to generate the hash. Issue: Different tabs show different users Likely cause: each tab is calling setUser() with different data. Solution: 1. If using server endpoint, ensure both tabs call the same endpoint for the same logged-in user. 2. If using localStorage, ensure data was written before the second tab tries to read. Issue: After logout, widget still shows previous user’s data Likely cause: $CloudChat.reset() was not called, or cookies were not cleared. Solution: 1. Call $CloudChat.reset() before or during logout. 2. Clear localStorage/sessionStorage if storing data there. 3. Verify that the cw_user_* cookie was removed (DevTools > Application > Cookies). Issue: setUser() throws "Identifier should be a string or number" error Cause: user_id is undefined, null, or an object. Solution: ensure value is a string or number. If from API, convert: // Example window.$CloudChat.setUser(String(userData.user_id), { ... }); Issue: setUser() throws "User object should have one of the keys..." error Cause: user object lacks required keys. Solution: include at least one of: name, email, or avatar_url. // Example window.$CloudChat.setUser(userId, { identifier_hash: hash, name: 'User Name', // At least one key required }); Issue: BroadcastChannel does not sync across tabs Likely cause: tabs are on different domains (e.g., app.example.com vs www.example.com). Solution: BroadcastChannel only works between pages on the same origin. Make sure all tabs access exactly the same URL domain.

Last updated on Apr 13, 2026

Migrate your Instagram from a Facebook Page to the native integration

When to use - Your Instagram is currently connected to Cloud Chat through a Facebook Page inbox (the old integration) and you want to move to the native Instagram integration. - You want to keep the full history of your Instagram conversations (direct messages). - You also use Facebook Messenger on the same page and want to keep handling Messenger normally. Prerequisites - You must be an administrator of the account. - Migration is done per inbox, in its own settings — no support ticket needed. :::warning After migrating, to be able to reply to Instagram conversations you must set the new Instagram app as the default routing app in Meta. Without this, replies fail with (#100) not the thread owner (see Step 4). ::: What happens during the migration - The current inbox becomes an Instagram inbox — the direct messages and all history stay in it. - Your Facebook Messenger conversations move to a new, separate inbox, so Messenger keeps working. Step by step Step 1 — Open the inbox settings Go to Settings → Inboxes and select the Instagram inbox (the one currently connected through a Facebook Page). Step 2 — Start the migration In the settings tab, scroll to the Migrate to the new Instagram integration section and click Migrate to Instagram. Migrate to Instagram section in the inbox settings Step 3 — Log in with Instagram and approve the permissions You'll be taken to the Instagram login. Sign in and approve the requested permissions. When you return, the inbox already shows as Instagram and the new Messenger inbox is created. Step 4 — Set the default routing app in Meta In the Instagram inbox, open the Advanced Settings tab and go to the Conversation routing section. Click the link to open Meta's settings and set the Instagram app as the default app for replies. Conversation routing section in the Advanced Settings tab :::error If you skip this step, replies will fail with (#100) not the thread owner and the message won't be sent. ::: Notes - The Instagram direct message history is preserved — nothing is lost in the migration. - Facebook Messenger conversations keep working in the new inbox. - Conversations are moved in the background; it may take a few moments on accounts with many conversations.

Last updated on Jul 02, 2026

Email Conversation Continuity: How to Enable and How It Works (Automatic and Manual)

When to Use - The customer is in a website chat (Web Widget) and leaves (closes the tab, switches device) — and you want the conversation to continue via email. - You need a WhatsApp conversation to proceed via email (long discussions, attachments, third-party records). - You want to maintain the context of the conversation as it transitions between channels. Prerequisites - An email inbox configured — see Connecting Email Inbox to Cloud Chat - The agent who will operate is assigned to this email inbox. - The contact must have a registered email. - To enable the option in the inbox: be logged in as an administrator. About This Article Email continuity prevents the service from being lost when the customer leaves the original channel. There are two modes: - Automatic (by inactivity) — only on Web Widget: Cloud Chat sends the response by email if the customer is not viewing the chat. - Manual (button) — on Web Widget and WhatsApp: the agent forces the conversation to continue via email. How to Enable in the Inbox Step 1 — Have an Email Inbox Have (or create) an inbox of type email in Settings → Inbox. Step 2 — Enable Continuity in the Site Inbox In the Site type inbox, activate Enable email conversation continuity. Step 3 — Select the Continuity Email Inbox In Select the email inbox for continuity, choose the inbox from Step 1. :::success Done — email conversation continuity is enabled for this inbox. ::: Automatic Continuity (by Inactivity) — Web Widget When an agent responds to a Web Widget conversation (with continuity enabled and contact with email), Cloud Chat waits about 2 minutes. After this time: - If the customer has not opened the chat during this interval (inactive) → the reply is sent via email, with the chat history. - If the customer was in the chat and saw the message → the conversation continues in the widget, normally. When the customer responds to the email, the reply appears in the conversation for the agent, marked as coming from email. :::info Automatic continuity is reversible: if the customer returns to the site chat, the conversation resumes via the widget. A new reply will only go by email if they become inactive again. Messages sent in sequence within these ~2 minutes are grouped into a single email. ::: Manual Continuity (button) — Web Widget and WhatsApp The agent can force the conversation to continue via email, without waiting for inactivity. How to Activate 1. Open the conversation on the panel. 2. At the top of the conversation, click Activate email continuity. - Web Widget — activates directly upon clicking. - WhatsApp — a confirmation modal appears before applying. :::error Manual activation is permanent for that conversation — cannot be undone. From that point on, all responses follow via email, and the conversation behaves like an email thread in the panel. ::: When the button does not appear (or is blocked) - Email continuation is not enabled in the inbox → enable by following the "How to enable in the inbox" section above. - The contact has no email registered → edit the contact and add an email before trying. Points to Watch :::warning When the conversation is transitioning via email, there are two current limitations to be aware of: - Copy (CC/BCC): the reply field does not change to the full email format, so it’s not possible to add recipients in copy through this conversation. - Channel indicator: there is no clear mark in the conversation timeline showing when it switched to email (or returned to the widget). Use message identification — responses received via email are marked — to navigate. ::: Notes - In WhatsApp, email continuity is always initiated by the agent (never automatic by customer inactivity). - To send a complete transcript of a conversation via email (without channel migration): How to send a conversation transcript via email - For proactive email sends (you initiate contact): Proactive single message send guide on WhatsApp

Last updated on Sep 02, 2026

New Conversation via Web Widget: Why the Inbox Appears (or Not)

https://www.loom.com/share/5868f5eba483411487f46c6d55a9336c When starting a New conversation with a contact and selecting a Web Widget inbox (website chat), the inbox only appears in the source list under certain conditions — this prevents triggering actions that would not reach the customer or would duplicate an ongoing conversation. Modal "New conversation" with the inbox selector open, showing the Web Widget inbox as an option 1. The contact must be identified in the widget A proactive conversation via Web Widget can only be started with an identified contact (who has logged in/authenticated in the widget — logged-in area). An anonymous visitor does not appear as an option: without an identified session, the message cannot be reliably delivered when they return. 2. Single conversation widget ("Maintain Single Conversation") The inbox is only offered if the contact does not have an active conversation in it: - Active conversation (open, pending, or snoozed) → the inbox does not appear (to avoid creating a second parallel conversation). - Resolved conversation → does not block: you can start a new one normally (create a new, not reopen the old). - Previous proactive message that the customer hasn't responded to → does not block: you can start a new one normally. :::info The check is made by contact within that inbox, not per session: if they opened the site chat in another browser or device and have an active conversation there, the inbox also does not appear. ::: 3. Multiple conversations widget If the widget allows multiple conversations per user, the inbox always appears — the contact can have several conversations in parallel. When does the customer receive it? The conversation you start stays waiting: it appears to the customer as soon as they reopen the widget on the site — even in another tab or session. "Why doesn’t the site inbox appear?" To initiate the flow, open the contact and click New Message: "New Message" button on the contact panel, used to start a proactive conversation If the site inbox is not in the list, check: 1. Is the contact identified in this widget? (anonymous is not offered) 2. Is there already an active conversation (open/pending/snooze) with them in this inbox? If yes, continue or resolve the existing one. 3. Is the widget set to single conversation? Then, only one active conversation is allowed. The same rule applies on the server: even if the conversation is attempted through another method, it will be rejected for reasons such as (contact not identified or an active conversation already exists). This also covers the case when the customer sends a message while the New Conversation window is open.

Last updated on Sep 02, 2026

Failed Send Indicators in Conversation List

How does it work? The Failed Send Indicators feature makes it easier to identify conversations where the last message was not successfully delivered. When the last message in a conversation has a failure status, Cloud Chat highlights this conversation visually to facilitate quick action by the team. Without this type of indication, some issues may occur: - Failures go unnoticed in the queue - Delays in responding to the customer - Need to manually review multiple conversations - Increased rework in support With the new indicators, the team can quickly prioritize conversations with errors and reduce response times. What has been implemented? When the last message fails, the conversation displays: - Red sidebar on the conversation card (left side) - Error icon instead of the sent arrow next to the message preview - Red badge with "!" replacing the green unread dot Visual example Practical example An agent sends a message to the customer. The message fails due to connection/channel instability. In the conversation list, this ticket now appears: - With a red sidebar on the side - With an error icon next to the message preview - With a red warning badge When a new message is successfully sent, the failure indicators are removed and the conversation returns to the normal behavior. Common questions 1. Does this replace the unread message counter? For conversations with a failure in the last message, the red warning badge with "!" is prioritized to draw attention to the error. 2. Do I need to activate any settings? No. This improvement is automatically applied to the conversation list experience. 3. What should I do when I see a conversation with a red "!"? Open the conversation, check the failed message, and try to resend or send a new message. 4. When does the failure alert stop appearing? When the last message no longer has a failure status, for example, after a successful resending.

Last updated on Sep 02, 2026

What happens to conversations when I delete an inbox

When to use this - You are about to delete an inbox (e.g., changing your WhatsApp number, migrating WABA, deactivating a channel) and want to know what happens to the conversations that were in it - You need to preserve the conversation history before making changes to the channel What happens When you delete an inbox, Cloud Chat also deletes the conversations and the messages that belonged to it. The history is not left orphaned and it is not transferred to another inbox: it is removed along with the inbox. :::error Irreversible action. The conversations and messages from the deleted inbox cannot be recovered afterwards — not even by support. If that channel's history matters to you, do not delete the inbox before sorting out how to preserve the data. ::: The following also go away with the inbox: the members linked to it, the campaigns, the webhooks and the automations specific to that inbox. If you need to preserve the history Before deleting, extract the data you want to keep: - "Construtor de Relatórios" (Report Builder) ("Relatórios" (Reports) → "Construtor de Relatórios"): build the view you need and export it as CSV/Excel. - Data Extract API: for bulk extractions — see How to extract data in bulk via API (Data Extract API). If the change involves a WhatsApp number/WABA and you want to keep the history inside Cloud Chat, talk to the Cloud Humans team before deleting the inbox — depending on the case, there are better paths than deletion.

Last updated on Sep 09, 2026

Slack inbox: connect and provide support through the native channel

When to use - You support customers in Slack channels (dedicated channels per customer, or Slack Connect channels shared with them) and you want every thread to become a conversation in CloudChat. - You want ClaudIA to handle support in Slack, with the same queue, tag and automation design as the other channels. - You want to move away from a separate ticketing tool in Slack and centralize support in CloudChat. Prerequisites :::info The native Slack inbox is enabled per account. If the Slack block does not appear under "Adicionar caixa de entrada" (Add inbox), talk to your Cloud Humans contact before continuing. ::: - Be an administrator of the account in CloudChat. - Be able to install apps in the Slack workspace. If your workspace requires admin approval for new apps, whoever authorizes it must be a Slack admin — otherwise the request goes into the approval queue and the connection is never completed. - Know which Slack channels support happens in. Step by step Step 1 — Connect the Slack workspace 1. Go to "Configurações → Caixas de Entrada → Adicionar caixa de entrada" (Settings → Inboxes → Add inbox). 2. Choose the Slack block. Add inbox screen with the Slack block highlighted 3. On the "Canal do Slack" (Slack channel) screen, click "Adicionar ao Slack" (Add to Slack). Slack channel screen with the Add to Slack button highlighted 4. You are taken to the Slack authorization screen. Choose the correct workspace and confirm with Allow. 5. Back in CloudChat, "Workspace do Slack conectado com sucesso!" (Slack workspace connected successfully!) appears. Give the inbox a name (for example, Suporte Slack) and click "Criar canal do Slack" (Create Slack channel). 6. Add the agents who will provide support and finish. At this step you do not choose channels yet. That starts inside Slack, in step 2. Step 2 — Invite the app into the channel, inside Slack In the Slack channel that should generate conversations, type: /invite @CloudChat Repeat this in every channel you want to support. It is this invitation that gives CloudChat access to the channel — without it, the channel does not even appear in the list of available channels. Step 3 — Activate the channel in CloudChat 1. Open the inbox and go to the "Canais do Slack" (Slack channels) tab. 2. The channel usually shows up on its own a few seconds after the invitation. If it did not, click "Sincronizar canais" (Sync channels). 3. Turn on the switch in the "Ativo" (Active) column. Slack channels tab with the Sync channels button and the Active switch highlighted From that point on the channel starts generating conversations. Before that, nothing is captured. What each label in the list means: - Slack Connect — channel shared with people outside your workspace. - "Interno" (Internal) — channel marked as an internal team channel. - "Sem acesso" (No access), with the switch locked — the bot left or was removed from the channel. Invite it again with /invite @CloudChat and click "Sincronizar canais" (Sync channels). Step 4 — Choose when a message becomes a conversation In the "Canais do Slack" (Slack channels) tab, click "Editar" (Edit) on the channel. The "Abrir conversa" (Open conversation) field has three modes: - "Em toda mensagem" (On every message) (default) — every new message in the channel opens a conversation. - "Só ao reagir com um emoji" (Only when someone reacts with an emoji) — nothing is captured until someone reacts with the configured emoji (default: ticket). - "Só quando mencionarem o app" (Only when the app is mentioned) — nothing is captured until someone mentions @CloudChat in the channel. Slack channel edit modal with the three conversation opening modes, the Emoji field and the automatic tags How to choose: "Em toda mensagem" (On every message) is for a channel dedicated to one customer, where everything is support. Emoji and mention are for a busy channel, where only part of the conversation is support. The emoji is its name in Slack, without the colons: ticket, eyes, sos. Do not paste the emoji, type the name. Still in the same modal: - "Tags das novas conversas" (Tags for new conversations) — every conversation opened in this channel is born with these tags. The most common use is one tag per customer, which leaves reporting and automation ready with no manual work. - "Canal interno do time" (Internal team channel) — leave it unchecked (the default) when whoever opens conversations there is a customer. Check it only when it is a channel of your own team: in that case everyone is treated as a contact, and nobody is mistaken for an agent. In a Slack Connect channel the option does not appear, because a shared channel is always customer support. Step 5 — Set up the internal team channel, if you want Still in the "Canais do Slack" (Slack channels) tab there is the "Canal interno" (Internal channel) selector — a channel just for your team, chosen once for the entire inbox. With it configured, every new conversation gets a thread in that channel, with a card that brings the contact, the message preview and two buttons: "Ver no Slack" (View in Slack), which opens the customer's original thread, and "Abrir no CloudChat" (Open in CloudChat). It exists so the team can discuss the case without the customer seeing it: - A private note written in CloudChat shows up in that internal thread. - A reply written in the internal thread goes back into the conversation as a private note — it never reaches the customer. The channel chosen as the internal one cannot be activated as a support channel; it exists only for this. How it works Who is treated as a customer and who is treated as an agent CloudChat decides based on the source workspace of whoever writes: - A guest or a person from another workspace — the Slack Connect case — becomes a contact, and their message is the customer's message. - A member of your workspace is treated as an agent, and CloudChat matches by email: if there is an agent in CloudChat with the same email as in Slack, the message comes in as their official reply. - A workspace member with no matching agent by email has their message recorded as a private note, not as a reply to the customer. What changes in support - The conversation shows the name of the Slack channel (#nome-do-canal) instead of the generic inbox name, both in the list and at the top of the conversation. - The "Abrir no Slack" (Open in Slack) button, at the top of the conversation, opens the original thread already expanded, in the right workspace. Conversation header showing the Slack channel name and the Open in Slack link highlighted - To filter: conversation list → "Filtro" (Filter) → "Canal do Slack" (Slack channel). - To route: when creating an automation rule, use the "Condições do Slack" (Slack conditions) group → "Canal do Slack" (Slack channel). That is how you send each customer to a different queue or team. - The agent's reply goes out in the thread with their name, not as "CloudChat". - ClaudIA works normally: set it up in the ClaudIA tab of the inbox, just like in any other channel. Notes - No history is imported. The channel is entirely event-driven: only what happens after you activate it comes through. - There is no reply window. Unlike WhatsApp and Instagram, there is no 24-hour deadline to reply to a Slack conversation. - Out of scope for this version: resolving and reopening by emoji in Slack, syncing message edits and deletions, CSAT inside Slack, slash commands, DM with the bot and history import.

Last updated on Sep 16, 2026

Cloud Chat Telephony: how to receive and make calls

When to use - Your team answers calls and wants calls in the same place where they respond to chat, WhatsApp, and email. - You want to understand how a call appears in Cloud Chat, how to answer via softphone, and how to dial a customer. - You want to know what happens with the recording and transcription of each call. What it is Cloud Chat telephony connects your AtendeSimples account to Cloud Chat. Each incoming or outgoing call becomes a conversation, with history, assignment, status, and tags like any other support. What you gain: - Calls in inbox: each call becomes a conversation in the voicemail. - Built-in softphone: answer without changing windows, in a floating panel that follows you across screens or in full screen. - Call a contact: dial directly from the conversation or contact profile. - Conversation recording: listen again to what was said, in the conversation's own player. - Transcription: read the call in writing, separating agent and customer. - Call linked to support: if the customer already has an open support, link the call to it and keep the case in one place. :::info Important Cloud Chat records calls and embeds the softphone, but the call itself remains handled by AtendeSimples. IVR, queues, support hours, and agent groups are configured in the AtendeSimples panel. ::: How to activate Telephony is activated by our team. Talk to your account manager. You will need: - An account on AtendeSimples, with the contracted number and agents registered with VoIP (each with their extension). - The same email for each agent in AtendeSimples and in Cloud Chat. This is how Cloud Chat knows who answered each call. - A panel administrator on AtendeSimples to coordinate setup with us. Call recording and transcription are separate from telephony. Ask your account manager. Answering calls Open the softphone 1. Click the Softphone button in the corner of the screen. 2. If your voicemail is already configured with automatic login, the softphone enters your extension automatically. If not, log in with your email and your extension on AtendeSimples. 3. Done: with the softphone open, calls ring there and in the browser notification. Tips to avoid missing calls: - Minimize the softphone instead of closing it. The call continues as long as the panel is open, even when browsing other Cloud Chat screens. - You can drag, resize, or open the softphone in a separate window. During a call, it cannot be moved to another window to prevent dropouts. - The Telephony page, in the side menu, opens the softphone in full screen. Leaving this page closes the softphone. To answer while browsing, use the floating panel. - To receive calls, the softphone must be open and logged in. The AtendeSimples IVR only forwards calls to online agents. What appears in Cloud Chat As soon as a call arrives, it becomes a conversation in the voicemail: - The contact is identified by the phone number. If the number isn’t a contact yet, Cloud Chat creates one. - When you answer, the conversation is assigned to you, and a notification appears: "You answered the call," with a shortcut to Open Ticket. - The call card shows the number, wait time, call duration, and who answered, including the extension. Every call becomes a conversation, including unanswered ones. The status shows what happened: | Status | Meaning | | --- | --- | | In progress | The call is ongoing | | Ringing | The team made the call and is waiting for the customer to answer | | Answered | Someone from the team spoke with the customer | | Missed | No one answered | | Abandoned in queue | The customer hung up while waiting | | Resolved in IVR | The customer was served through IVR menu without talking to the team | :::info Important A call conversation does not receive written messages. To record what was agreed, use private notes in the conversation. When the support ends, close the conversation as usual: a call does not resolve the support on its own. ::: Link the call to an open support If the customer who called already has an open case (e.g., WhatsApp chat), the call conversation asks: "Is this call related to an open support with this contact?". - Click the correct support: both conversations will be linked, each with a link to the other. - Click "This is a different matter" if the call is unrelated. Nothing is linked automatically because only the person who answered knows the call's subject. If linked incorrectly, click Undo. Dialing a customer 1. In the conversation or contact profile, click the phone icon (Call contact). 2. Choose the voicemail and click Dial. To call a number not yet saved as a contact, use Dial number. 3. The message "Calling... answer on your softphone" appears. Your softphone rings first. When you answer, AtendeSimples calls the customer. The call appears as a new conversation in the voicemail, already assigned to you. If you initiated the call from an open conversation, this conversation will get a link to the call conversation. To dial via Cloud Chat, you need a registered extension in the voicemail and to be logged into the softphone. Recording and transcription Recording After the call ends, the recording appears on the call card as soon as AtendeSimples finishes processing the audio. This usually takes a few minutes. In the meantime, the card shows "Processing with provider". - Listen in the conversation's player or download the audio from the Download menu. - Unanswered calls do not have recordings. Transcription 1. On the call card, click Transcribe. 2. Wait: it takes about 1 to 2 minutes for every 3 minutes of audio. 3. The transcription appears just below the recording, separating what the agent and the customer said. - Segments marked "Low confidence, check audio" are parts where voice recognition was uncertain. Listen to those parts. - You can download the transcript as a .txt file from the Download menu. - Your account may hide personal data in transcripts. When this option is enabled, names, documents, emails, and dates appear as "hidden data". FAQs Do I need a physical phone? No. The softphone works in the browser with a headset with a microphone. Allow microphone access when prompted. Do calls made on my mobile show in Cloud Chat? No. Cloud Chat records calls passing through AtendeSimples VoIP. Calls made on personal or other devices are not included. The call rang for another agent and not for me. Why? The AtendeSimples IVR decides where the call rings based on configured queues and groups. Also, ensure your softphone was open and logged in: IVR only forwards to online agents. A call didn’t turn into a conversation. What do I do? Notify your account administrator. Usually, it’s a configuration adjustment with AtendeSimples, which our team handles. Error appeared when clicking Dial. Common messages: | Message | What to do | | --- | --- | | You don’t have an extension in this voicemail | Ask the administrator to register your extension in the voicemail | | Your dial login (email and extension) was not recognized | Your email and extension in Cloud Chat must match those in AtendeSimples. Notify the administrator | | Recent call to this number; wait before dialing again | Wait a few moments before trying again | | Could not confirm the call went through | Check the voicemail before calling again to avoid duplicates | | Dialing service unavailable; try again soon | Try again shortly | | Dialing service unavailable in your account (balance or activation) | Check your account in AtendeSimples | | Any message requesting to notify the administrator | Notify your account administrator who will contact support | Recording didn’t appear. Unanswered calls do not have recordings. If the call was answered and the card shows "Unavailable," ask your administrator to contact support. After correction, use Retry on the card. I don’t see the Transcribe button. Transcription is a separate feature from telephony. Contact your account manager. Can I configure IVR or hours in Cloud Chat? No. IVR, queues, hours, welcome messages, and support groups are configured in the AtendeSimples panel.

Last updated on Oct 19, 2026

Moderate Instagram Comments via Conversation

Instagram comments that arrive as conversations in Cloud Chat can be hidden, re-shown, or deleted directly within the support interface, without opening Instagram. When to Use - When a comment on a post needs to be removed from public view, but you want to keep a record of what was said. - When a comment needs to be permanently removed. - When a supervisor needs to review what the team has hidden or deleted during a specific period. Prerequisites - An Instagram channel connected to Cloud Chat, with account authorization up to date. - Support permissions in the Instagram inbox. Step-by-step 1. Open the conversation originating from the comment. 2. In the message action menu of the comment, choose Hide Comment or Delete Comment. 3. To undo a hide action, use Show Comment in the same message. The message will display a label, "Comment Hidden" or "Comment Deleted," and the content remains visible in the chat history, even after being deleted on Instagram. Finding Moderated Comments In the conversation filter, use Instagram Comment Status, with three options: - Visible: comments appearing normally on the post. - Hidden: comments that the team has hidden from the public. - Deleted: comments that the team has removed. Saving this filter as a folder provides the supervisor with a ready list of what's been moderated. Notes - Deleting is permanent on Instagram. The comment does not reappear through Cloud Chat or Instagram; only the record within the conversation remains. For reversible actions, use Hide. - The action is performed via Instagram through integration. If the channel authorization expires, the action fails and Cloud Chat notifies you. Just reconnect the channel and try again. - Hiding affects the comment's visibility to the public on the post. The conversation in Cloud Chat remains open and can be responded to normally.

Last updated on Oct 20, 2026