> For the complete documentation index, see [llms.txt](https://ajuda.livechat360.com.br/crm/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ajuda.livechat360.com.br/crm/administracao/webhook.md).

# Webhook

Webhook para escuta de requisições.

Um webhook para escuta de requisições é como uma caixa de correio inteligente que recebe notificações de outros sistemas. Ao invés de você ir buscar as informações, elas são entregues diretamente na sua "porta".

**Exemplo:**

Imagine que você tem um sistema de atendimento ao cliente. Você pode configurar um webhook para receber notificações de um sistema de pagamentos. Quando um pagamento for realizado, o sistema de pagamento envia uma notificação para o seu sistema de atendimento, permitindo que seus atendentes saibam, por exemplo, que o cliente realizou o pagamento.

## Modo de Teste / Modo de Produção

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FVwu9s5Weye9g8ri9uV7g%2Fimage.png?alt=media&amp;token=d6cf57b7-f19b-4282-b4da-668e8909475b" alt=""><figcaption></figcaption></figure>

Na parte superior direita da página existe um botão de alternância com as seguintes configurações: se azul, o modo de produção do webhook estará ativado; se cinza, o modo de teste do webhook estará ativado.

Em modo de teste, as requisições processadas e mapeadas não serão registradas no servidor. Esse modo serve justamente para testar as requisições e ajudar a configurar o webhook de escuta.&#x20;

## **Link do Webhook**

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FhatoEYSThLYDJ3DMP0vE%2Fimage.png?alt=media&amp;token=b65222a8-a31b-4a3c-937a-e68ec3aa8509" alt=""><figcaption></figcaption></figure>

O **link do webhook** é como o endereço da sua casa. É para esse endereço que outros mensageiros (sistemas) irão enviar informações ou pacotes. Esse link é exclusivo e precisa ser compartilhado com os sistemas que vão enviar dados para você. Pense nele como a referência para o entregador saber onde deixar o pacote.

#### Copiando o link do webhook:

Para copiar o link do webhook e disponibilizá-lo para que seja usado na configuração do webhook de envio de requisição de outros sistemas, basta clicar no botão "*Copiar*".

Alternativamente, outra opção seria, na página inicial do gerenciamento, clicar no botão "*Copiar link*".

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2Fawn2QOQS28ZBVvvsxf6l%2Fimage.png?alt=media&amp;token=e45e6622-4a42-4b63-ae8a-111b897264b7" alt="" width="187"><figcaption></figcaption></figure>

## **Sua Requisição de Teste**

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2F5CCNKQVhyLrWJV8nlkKY%2Fimage.png?alt=media&amp;token=1c7e8e25-5d89-44fc-9bb2-f71ac4df295c" alt=""><figcaption></figcaption></figure>

Esse campo é como uma caixa de entrada de pacotes em modo de teste. Imagine que você queira ver os pacotes que chegam antes de abri-los ou processá-los. Quando o sistema está em modo de teste, qualquer requisição enviada para o link do webhook será exibida aqui para visualização. Ele mostra exatamente o que está dentro do pacote (a estrutura dos dados) sem que o sistema processe a informação.

{% hint style="info" %}
**Importante**: Quando o sistema **não está no modo de teste**, quando está em modo de produção, ele processará automaticamente as requisições recebidas, sem exibi-las nessa caixa de teste.
{% endhint %}

### Selecionando uma requisição:

Cada requisição realizada pelo outro sistema ao webhook de escuta é listada na caixa de seleção de requisições de teste com uma numeração crescente a partir do número um, sendo o 1 a primeira requisição, o 2 a segunda, o 3 a terceira e assim sucessivamente:

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FSI9qOwGMfJCEgKlfNECp%2Fimage.png?alt=media&amp;token=65d2a6f0-e86d-4e24-ab4a-b12efcac0417" alt=""><figcaption><p>Nesse exemplo, foram feitas ao <em>webhook de escuta</em> 3 requisições.</p></figcaption></figure>

Ao selecionar uma das requisições, será mostrada a requisição selecionada com suas chaves e valores:

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FU3HAqybcXyD5iPsba9OA%2Fimage.png?alt=media&amp;token=86596750-96af-4a93-a83e-d1422444d116" alt=""><figcaption></figcaption></figure>

Uma vez selecionada a requisição desejada, o mapeamento das requisições, que será os passos seguintes, irá apresentar as propriedades da requisição selecionada.

## **Tipo de Webhook**

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FUj2w6lqP6D3t525HpgoE%2Fimage.png?alt=media&amp;token=37573f23-9483-4809-9c7e-8b3e6ca4f49d" alt=""><figcaption></figcaption></figure>

Este campo define o "tipo" de pacote que você aceita e processa, dependendo do que ele deve manipular.

* **Contato**: Esse tipo de webhook é para pacotes que manipulam **informações dos contatos**, a saber: variáveis de *campos customizáveis* e de *campos de sistema (telefone, e-mail ...)*. Imagine que ele lida com dados de clientes ou leads, como quando você recebe o cadastro de um novo cliente.
* **Sistema**: Este é como um pacote de ferramentas que vai manipular variáveis globais, como variáveis de banco de dados.

### Selecionando um tipo de webhook:

Há duas opções para serem selecionadas: Contato e Sistema.

Ao selecionar o tipo de webhook **Contato**, haverá a opção, em seguida, de Buscar ou Criar um Contato, além de realizar o mapeamento das propriedades. Em ambos os casos, as caixas de seleção de *Campos* apresentarão a listagem de *Campos Customizáveis* e de *Campos de Sistema*.

Ao selecionar o tipo de webhook **Sistema**, haverá a opção, em seguida, de realizar o mapeamento das propriedades. A caixa de seleção de *Campos* apresentará a listagem de variáveis do *Banco de Dados*.

{% hint style="warning" %}
Quando selecionada a opção **Contato**, na busca ou criação de contato, haverá duas configurações adicionais: *Lógica do filtro* (E / OU) e configuração para *caso encontre múltiplos contatos, mas o telefone não esteja duplicado*.&#x20;

Essas duas configurações não estarão disponíveis quando a opção selecionada for **Sistema**, sendo que a lógica do filtro nesse caso será automaticamente a da opção "[**E - Contato precisa atender a todas as regra**](#e-contato-precisa-atender-a-todas-as-regras)".
{% endhint %}

## **Buscar ou Criar um Contato**

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FvBTaZrPTRD138Q4PS7Oq%2Fimage.png?alt=media&amp;token=f3686535-677b-4889-a97b-150e0157acb1" alt=""><figcaption></figcaption></figure>

Esse campo é como uma rotina de identificação ou busca no seu sistema. É como se você tivesse uma lista de contatos e, quando chega um novo pacote (requisição), o sistema verifica a lista para ver se aquele contato já está registrado ou precisa ser criado.

* **Como funciona**: O sistema usa as informações da requisição (como telefone, e-mail etc.) para procurar o contato certo. Se ele encontrar uma correspondência, usará aquele contato.&#x20;

{% hint style="info" %}
Será feita uma busca pelo *valor da propriedade da requisição* no campo que tiver sido selecionado. Essa busca será em relação a propriedade informada. Se não for encontrada uma correspondência, ao menos o campo 'Telefone' – mesmo que retornar um valor vazio posteriormente – terá que ter sido adicionado como condição na busca **para que um contato seja criado**.
{% endhint %}

* **Exemplo de uso**: Se você está recebendo uma requisição que inclui o telefone de um cliente, o sistema pode buscar por esse telefone. Se o telefone não existe no sistema, ele cria um novo contato automaticamente.

### Lógica de filtro: E e OU

Se o tipo de webhook selecionado for o de **Contato**, então será preciso selecionar a lógica de filtro desejada, que possui duas opções:

* **E** - Contato precisa atender a todas as regra
* **OU** - Contato precisa atender pelo menos uma regra

Se o tipo de webhook selecionado for o de **Sistema**, então automaticamente o sistema aplicará a lógica do filtro E.

#### **E** - Contato precisa atender a todas as regras:

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FejXvbmBGXuPoyvp3VWRe%2Fimage.png?alt=media&amp;token=424058ab-2a30-403f-aedc-826cea335384" alt=""><figcaption></figcaption></figure>

A análise ocorre em ordem de importância, ou seja, na sequência em que as condições foram cadastradas, além disso, a análise de múltiplas condições leva em consideração a filtragem da condição anterior. O processo segue a seguinte lógica:

1. A primeira condição é analisada:
   * Se **nenhum contato único** for encontrado e o campo de telefone estiver sendo buscado, um novo contato será criado. Caso contrário, um erro será retornado e não será dado continuidade ao webhook.
   * Se for encontrado **um único contato**, ele será selecionado e o webhook seguirá para a próxima fase, sem analisar as demais condições.
   * Se forem encontrados **vários contatos**, a análise segue para a segunda condição. Se não houver uma segunda condição, será retornado erro e não será dado continuidade ao webhook.
2. A segunda condição é analisada:
   * **Dentre os vários contatos encontrados anteriormente**, se **nenhum contato único** for encontrado e o campo de telefone estiver sendo buscado, um novo contato será criado. Caso contrário, um erro será retornado e não será dado continuidade ao webhook.
   * **Dentre os vários contatos encontrados anteriormente,** se for encontrado **um único contato**, ele será selecionado  e o webhook seguirá para a próxima fase, sem analisar as demais condições.
   * **Dentre os vários contatos encontrados anteriormente,** se forem encontrados novamente **vários contatos**, a análise segue para a terceira condição. Se não houver uma terceira condição, será retornado erro e não será dado continuidade ao webhook.
3. O processo continua seguindo essa lógica até que um único contato seja identificado ou um erro, ao fim das condições cadastradas, seja retornado por não ter sido possível individualizar o contato.

**Exemplo:**\
Se a primeira condição for o **e-mail** e forem encontrados cinco contatos, a segunda condição (por exemplo, **telefone**) será aplicada para filtrar entre esses cinco quais possuem o telefone informado. Esse processo continua até que reste apenas um contato ou até que um erro seja retornado.

#### **OU** - Contato precisa atender pelo menos uma regra:

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FYnrV0peZ76oq0zkMnHfd%2Fimage.png?alt=media&amp;token=1d14481f-3437-4cb5-bbb1-e7163e9f68d5" alt=""><figcaption></figcaption></figure>

A análise ocorre em ordem de importância, ou seja, na sequência em que as condições foram cadastradas, além disso, a análise de múltiplas condições leva em consideração todos os contatos do sistema, e não apenas os contatos filtrados na condição anterior. O processo segue a seguinte lógica:

1. A primeira condição é analisada:
   * Se **nenhum contato único** for encontrado, a execução seguirá para a próxima condição. Mas se não houver uma próxima condição, um novo contato será criado, desde que o telefone esteja sendo buscado; do contrário, nesse caso, um erro será retornado e não será dado continuidade ao webhook.
   * Se for encontrado **um único contato**, ele será selecionado e o webhook seguirá para a próxima fase, sem analisar as demais condições.
   * Se forem encontrados **vários contatos**, a análise segue para a segunda condição. Se não houver uma próxima condição, o sistema verificará a opção escolhida no campo '[**Caso encontre múltiplos contatos, mas o telefone não esteja duplicado**](#caso-encontre-multiplos-contatos-mas-o-telefone-nao-esteja-duplicado)'.
2. A segunda condição é analisada:
   * **Analisando&#x20;*****todos*****&#x20;os contatos novamente**, se **nenhum contato único** for encontrado, a execução seguirá para a próxima condição. Mas se não houver uma próxima condição, um novo contato será criado, desde que o telefone tenha sido buscado em algum momento (ou seja, esteja elencado dentre as condições de busca); do contrário, nesse caso, um erro será retornado e não será dado continuidade ao webhook.
   * **Analisando&#x20;*****todos*****&#x20;os contatos novamente**, se for encontrado **um único contato**, ele será selecionado e o webhook seguirá para a próxima fase, sem analisar as demais condições.
   * **Analisando&#x20;*****todos*****&#x20;os contatos novamente**, se forem encontrados **vários contatos**, a análise segue para a segunda condição. Se não houver uma próxima condição, o sistema verificará a opção escolhida no campo '[**Caso encontre múltiplos contatos, mas o telefone não esteja duplicado**'](#caso-encontre-multiplos-contato-mas-o-telefone-nao-esteja-duplicado).
3. O processo continua seguindo essa lógica até que um único contato seja identifica, criado ou um erro seja retornado por não ter sido possível individualizar ou criar um contato.

#### **Exemplo prático:**

Suponha que a ordem das condições seja:

* E-mail
* Telefone

O sistema começa verificando todos os contatos com o e-mail fornecido. Se encontrar **cinco contatos**, ele **não restringe** a análise aos cinco encontrados. Em vez disso, ele parte para a **segunda condição (telefone)** e procura, novamente em **todos os contatos do sistema**, quais possuem o telefone informado. Se nessa nova análise for encontrado **um único contato**, ele será selecionado. Se ainda houver múltiplos contatos ou nenhum contato encontrado, o sistema seguirá a lógica descrita anteriormente.

### **Caso encontre múltiplos contatos, mas o telefone não esteja duplicado**

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FPkKZB2zrBMXJ3RQDp0LY%2Fimage.png?alt=media&amp;token=a27335dd-a830-417d-8951-0584d47c5507" alt=""><figcaption></figcaption></figure>

Quando a opção OU é selecionada, será necessário configurar também o campo '**Caso encontre múltiplos contato, mas o telefone não esteja duplicado**'. Há duas opções:

* ***Criar novo contato***: se forem encontrados **vários contatos**, não houver uma próxima condição e não existir um contato cadastrado com aquele telefone no sistema, o sistema irá criar um novo contato.
* ***Retornar erro de múltiplos contatos encontrados***: se forem encontrados **vários contatos**, não houver uma próxima condição e não existir um contato cadastrado com aquele telefone no sistema, o sistema irá retornar erro.

### Buscando ou criando um contato:

Selecione um *campo customizável* ou de *sistema* que será buscado.

Depois, dentre as opções listadas decorrentes da [requisição anteriormente selecionada](#selecionando-uma-requisicao), selecione a propriedade que possua o valor que deseja buscar dentro do campo selecionado.&#x20;

O sistema irá varrer esse campo nos contatos a fim de encontrar uma correspondência com a propriedade selecionada.

{% hint style="info" %}
Lembre-se que para a criação de um novo contato no sistema, o campo de telefone terá que ser uma condição buscada.
{% endhint %}

## **Contato Existe**

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FDKjJfBd1l94lAds4BMQ1%2Fimage.png?alt=media&amp;token=343734af-04d8-42e0-9ea4-5f6cc4d8ad04" alt=""><figcaption></figcaption></figure>

Esse campo controla o que o sistema faz se o contato já estiver registrado.

Se marcado "*Pausar a automação*", é como colocar uma "trava" no processamento da requisição. O sistema não fará o mapeamento das propriedades, nem executará o fluxo de automação. É útil, por exemplo, para casos em que você quer atualizar apenas se o contato for novo (não existente).

## **Mapeamento de Propriedades**

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2FYuSs26nioI2U7mGYdKJL%2Fimage.png?alt=media&amp;token=d8e7e36b-7b27-40ef-a8f1-ec67932cf1ce" alt=""><figcaption></figcaption></figure>

Esse campo define quais informações do pacote (requisição) correspondem a campos no seu sistema. Imagine que você tem pacotes com informações de clientes (como nome, telefone, e-mail). O mapeamento instrui o sistema a qual campo deve guardar cada uma dessas informações para que sejam corretamente registradas.

### Realizando um Mapeamento:

Para mapear uma propriedade, na caixa de seleção de campo, selecione o campo de sistema onde serão salvos os valores das propriedades.&#x20;

{% hint style="info" %}
As opções a serem selecionadas dependerão da configuração do tipo de webhook realizada anteriormente. Se o tipo de webhook selecionado for o de "*Contato*", então aparecerão para serem selecionados os *campos de sistema* e os *campos customizáveis*; se for o de "*Sistema*", então aparecerão as variáveis de banco de dados.
{% endhint %}

Feito isso, selecione qual será a propriedade salva no campo selecionado.

{% hint style="warning" %}

O campo de sistema do lead será atualizado apenas se o campo não for telefone, OU se for telefone e estiver vazio, OU se o lead acabou de ser criado, OU se a conversa não é do canal WhatsApp. Isso para não atualizar o telefone em leads já existentes.
{% endhint %}

Por fim, clique em "*Salvar propriedade*".

{% hint style="info" %}
Se uma propriedade estiver mapeada, mas não for enviada no JSON da requisição ou for enviada com valor vazio, ela será ignorada e o valor existente no sistema será mantido.

**Exemplo:** o campo **Nome** está mapeado, porém a requisição não contém essa propriedade ou ela não possui valor. Nesse caso, o campo **Nome** no sistema não será atualizado e permanecerá com o valor anteriormente armazenado.

Se, por exemplo, um webhook localizar um contato pelo telefone e estiver configurado para mapear os campos **Nome** e **CPF**, o JSON abaixo não realizará nenhuma alteração nesses campos:

```
{
  "telefone": "77999999999",
  "nome": ""
}
```

Nesse caso, como o campo **nome** foi enviado vazio e o campo **cpf** não foi informado na requisição, ambos serão ignorados. Dessa forma, os valores já existentes no contato serão preservados e não serão sobrescritos
{% endhint %}

## **Fluxo de Automação**

<figure><img src="https://920770335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FGYj93MEsVgt6SU5U8KFq%2Fuploads%2Fc0H1CrttNHkxYGD5JtQM%2Fimage.png?alt=media&amp;token=a7248b67-4a5b-466d-9b35-4c35da1c4028" alt=""><figcaption></figcaption></figure>

O **Fluxo de Automação** é como uma sequência de ações que acontece automaticamente após o recebimento da requisição. É como se, após o pacote ser aberto e registrado, um sistema de notificação fosse acionado para realizar algumas tarefas.

### Definindo um fluxo de automação:

Na caixa de seleção de fluxo, selecione um *fluxo de automação*.

Se um fluxo de automação não for selecionado, nada irá acontecer após o recebimento e processamento das requisições; se for selecionado, será executado o que foi configurado no fluxo.

{% hint style="warning" %}
Na caixa de seleção de Fluxo não aparecerão os fluxos da página *Fluxos de Conversa*, mas, sim, os fluxos de automação configurados na página *Fluxos de automação*.
{% endhint %}

* **Exemplo de uso**: Imagine que você recebeu uma requisição de um pagamento realizado. O fluxo de automação pode ser configurado para enviar automaticamente uma mensagem ao cliente confirmando o pagamento.

**O potencial de uso do fluxo de automação é infinito.** Você pode, por exemplo, configurar automações para várias situações, como atualizações de dados, notificações de compra, envio de mensagens de boas-vindas, entre outros.
