Apps e integrações
Por Pranav
Por Pranav
Conecte o Chatwoot a ferramentas e serviços externos para ampliar seus fluxos de atendimento.
Como rastrear pedidos com a integração do Shopify
Se sua empresa, conta ou projeto utiliza o Shopify como ferramenta, você pode integrá-lo ao Chatwoot para visualizar todos os pedidos de um determinado contato. Os agentes de suporte podem ver os pedidos, seus status e o link para a página do pedido na barra lateral da conversa. Essa integração possibilita o rastreamento de pedidos e fornece às equipes de atendimento ao cliente informações cruciais sobre pedidos sem sair da interface do Chatwoot. Os agentes podem acessar rapidamente detalhes dos pedidos, incluindo status de envio, informações de pagamento e especificações dos produtos diretamente na barra lateral da conversa. Se você está utilizando uma instância auto-hospedada do Chatwoot, por favor, siga este guia. Como Conectar a Integração com o Shopify? Passo 1. Vá até Configurações → Integrações → Shopify. Clique no botão "Configurar" Passo 2. Clique no botão Conectar. Passo 3. Insira a URL da sua loja Shopify e clique no botão Confirmar. Passo 4. Você será redirecionado para a página do Shopify. Clique no botão Instalar App. Passo 5. Após a conclusão, você será redirecionado para o painel do Chatwoot. Pronto! Agora você pode usar o Shopify em sua conta Chatwoot. Funcionalidades Suportadas O Chatwoot exibe todos os pedidos de contatos cujo número de telefone ou e-mail coincida com o registro no Shopify.
Como rastrear problemas e funcionalidades com a integração do Linear?
Se sua empresa, conta ou projeto utiliza o Linear como ferramenta de projetos, você pode integrá-lo ao Chatwoot para gerenciar todas as conversas em seu workspace do Linear. Você pode criar novos issues do Linear diretamente da janela de conversa ou vincular a issues existentes para um acompanhamento mais eficiente. Para começar a configuração, siga os passos abaixo. Se você utiliza uma instância self-hosted do Chatwoot, por favor, siga este guia. Como conectar a integração com o Linear? Passo 1. Vá em Configurações → Integrações → Linear. Clique no botão "Configurar" Passo 2. Clique no botão Conectar. Quando o prompt de consentimento aparecer, clique em Autorizar para conceder as permissões. Quando finalizar, você será redirecionado para o aplicativo do Chatwoot. Voilà! Agora você pode usar o Linear em sua conta do Chatwoot. Funcionalidades Suportadas Criar issues a partir da conversa Para criar um novo issue, abra qualquer conversa e clique no botão do Linear no cabeçalho da conversa. Depois, preencha os detalhes do issue, incluindo título, descrição e time. Após preencher os detalhes, clique no botão Criar para adicionar o issue ao seu workspace do Linear com a conversa vinculada. O issue será criado em seu workspace do Linear com a conversa vinculada. Vincular issues existentes. Para vincular uma conversa a um ticket existente, clique na aba vincular issue, pesquise pelo ticket e clique em "Vincular" para conectá-lo ao ticket do Linear.
Como ativar chamadas de vídeo com a integração Dyte?
Fazer chamadas de vídeo com seus clientes é uma ótima maneira de se conectar rapidamente, entender seus problemas de forma eficiente, fornecer soluções mais rápidas e obter insights valiosos para o negócio. Você pode fazer chamadas de vídeo com seus clientes através do chat ao vivo no site no Chatwoot. Para utilizar este recurso, será necessário habilitar a integração com a Dyte. Este guia explica como fazer isso. P.S. Se você ainda não possui uma conta Dyte, será necessário criar uma primeiro. Como configurar a integração Dyte no Chatwoot? Passo 1. Vá em Configurações -> Aplicativos -> Dyte. Clique no botão correspondente "Configurar". Passo 2. Você verá a página do aplicativo Dyte. Clique no botão "Conectar". Passo 3. Informe seu Organization ID e API Key da Dyte. Como encontrar seus valores de configuração Dyte? Para encontrar esses valores, acesse a seção "API Keys" no seu portal de desenvolvedor da Dyte. No Chatwoot, depois de inserir os valores, clique no botão "Criar". Pronto, sua integração Dyte está completa. Como fazer chamadas de vídeo com seus clientes no Chatwoot? Assim que a integração com a Dyte estiver habilitada, será possível ver a opção de chamada de vídeo na janela de chat da caixa de entrada do site. Para convidar seu cliente para uma chamada de vídeo, siga os passos abaixo. Passo 1. Clique no ícone de câmera de vídeo abaixo do editor de texto. Passo 2. O Chatwoot enviará uma mensagem com um convite para que seu cliente participe da chamada de vídeo. Clique no botão "Clique aqui para participar" para entrar na sala. Passo 3. Agora você estará conectado ao seu cliente. A interface de chamada de vídeo oferece diversas opções para tornar sua experiência e a do cliente ainda mais completa. Algumas dessas opções estão mostradas na captura de tela abaixo:
Como traduzir mensagens com o Google Tradutor?
Se você frequentemente recebe consultas em idiomas que você/sua equipe não entendem, pode utilizar a integração do Google Tradutor no Chatwoot. Quando ativada, você pode traduzir instantaneamente mensagens recebidas usando o menu do botão direito. Dessa forma, você pode se comunicar facilmente com clientes em seu idioma nativo, mesmo que você não o fale. Como ativar o Google Tradutor no Chatwoot? Passo 1. Vá em Configurações -> Aplicativos -> Google Tradutor. Clique no botão "Configurar" correspondente. Passo 2. Você verá a página do aplicativo Google Tradutor. Clique no botão "Conectar". Passo 3. Insira seu ID do Projeto Google Cloud e o Arquivo de Chave do Projeto. Se precisar de ajuda para obter esses valores, consulte este documento do Google. Depois de inserir os valores, clique no botão "Criar". Pronto, sua integração com o Google Tradutor está concluída. Como alterar o idioma de tradução? Suas mensagens serão traduzidas para o idioma do seu site. Para selecionar o idioma do site, vá na página "Configurações da Conta". Passo 1. Vá em Configurações -> Configurações da Conta -> Idioma do Site. Abra o menu suspenso e selecione seu idioma preferido. Passo 2. Clique no botão "Atualizar Configurações" no canto superior direito da página. Isso irá traduzir todo o seu painel para o idioma selecionado. Nota: Agentes também podem selecionar seus idiomas preferidos individualmente. Como traduzir mensagens recebidas? Sempre que você receber uma mensagem em um idioma no qual precisa de ajuda, clique nos 3 pontos ao lado da mensagem para abrir o menu e selecione "Traduzir". O conteúdo traduzido aparecerá em linha. Como criar uma conta de serviço no Google Cloud Console? Para criar uma conta de serviço para a API do Google Tradutor, comece fazendo login no Google Cloud Console e selecionando ou criando um novo projeto. Quando seu projeto estiver pronto, ative a Cloud Translation API navegando até “APIs e Serviços” > “Biblioteca” e pesquisando por “Cloud Translation API”. Clique em “Ativar” para ativar a API no seu projeto. É necessário ativar a cobrança, caso ainda não tenha feito isso. Em seguida, vá para “IAM e Admin” > “Contas de Serviço” e clique em “Criar Conta de Serviço.” Forneça um nome (por exemplo, translate-api-user) e continue atribuindo o papel de “Usuário da API Cloud Translation.” Após criar a conta de serviço, vá até a seção “Chaves”, clique em “Adicionar Chave” e selecione “Criar nova chave” no formato JSON. Baixe e armazene com segurança este arquivo JSON. Utilize o conteúdo do arquivo obtido acima no campo Arquivo de Chave do Projeto Google Cloud no Chatwoot.
Como usar aplicativos de painel?
Com aplicativos de Dashboard, você pode integrar um aplicativo dentro do painel do Chatwoot para uso dos agentes. Esse recurso permite que você crie um aplicativo de forma independente, que pode ser incorporado para exibir informações dos clientes, pedidos, histórico de pagamentos anteriores, etc. Ao ser incorporado no painel do Chatwoot, seu aplicativo receberá o contexto da conversa e do contato como um evento da janela. Implemente um listener para o evento message em sua página para receber o contexto. P.S. Confira nosso YouTube ao vivo sobre como construir um Dashboard App. Como criar um aplicativo de dashboard? Passo 1. Vá para Configurações → Integrações → Aplicativos de Dashboard. Clique no botão “Configurar” correspondente aos Aplicativos de Dashboard. Passo 2. Adicione o nome do seu aplicativo e a URL onde ele está hospedado. Depois de concluir, uma nova guia com o nome que você deu ao aplicativo aparecerá na janela da conversa. Neste caso, é “Pedidos do Cliente”. Ao clicar na nova guia, você poderá ver seu aplicativo buscando dados no painel do Chatwoot. Recebendo dados do Chatwoot no seu aplicativo O Chatwoot fornecerá o contexto da conversa e do contato como um evento da janela. Isso pode ser acessado dentro do seu aplicativo implementando um listener para o evento, como mostrado aqui: window.addEventListener("message", function (event) { if (!isJSONValid(event.data)) { return; } const eventData = JSON.parse(event.data); }); Solicitação sob demanda de dados do Chatwoot Se você precisar solicitar os dados da conversa sob demanda do Chatwoot, pode enviar uma mensagem para a janela pai usando a API postMessage do JavaScript. O Chatwoot estará ouvindo esta chave: chatwoot-dashboard-app:fetch-info. Exemplo O código a seguir pode ser usado para consultar o aplicativo de dashboard. O Chatwoot responderá a essa solicitação fornecendo rapidamente o payload atualizado da conversa. window.parent.postMessage('chatwoot-dashboard-app:fetch-info', '*') // Você receberá uma mensagem no listener on message com o payload appContext. Payload do Evento Objeto conversation { "meta": { "sender": { "additional_attributes": { "description": "string", "company_name": "string", "social_profiles": { "github": "string", "twitter": "string", "facebook": "string", "linkedin": "string" } }, "availability_status": "string", "email": "string", "id": "integer", "name": "string", "phone_number": "string", "identifier": "string", "thumbnail": "string", "custom_attributes": "object", "last_activity_at": "integer" }, "channel": "string", "assignee": { "id": "integer", "account_id": "integer", "availability_status": "string", "auto_offline": "boolean", "confirmed": "boolean", "email": "string", "available_name": "string", "name": "string", "role": "string", "thumbnail": "string" }, "hmac_verified": "boolean" }, "id": "integer", "messages": [ { "id": "integer", "content": "Hello", "inbox_id": "integer", "conversation_id": "integer", "message_type": "integer", "content_type": "string", "content_attributes": {}, "created_at": "integer", "private": "boolean", "source_id": "string", "sender": { "additional_attributes": { "description": "string", "company_name": "string", "social_profiles": { "github": "string", "twitter": "string", "facebook": "string", "linkedin": "string" } }, "custom_attributes": "object", "email": "string", "id": "integer", "identifier": "string", "name": "string", "phone_number": "string", "thumbnail": "string", "type": "string" } } ], "account_id": "integer", "additional_attributes": { "browser": { "device_name": "string", "browser_name": "string", "platform_name": "string", "browser_version": "string", "platform_version": "string" }, "referer": "string", "initiated_at": { "timestamp": "string" } }, "agent_last_seen_at": "integer", "assignee_last_seen_at": "integer", "can_reply": "boolean", "contact_last_seen_at": "integer", "custom_attributes": "object", "inbox_id": "integer", "labels": "array", "muted": "boolean", "snoozed_until": null, "status": "string", "timestamp": "integer", "unread_count": "integer", "allMessagesLoaded": "boolean", "dataFetched": "boolean" } Objeto contact { "additional_attributes": { "description": "string", "company_name": "string", "social_profiles": { "github": "string", "twitter": "string", "facebook": "string", "linkedin": "string" } }, "availability_status": "string", "email": "string", "id": "integer", "name": "string", "phone_number": "+91 9000000001", "identifier": "string || null", "thumbnail": "+91 9000000001", "custom_attributes": {}, "last_activity_at": "integer" } Objeto currentAgent { "email": "string", "id": "integer", "name": "string" } Payload Final { "event": "appContext", "data": { "conversation": { // <...Atributos da Conversa> }, "contact": { // <...Atributos do Contato> }, "currentAgent": { // <...Atributos do agente atual> } } }
Como responder conversas no Slack?
Se sua empresa/conta/projeto utiliza o Slack como meio de comunicação, você pode integrar o Slack ao Chatwoot para gerenciar todas as conversas da sua caixa de entrada diretamente no seu workspace Slack. Para iniciar a configuração rápida, siga os passos explicados abaixo. Se você está utilizando uma instância Chatwoot auto-hospedada, por favor siga este guia. Como integrar o Slack ao Chatwoot? Passo 1. Vá em Configurações -> Integrações -> Slack -> Conectar. Passo 2. Digite a URL do seu workspace Slack conforme solicitado. Passo 3. Revise as permissões e permita que o aplicativo Chatwoot acesse seu workspace Slack. Passo 4. Você será redirecionado para a tela de configuração, onde poderá ver uma lista dos seus canais Slack (públicos e privados). (Para canais privados, veja a seção abaixo) Você precisa selecionar o canal de sua escolha no menu suspenso onde deseja receber suas conversas do Chatwoot. Clique no botão Atualizar. Agora, a integração está completa. Nota importante Se você conectou o Slack antes de setembro de 2023, não teve a opção de selecionar um canal específico do Slack para gerenciar suas conversas. Caso queira mudar isso e escolher um canal específico, você precisará excluir sua integração Slack existente do aplicativo Chatwoot e conectá-la novamente. FAQ P: Estou respondendo a uma mensagem, mas ela não aparece na caixa de entrada do Chatwoot. R: Ao responder à mensagem, responda dentro do mesmo tópico (thread). Cada tópico representa uma conversa separada, então para que sua resposta apareça na mesma mensagem, você deve responder dentro do tópico. Usamos o ID do thread para verificar conversas separadas. Funcionalidades suportadas Responda usando seu perfil de agente Quando você responde a uma conversa pelo Slack, o cliente recebe a resposta a partir do seu perfil de Agente no Chatwoot. Crie notas privadas a partir do Slack Você pode criar uma nota privada no Chatwoot a partir do Slack. Se você iniciar uma mensagem com "note:", ela será convertida em uma nota privada e notificará os agentes marcados. Veja um exemplo: Como adicionar o Chatwoot a canais privados? O Chatwoot não será adicionado automaticamente aos seus canais privados do Slack. Você precisará adicioná-lo manualmente. Veja como fazer: Passo 1: Após autenticar com o Slack, você será redirecionado para uma página no Chatwoot onde pode selecionar o canal desejado. Passo 2: No Slack, abra o canal privado que deseja conectar. Clique nos ícones de usuário no topo do canal. Vá em Integrações → Adicionar aplicativos. Passo 3: Procure por Chatwoot. Você verá o aplicativo Chatwoot na lista. Passo 4: Clique em Chatwoot para adicioná-lo ao canal privado. Você verá uma mensagem de confirmação informando que o Chatwoot foi adicionado. Passo 5: Volte para o aplicativo Chatwoot e atualize a página. O canal deverá aparecer na lista. Selecione o canal e conclua a integração. Nota: Se ainda não funcionar, conecte a integração do Slack com um canal público, depois remova a integração pelo Chatwoot e reconecte novamente.
Como aprimorar conversas com a integração do OpenAI?
Engajar clientes exige profissionalismo incansável. A forma como você se comunica com seus clientes geralmente é um grande fator para as vendas e retenção de clientes. Sem falar nos efeitos sobre a identidade da marca. Mas, para sempre soar perfeito––você teria que ser um robô. Por isso, trouxemos IA para o seu painel. Com nossa integração com a OpenAI, você pode melhorar suas conversas com clientes à medida que elas acontecem. Ao integrar IA ao seu painel do Chatwoot, você pode melhorar as conversas com clientes em tempo real sem sacrificar sua voz única ou identidade da marca. Você receberá sugestões alimentadas por IA que ajudam a refinar suas mensagens e se comunicar de forma mais eficaz com seus clientes. A configuração da integração leva menos de um minuto, e os benefícios são imediatos. Para começar, siga os passos abaixo. Como integrar OpenAI ao Chatwoot? Passo 1. Vá para Configurações → Aplicativos → OpenAI. Clique no botão correspondente “Configurar”. Passo 2. Clique no botão "Conectar". Uma janela modal irá aparecer, solicitando sua chave de API da OpenAI. Para obter sua chave de API da OpenAI, faça login em sua conta OpenAI e acesse este link. Após inserir sua chave secreta de API, você verá uma mensagem de sucesso na tela. Como usar os recursos de IA no Chatwoot? Existem três recursos alimentados por IA no Chatwoot. As seções abaixo explicam como usá-los. Sugestão de resposta com IA O recurso “Sugestão de resposta com IA” sugere uma possível resposta para uma mensagem de um cliente, ajudando em respostas rápidas. Siga os passos abaixo para usar este recurso. Passo 1. Vá para a aba Conversas na barra lateral e abra uma conversa que precisa de resposta. Você verá uma nova opção chamada "Sugestão de resposta com IA". Veja um exemplo: Passo 2. Clique no botão para ver a sugestão. A caixa de resposta será preenchida com a resposta sugerida. Passo 3. Edite sua mensagem como desejar e clique no botão Enviar! Melhorar com IA O recurso "Melhorar com IA" sugere melhorias nas mensagens que você está escrevendo. Siga os passos abaixo para usar esse recurso. Passo 1. Vá para a sua aba de Conversas na barra lateral e abra uma conversa. Comece a digitar uma mensagem na caixa de texto. Enquanto escreve, você verá uma nova opção chamada "Melhorar com IA". Veja um exemplo: Passo 2. Clique no botão "Melhorar com IA" para ver suas opções. Selecione um tom para sua mensagem – profissional ou amigável. Clique no botão "Gerar". Com base na sua seleção de tom, a IA irá reescrever sua mensagem e preencher instantaneamente a caixa de texto com a nova mensagem. Continuando o exemplo, veja como seria: Passo 3. Edite sua mensagem como desejar e clique no botão Enviar! Resumo com IA O recurso "Resumo com IA" resume conversas em Notas Privadas em segundos. Siga os passos abaixo para usar esse recurso. Passo 1. Vá para a aba Conversas na barra lateral e abra uma conversa. Mude para a aba "Nota Privada". Você verá uma nova opção chamada "Resumo com IA". Veja um exemplo: Passo 2. Clique no botão. O editor de texto será preenchido com um resumo da conversa. Passo 3. Edite sua nota como desejar e clique no botão ‘Adicionar Nota’! Como usar o Assistente de IA? Você pode ativar o assistente de IA selecionando-o na barra de comandos ou clicando no botão de Assistente de IA dentro do editor. Para selecionar o recurso desejado, basta clicar nele. Após clicar em uma opção, o modal Sugestão de Resposta com IA será aberto, exibindo o conteúdo gerado pela IA. Para inserir o conteúdo no editor, clique no botão Usar esta sugestão. Perguntas Frequentes Os resultados do Assistente de IA são sempre precisos? Os resultados podem não ser sempre precisos. Embora o Assistente de IA seja projetado para fornecer sugestões precisas, é importante que os agentes revisem e verifiquem as sugestões antes de enviá-las aos clientes. Além disso, estamos continuamente trabalhando para melhorar nosso Assistente de IA. Vocês suportam algum provedor de IA além da OpenAI? No momento, suportamos apenas a OpenAI. Mas estamos planejando adicionar mais provedores em breve.
Como integrar seu chatbot Dialogflow ao Chatwoot?
Chatbots são valiosos para muitas equipes de engajamento ao cliente. Eles lidam de forma eficiente com perguntas triviais e liberam os agentes humanos para focar em questões mais importantes. Dialogflow e Rasa.ai são plataformas líderes de PLN (Processamento de Linguagem Natural) para construir chatbots personalizados. Neste guia, explicamos como você pode criar um bot no Dialogflow e integrá-lo facilmente com o Chatwoot em segundos. Como criar um bot no Dialogflow? Passo 1. Acesse seu Console do Dialogflow. Usaremos o Dialogflow Essentials neste artigo. Clique em "Create Agent". Você verá opções como estas: Passo 2. Você precisará criar intents baseados em como deseja que seu bot responda. Existem 2 intents padrões no projeto chamadas "Default Fallback Intent" e "Default Welcome Intent", como mostrado abaixo. Isso conclui a configuração básica do bot. Agora vamos criar uma conta de serviço e conectá-la ao Chatwoot. Você também pode criar intents adicionais para seus casos de uso específicos. O Chatwoot também suporta intents avançadas que permitem transferência para agente, mensagens interativas, etc. referência: Role até "Advanced Intents". Passo 3. Crie uma conta de serviço. Para conectar este bot ao Chatwoot, você precisa criar uma conta de serviço no seu console do Google Cloud. Navegue até o console do projeto no Google Cloud clicando no Project ID nas configurações do projeto. Navegue até IAM & Admin -> Service Accounts. Você verá uma visualização como a exibida abaixo. Clique em "Create Service Account". Forneça um nome e uma descrição para a conta de serviço como mostrado abaixo. Para conceder acesso, selecione Dialogflow API Client no menu suspenso. Continue e clique em "Done". Agora, você poderá ver o serviço listado no painel. O próximo passo é criar uma chave para poder compartilhá-la com o Chatwoot. Clique na conta de serviço e depois clique na aba "Keys". Em seguida, clique em "Add Key". Você verá uma tela como abaixo. Clique em "JSON" e depois em "Create". Isso irá gerar uma chave para sua conta de serviço. Baixe a chave e salve para uso posterior. Configurando a Integração do Dialogflow no Chatwoot O Chatwoot possui integração nativa com Dialogflow. Você pode conectar seu bot com o Chatwoot em dois passos rápidos. Passo 1. Vá até "Settings -> Applications -> Dialogflow". Clique em "Configure". Passo 2. Clique no botão "Add a new hook". Isso abrirá um modal de configuração. Você precisa adicionar "Project ID", "Project Key file" e uma caixa de entrada para criar um hook. Copie o conteúdo do arquivo de chave baixado anteriormente e cole na área de texto. Pronto! A integração está concluída. Teste a caixa de entrada do site para ver se o bot responde à consulta inicial. Intenções Avançadas Criando uma intenção de transferência Assim que o usuário solicitar para falar com um agente, o Dialogflow deve informar ao Chatwoot que um agente pode assumir a conversa. Crie uma intent chamada "Handoff Intent" com frases de treinamento como "Falar com um agente" ou "Quero falar com um agente", etc. Para tratar a transferência, crie uma resposta do tipo "Custom Payload", como mostrado abaixo. { "action": "handoff" } Ao acionar uma intenção com o payload acima, o Chatwoot irá alternar o status da conversa para open e transferi-la para um agente. Mensagens Interativas Nota: Mensagens interativas são suportadas apenas na caixa de entrada do site atualmente. A integração Chatwoot-Dialogflow também suporta mensagens interativas. Os seguintes tipos de mensagens interativas são suportados. 1. Opções (suporte a follow-up) 2. Cards 3. Artigos Criando uma intenção de mensagem interativa Você pode criar outras mensagens interativas alterando o payload conforme mencionado no guia de mensagens interativas. Crie uma intenção com as frases de treinamento desejadas e uma resposta "Custom Payload", como mostrado abaixo para uma mensagem de opções. ## exemplo de mensagem interativa de opções { "content_type": "input_select", "content": "Selecione seu alimento favorito abaixo", "content_attributes": { "items": [ { "value": "I like sushi", "title": "Sushi" }, { "title": "Biryani", "value": "I like biryani" }, { "title": "Pizza", "value": "I like pizza" } ] }, "private": false } Quando um usuário interage com mensagens de entrada e seleciona um valor, isso retorna ao Dialogflow. Isso permite configurar intents de follow-up, como criar uma intent com a frase de treinamento "I like biryani" para casos em que o contato seleciona a opção "biryani". Como um agente pode transferir a conversa de volta para o bot do Dialogflow? Quando o bot Dialogflow está conectado a uma caixa de entrada, as conversas são criadas com status pending (pendente) ao invés de open (aberto). Isso permite que o atendimento inicial aconteça via o bot antes de passar a conversa para um agente. Quando o handoff acontece, o status da conversa muda para open e o bot para de responder à mesma. Às vezes os agentes podem querer devolver uma conversa transferida novamente para a fila do bot. Eles podem fazer isso mudando o status da conversa novamente para pending. Isso fará com que o bot volte a responder para aquela conversa.
Como usar webhooks?
Webhooks são callbacks HTTP configurados para cada conta. Eles são acionados quando ações como a criação de uma mensagem ocorrem no Chatwoot. Vários webhooks podem ser criados para uma única conta. Como adicionar um webhook? Passo 1. Acesse Configurações → Integrações → Webhooks. Clique no botão "Configurar". Passo 2. Clique no botão "Adicionar novo webhook". Um modal será aberto. Aqui, insira a URL para a qual a requisição POST deve ser enviada. Em seguida, você precisa selecionar os eventos aos quais deseja se inscrever. Esta opção permite que você escute apenas pelos eventos relevantes no Chatwoot. O Chatwoot enviará uma requisição POST com o seguinte payload para as URLs configuradas para diversas atualizações em sua conta. Exemplo de payload de webhook { "event": "message_created", // Nome do evento "id": "1", // ID da mensagem "content": "Hi", // Conteúdo da mensagem "created_at": "2020-03-03 13:05:57 UTC", // Hora em que a mensagem foi enviada "message_type": "incoming", // Terá o valor incoming, outgoing ou template. O usuário do widget envia mensagens incoming, o agente envia mensagens outgoing para o usuário. "content_type": "enum", // Isto é um enum, pode ser input_select, cards, form ou text. O message_type será template se o content_type for um destes. O valor padrão é text "content_attributes": {} // Será um objeto, valores diferentes são definidos abaixo "source_id": "", // Será o id externo se a caixa de entrada for uma integração com Twitter ou Facebook. "sender": { // Proverá detalhes do agente que enviou a mensagem "id": "1", "name": "Agent", "email": "[email protected]" }, "contact": { // Proverá detalhes do usuário que enviou a mensagem "id": "1", "name": "contact-name" }, "conversation": { // Proverá detalhes da conversa "display_id": "1", // ID da conversa visível no dashboard. "additional_attributes": { "browser": { "device_name": "Macbook", "browser_name": "Chrome", "platform_name": "Macintosh", "browser_version": "80.0.3987.122", "platform_version": "10.15.2" }, "referer": "<http://www.chatwoot.com>", "initiated_at": "Tue Mar 03 2020 18:37:38 GMT-0700 (Mountain Standard Time)" } }, "account": { // Proverá detalhes da conta "id": "1", "name": "Chatwoot", } } Eventos de webhook suportados no Chatwoot O Chatwoot publica vários eventos para os endpoints de webhook configurados. Se você quiser configurar um webhook, consulte o guia aqui. Cada evento possui sua estrutura de payload com base no tipo de modelo sobre o qual atuam. A seção a seguir descreve os principais objetos que usamos no Chatwoot e seus atributos. Objetos Um payload de evento pode incluir qualquer um dos seguintes objetos. Os vários tipos de objetos suportados pelo Chatwoot estão listados abaixo. Conta { "id": "integer", "name": "string" } Caixa de entrada { "id": "integer", "name": "string" } Contato { "id": "integer", "name": "string", "avatar": "string", "type": "contact", "account": { // <...Objeto Conta> } } Usuário { "id": "integer", "name": "string", "email": "string", "type": "user" } Conversa { "additional_attributes": { "browser": { "device_name": "string", "browser_name": "string", "platform_name": "string", "browser_version": "string", "platform_version": "string" }, "referer": "string", "initiated_at": { "timestamp": "iso-datetime" } }, "can_reply": "boolean", "channel": "string", "id": "integer", "inbox_id": "integer", "contact_inbox": { "id": "integer", "contact_id": "integer", "inbox_id": "integer", "source_id": "string", "created_at": "datetime", "updated_at": "datetime", "hmac_verified": "boolean" }, "messages": ["Array de objetos de mensagem"], "meta": { "sender": { // Objeto Contato }, "assignee": { // Objeto Usuário } }, "status": "string", "unread_count": "integer", "agent_last_seen_at": "unix-timestamp", "contact_last_seen_at": "unix-timestamp", "timestamp": "unix-timestamp", "account_id": "integer" } Mensagem { "id": "integer", "content": "string", "message_type": "integer", "created_at": "unix-timestamp", "private": "boolean", "source_id": "string / null", "content_type": "string", "content_attributes": "object", "sender": { "type": "string - contact/user" // Objeto Usuário ou Contato }, "account": { // Objeto Conta }, "conversation": { // Objeto Conversa }, "inbox": { // Objeto Caixa de entrada } } Exemplo de payload de webhook { "event": "event_name" // Atributos relacionados ao evento } Eventos de Webhook O Chatwoot suporta os seguintes eventos de webhook. Você pode se inscrever neles ao configurar um webhook no painel ou utilizando a API. conversation_created Este evento será acionado quando uma nova conversa for criada na conta. O payload do evento é o seguinte. { "event": "conversation_created" // <...Atributos da Conversa> } conversation_updated Este evento será acionado quando houver uma alteração em algum dos atributos da conversa. { "event": "conversation_updated", "changed_attributes": [ { "<nome_do_atributo>": { "current_value": "", "previous_value": "" } } ] // <...Atributos da Conversa> } conversation_status_changed Este evento será acionado quando o status da conversa for alterado. Nota: Se você estiver utilizando APIs de agent bot em vez de webhooks, este evento ainda não é suportado. { "event": "conversation_status_changed" // <...Atributos da Conversa> } message_created Este evento será acionado quando uma mensagem for criada em uma conversa. O payload do evento é o seguinte. { "event": "message_created" // <...Atributos da Mensagem> } message_updated Este evento será acionado quando uma mensagem for atualizada em uma conversa. O payload do evento é o seguinte. { "event": "message_updated" // <...Atributos da Mensagem> } webwidget_triggered Este evento será acionado quando o usuário final abrir o widget de chat ao vivo. { "event": "webwidget_triggered", "id": "", "contact": { // <...Objeto Contato> }, "inbox": { // <...Objeto Caixa de Entrada> }, "account": { // <...Objeto Conta> }, "current_conversation": { // <...Objeto Conversa> }, "source_id": "string", "event_info": { "initiated_at": { "timestamp": "date-string" }, "referer": "string", "widget_language": "string", "browser_language": "string", "browser": { "browser_name": "string", "browser_version": "string", "device_name": "string", "platform_name": "string", "platform_version": "string" } } } conversation_typing_on Este evento é acionado quando um agente começa a digitar em uma conversa. Pode ser uma nota privada ou uma mensagem para o cliente. Você pode usar o flag is_private para diferenciar entre os dois. { "event": "conversation_typing_on", "conversation": { ...<Objeto Conversa> }, "user": { ... <Usuário / AgentBot / Objeto Capitão> }, "is_private": true } conversation_typing_off Este evento é acionado quando o agente para de digitar ou sai da janela da conversa. { "event": "conversation_typing_off", "conversation": { ...<Objeto Conversa> }, "user": { ... <Usuário / AgentBot / Objeto Capitão> }, "is_private": true } Verificando webhooks O Chatwoot assina todas as requisições de webhook de saída para que seu servidor possa verificar se o payload foi enviado pelo Chatwoot e não foi adulterado. O segredo é exibido uma vez que o webhook é criado, e você pode visualizá-lo novamente no formulário de edição do webhook. Toda requisição de webhook envia os seguintes cabeçalhos, que podem ser usados para calcular a assinatura HMAC do payload - X-Chatwoot-Signature: assinatura HMAC-SHA256 prefixada com sha256= - X-Chatwoot-Timestamp: timestamp Unix (segundos) de quando a requisição foi assinada - X-Chatwoot-Delivery: ID único de entrega para o evento de webhook (quando disponível) A assinatura é calculada assim: sha256=HMAC-SHA256(webhook_secret, "{timestamp}.{raw_body}") Onde: - webhook_secret é o segredo associado ao webhook - timestamp é o valor do cabeçalho X-Chatwoot-Timestamp - raw_body é o corpo da requisição JSON bruta (não parseado/re-serializado) Passos de Verificação 1. Extraia X-Chatwoot-Signature e X-Chatwoot-Timestamp dos cabeçalhos da requisição 2. Leia o corpo bruno da requisição como bytes (não parse e re-serialize) 3. Calcule a assinatura esperada: sha256=HMAC-SHA256(secret, "{timestamp}.{raw_body}") 4. Compare a assinatura calculada com a recebida usando uma comparação em tempo constante 5. Opcionalmente, rejeite requisições cujo timestamp seja muito antigo para prevenir ataques de repetição (replay) Exemplos Ruby def verify_signature(raw_body, timestamp, received_signature, secret) expected = "sha256=#{OpenSSL::HMAC.hexdigest('SHA256', secret, "#{timestamp}.#{raw_body}")}" ActiveSupport::SecurityUtils.secure_compare(expected, received_signature) end Python import hmac import hashlib def verify_signature(raw_body: bytes, timestamp: str, received_signature: str, secret: str) -> bool: message = f"{timestamp}.".encode() + raw_body expected = "sha256=" + hmac.new(secret.encode(), message, hashlib.sha256).hexdigest() return hmac.compare_digest(expected, received_signature) Node.js const crypto = require("crypto"); function verifySignature(rawBody, timestamp, receivedSignature, secret) { const message = `${timestamp}.${rawBody}`; const expected = "sha256=" + crypto.createHmac("sha256", secret).update(message).digest("hex"); return crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(receivedSignature) ); } Go import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt" ) func verifySignature(rawBody []byte, timestamp, receivedSignature, secret string) bool { mac := hmac.New(sha256.New, []byte(secret)) mac.Write([]byte(fmt.Sprintf("%s.%s", timestamp, rawBody))) expected := "sha256=" + hex.EncodeToString(mac.Sum(nil)) return hmac.Equal([]byte(expected), []byte(receivedSignature)) } Notas Importantes - Sempre utilize o corpo bruto da requisição para verificação. Fazer o parse do JSON e depois re-serializar pode alterar a ordenação das chaves, espaços ou escape unicode, o que resultará em uma assinatura diferente. - Sempre utilize comparação em tempo constante (ex: hmac.compare_digest, crypto.timingSafeEqual, ActiveSupport::SecurityUtils.secure_compare) para prevenir ataques de timing. - Considere rejeitar requisições com timestamp mais antigos que 5 minutos para mitigar ataques de repetição.