# Communication — Record Email

Sub-workflow: grava um e-mail capturado como Message no Communication e a thread dele como Interaction no CRM.

| Platform | Workflow ID | Status | Version | Last saved | Nodes | Systems |
| --- | --- | --- | --- | --- | --- | --- |
| n8n | HFJxURe214QwOkMM | Inactive | 4388d0fc-19a2-4e8d-bd47-ab75803f3166 | 2026-11-06T21:25:38.694Z | 19 | Communication, CRM |

O Communication — Record Email grava um e-mail capturado nos sistemas. Ele cria ou atualiza uma Message no Communication, com chave no Message-ID do e-mail, e uma Interaction no CRM por thread, com chave no link da thread. Liga a Message às pessoas que escreveram e receberam e a Interaction à pessoa, à empresa dela, ao Deal aberto e à Membership do vendedor, e anda a data de follow-up: responder hoje quando o cliente escreveu, conferir de novo em três dias depois da primeira mensagem que o vendedor mandou. Os dois registros levam a tag `email-log-n8n`. Nunca cria uma pessoa nem um Deal.

É um sub-workflow: roda quando o [Email Capture](/pt-br/automations/email-capture) o chama com um e-mail normalizado e o contexto do [CRM — Resolve Context](/pt-br/automations/crm-resolve-context).

O maintainer do Communication cuida das Messages; o do CRM cuida das Interactions e das regras de follow-up.

## Fluxo

Gerado da versão do n8n do quadro acima: cada caixa é um nó e cada seta é uma ligação no n8n. Pílulas rosa são gatilhos, hexágonos amarelos são nós If e Switch com as saídas nas setas, cilindros azuis leem (Airtable, Data Table, HTTP GET), cilindros verdes gravam, caixas roxas chamam outro workflow e setas tracejadas são saídas de erro.

```mermaid
flowchart TD
  subgraph g0["Pedido e buscas"]
    n13(["Record Request"]):::trigger
    n1["Config"]:::logic
    n0["Build Lookups"]:::logic
    n9[("Find Message<br/><small>GET Communication Message</small>")]:::read
    n7[("Find Interaction<br/><small>GET CRM Interaction</small>")]:::read
    n6[("Find External People<br/><small>GET Communication Person</small>")]:::read
    n5[("Find Accounts<br/><small>GET Communication Tool Account</small>")]:::read
    n14["Resolve Accounts"]:::logic
    n8[("Find Internal People<br/><small>GET Communication Membership</small>")]:::read
    n12["Prepare"]:::logic
  end
  subgraph g1["Message do Communication"]
    n11{{"Message Exists?"}}:::decision
    n17[("Update Message<br/><small>PATCH Communication Message</small>")]:::write
    n4[("Create Message<br/><small>POST Communication Message</small>")]:::write
    n2["Continue"]:::logic
  end
  subgraph g2["Interaction do CRM"]
    n10{{"Interaction Exists?"}}:::decision
    n16[("Update Interaction<br/><small>PATCH CRM Interaction</small>")]:::write
    n3[("Create Interaction<br/><small>POST CRM Interaction</small>")]:::write
    n15["Result"]:::logic
  end
  n13 --> n1
  n1 --> n0
  n0 --> n9
  n9 --> n7
  n7 --> n6
  n6 --> n5
  n5 --> n14
  n14 --> n8
  n8 --> n12
  n12 --> n11
  n11 -->|sim| n17
  n11 -->|não| n4
  n17 --> n2
  n4 --> n2
  n2 --> n10
  n10 -->|sim| n16
  n10 -->|não| n3
  n16 --> n15
  n3 --> n15
  classDef trigger fill:#fde7f3,stroke:#d6409f,color:#111
  classDef decision fill:#fff7e0,stroke:#c99a00,color:#111
  classDef read fill:#e8f1ff,stroke:#3b82f6,color:#111
  classDef write fill:#e7f8ee,stroke:#16a34a,color:#111
  classDef subflow fill:#f3e8ff,stroke:#9333ea,color:#111
  classDef wait fill:#f1f1f1,stroke:#888,color:#111
  classDef logic fill:#ffffff,stroke:#999,color:#111
```

## Sistemas que ele toca

| Sistema | Tabela | Lê | Grava |
| --- | --- | --- | --- |
| Communication | Message | Find Message | Create Message, Update Message |
| Communication | Person (mirror) | Find External People | Nada |
| Communication | Tool Account (mirror) | Find Accounts | Nada |
| Communication | Membership (mirror) | Find Internal People | Nada |
| CRM | Interaction | Find Interaction | Create Interaction, Update Interaction |

Toda chamada ao Airtable é um nó HTTP Request com uma credencial de token do Airtable. As leituras filtram pelo nome do campo: `{External Message Id}` em Message, `{Evidence URL}` em Interaction, `{Email}` no mirror Person `{Login Alias}` e `{Tool}` no mirror Tool Account, e `{Membership ID}` e `{Company Email}` no mirror Membership. As gravações usam ids de campo. Renomear um dos campos lidos quebra a busca sem erro: o nó não devolve registro e o fluxo cria uma duplicata.

## Entrada e configuração

O Record Request recebe dois objetos de quem chama: `message`, o e-mail normalizado (direção, vendedor, contraparte, Cc externos, participantes internos, Message-ID, id e link da thread, assunto, corpo, snippet, enviada em), e `context`, o contexto do CRM (membership, empresa responsável, pessoa, empresa da pessoa, Deal, notas).

O Config guarda os ids de registro que as gravações precisam: `channelId` (o Channel do Communication da caixa de captura) e `tagCommunicationId` e `tagCrmId` (a tag `email-log-n8n` em cada base).

## Buscas

O Build Lookups monta três fórmulas. A chave da Message é o RFC Message-ID, ou o id do Gmail quando o header falta. O Find Message procura, em uma chamada, a Message com esse External Message Id e a Message cujo External Message Id é o header In-Reply-To do e-mail, quando o header existe. O Find Interaction procura uma Interaction cujo Evidence URL é o link da thread. O Find External People procura, em uma chamada, a contraparte e todos os endereços externos em Cc no mirror Person do Communication. O Find Accounts procura, em uma chamada, o vendedor e todos os participantes internos no mirror Tool Account, pelo Login Alias entre as contas Google Workspace. O Resolve Accounts lê o Bound Membership ID de cada conta achada, e o Find Internal People lê essas Memberships no mirror Membership, por Membership ID ou por Company Email, para chegar à Person por trás de cada endereço interno.

## Gravar a Message

O Message Exists? manda o item para o Update Message quando o Find Message achou uma, e para o Create Message nos outros casos. O Continue então passa o item preparado para a parte do CRM.

Uma segunda captura do mesmo Message-ID acontece quando outra conta interna estava em cópia: o Google entrega uma cópia por destinatário interno. Nesse caso o Update Message muda só o About Keys, juntando as linhas novas de `account:` e `participant:` às existentes, e o Participants (Account), somando as contas da cópia nova. Nada mais na Message é tocado.

## Gravar a Interaction

O Interaction Exists? manda para o Update Interaction quando uma Interaction já tem este link de thread, e para o Create Interaction nos outros casos. Uma thread é uma Interaction: o Date e o Result dela seguem a última mensagem processada.

| Mensagem | Result | Next Contact Date° | Next Action° |
| --- | --- | --- | --- |
| Inbound, qualquer uma | Answered | Hoje | "Reply to &lt;nome&gt;: &lt;assunto&gt;" |
| Outbound, primeira da thread | No answer | Hoje mais três dias | "Follow up if no reply: &lt;assunto&gt;" |
| Outbound, depois na thread | No answer | Não muda | Não muda |

"Hoje" é a data UTC no momento do processamento. O Result informa o que foi gravado: o id da Message, o id da Interaction e se cada um foi atualizado ou criado.

## Campos gravados

### Message do Communication (Create Message)

| Campo | Valor |
| --- | --- |
| Subject | Assunto (Name é uma fórmula: quem escreveu para quem, depois o Subject) |
| Body | Texto puro, até 20.000 caracteres |
| Sent At | Enviada em |
| Status | Received para inbound, Sent para outbound |
| External Message Id | RFC Message-ID, ou o id do Gmail quando falta |
| Direction | Inbound ou Outbound |
| Thread Id | Id da thread do Gmail na caixa de captura |
| Context Base | CRM |
| Context Key | `Deal/` mais o id do registro do Deal, ou `Person/` mais o id do registro da pessoa |
| Channel | O Channel do Config |
| Tags | email-log-n8n |
| Sender (Person) | Quem escreveu: a contraparte no inbound, a Person do vendedor no outbound |
| Receivers (Person) | Todos que receberam e existem como Person: outbound, a contraparte, os Cc externos e os colegas internos em cópia; inbound, o vendedor, os Cc externos e os colegas internos em cópia |
| Account | O registro do vendedor no mirror Tool Account, pelo Login Alias, quando encontrado |
| In Reply To | A Message capturada que o e-mail responde, pelo header In-Reply-To; vazio quando aquele e-mail não foi capturado. Replies na Message respondida é o inverso |
| Participants (Account) | Os outros endereços internos em To ou Cc que têm Tool Account |
| About Keys | Uma linha cada: `email:` contraparte, `account:` vendedor, `participant:` cada outro endereço interno, `cc:` cada Cc externo fora do mirror Person, `gmail:` id, `rfc:` Message-ID, `in-reply-to:` quando existe |

O Update Message grava só o About Keys e o Participants (Account), como descrito acima.

### Interaction do CRM

| Campo | Create Interaction | Update Interaction |
| --- | --- | --- |
| People° | A pessoa do contexto | Não muda |
| Company° | A empresa da pessoa do contexto, quando há | Não muda |
| Deal° | O Deal aberto do contexto, quando há | Não muda |
| Date* | Enviada em | Enviada em desta mensagem |
| Title* | Assunto | Não muda |
| Type | Email | Não muda |
| Result | Answered ou No answer | Answered ou No answer |
| Description° | "E-mail thread with &lt;nome&gt; &lt;e-mail&gt; via &lt;caixa do vendedor&gt;. First message (&lt;direção&gt;): &lt;snippet&gt;" | Não muda |
| Note | As notas do contexto, vendedor sem Person por trás da conta, e os Cc externos fora do People, quando houver | Não muda |
| Evidence URL | Link da thread na caixa de captura | Link da thread |
| Next Contact Date° | Veja a tabela acima | Veja a tabela acima |
| Next Action° | Veja a tabela acima | Veja a tabela acima |
| Accountable (Person) | O vendedor como Person do CRM (Member da Membership encontrada), quando encontrado | Não muda |
| Accountable (Company) | A Business Unit da Membership, quando encontrada | Não muda |
| Tags | email-log-n8n | Não muda |

Toda gravação manda `typecast: true`: um valor de select que ainda não existe é criado como opção nova.

## Nós

O workflow tem 19 nós: 18 que executam e uma nota adesiva. Num nó If, a saída 0 é verdadeiro e a saída 1 é falso.

| Nó | Tipo | O que faz |
| --- | --- | --- |
| Record Request | executeWorkflowTrigger | Recebe message e context de quem chama |
| Config | set | Id do Channel, os dois ids de tag e o campo Account opcional |
| Build Lookups | code | Chave da Message, link da thread e e-mails externos como fórmulas |
| Find Message | httpRequest | Message com o mesmo External Message Id, ou com o id do In-Reply-To |
| Find Interaction | httpRequest | Interaction com o mesmo link de thread em Evidence URL |
| Find External People | httpRequest | Mirror Person do Communication pelos e-mails externos |
| Find Accounts | httpRequest | Mirror Tool Account do Communication pelos e-mails internos |
| Resolve Accounts | code | Lê as contas e monta a busca da Membership por Bound Membership ID ou Company Email |
| Find Internal People | httpRequest | Mirror Membership do Communication: as pessoas por trás das contas internas |
| Prepare | code | Monta os corpos da Message e da Interaction e os valores de follow-up |
| Message Exists? | if | Atualizar ou criar a Message |
| Update Message | httpRequest | PATCH no About Keys da Message existente |
| Create Message | httpRequest | POST de uma Message nova |
| Continue | code | Repassa o item preparado depois da gravação da Message |
| Interaction Exists? | if | Atualizar ou criar a Interaction |
| Update Interaction | httpRequest | PATCH na Interaction da thread |
| Create Interaction | httpRequest | POST da Interaction da thread |
| Result | code | Devolve os ids da Message e da Interaction a quem chamou |
| Sticky Note | stickyNote | Nota de configuração no canvas; não executa |

## Ligações

| De | Saída | Para |
| --- | --- | --- |
| Record Request | 0 | Config |
| Config | 0 | Build Lookups |
| Build Lookups | 0 | Find Message |
| Find Message | 0 | Find Interaction |
| Find Interaction | 0 | Find External People |
| Find External People | 0 | Find Accounts |
| Find Accounts | 0 | Resolve Accounts |
| Resolve Accounts | 0 | Find Internal People |
| Find Internal People | 0 | Prepare |
| Prepare | 0 | Message Exists? |
| Message Exists? | 0 | Update Message |
| Message Exists? | 1 | Create Message |
| Update Message | 0 | Continue |
| Create Message | 0 | Continue |
| Continue | 0 | Interaction Exists? |
| Interaction Exists? | 0 | Update Interaction |
| Interaction Exists? | 1 | Create Interaction |
| Update Interaction | 0 | Result |
| Create Interaction | 0 | Result |

## Configurações e tratamento de erro

| Configuração | Valor |
| --- | --- |
| Status | Inativo; um sub-workflow roda quando é chamado mesmo inativo |
| Ordem de execução | v1 |
| Workflow de erro | Nenhum |
| Retry on fail | Em todos os nós HTTP Request, 3 tentativas |
| On error | Para o workflow (padrão) em todos os nós; quem chama recebe o erro e marca a cópia com CRM/CRM - Error |
| Caller policy | Workflows do mesmo dono |
| Retenção dos dados de execução | Padrão da instância; este workflow não define |

## Antes de ativar

| Passo | Onde | Estado na última revisão |
| --- | --- | --- |
| O Channel da `non-reply@` do Config existe e está Active | Communication | Existe, Draft |
| A tag `email-log-n8n` existe no Core e chegou nos dois mirrors | Core, CRM, Communication | Feito |
| O Status da Message tem a opção Received | Communication | Feito |
| O mirror Tool Account existe e toda caixa de vendedor está nele com o Login Alias | Communication, Tooling and Access | Feito em 06/11/2026; um endereço sem Tool Account fica só em About Keys |

## Lacunas conhecidas

| Lacuna | Efeito |
| --- | --- |
| Toda mensagem outbound põe Result em No answer | Uma resposta enviada depois que o cliente respondeu volta uma Interaction Answered para No answer |
| Só o About Keys e o Participants (Account) são juntados num Message-ID repetido | Uma cópia que chega com mais Cc externos que a primeira não acrescenta Receivers (Person) |
| Uma thread sem Deal aberto na primeira captura nunca ganha o Deal | Deal° só é gravado no Create Interaction |
| A Message nunca é ligada à sua Interaction | O Context Key guarda o Deal ou a pessoa, não a Interaction |
| "Hoje" e "mais três dias" usam a data UTC | E-mail processado no fim da noite no Brasil fica com o dia seguinte |

## Recuperar uma gravação parcial

| O que foi salvo | O que fazer |
| --- | --- |
| Message gravada, Interaction falhou | Rode o e-mail de novo; a Message é atualizada no lugar e a Interaction é criada ou atualizada pelo link da thread |
| Duas Interactions para uma thread | Fique com uma, mantenha a Evidence URL dela, depois apague a outra |
| Message com a pessoa errada | Corrija os links à mão; a próxima captura da thread não mexe neles |

## Manter esta página em dia

O quadro no topo mostra a versão do n8n que esta página descreve. Abra o workflow no n8n: quando o último salvamento dele é mais novo que a data do quadro, esta página está desatualizada até a próxima revisão. Todos os nós e todas as ligações dessa versão estão em [Nós](#nodes) e [Ligações](#connections).