Communication — Record Email
Sub-workflow: grava um e-mail capturado como Message no Communication e a thread dele como Interaction no CRM.
- Plataforma
- n8n · Abrir no n8n
- Status
- Inativo
- ID do workflow
HFJxURe214QwOkMM- Nós
- 19
- Versão no n8n
4388d0fc-19a2-4e8d-bd47-ab75803f3166- Último salvamento no n8n
- 2026-11-06T21:25:38.694Z
- Sistemas
- CommunicationCRM
- Chamado por
- Email Capture
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 o chama com um e-mail normalizado e o contexto do 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.
Código 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:#111Sistemas 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 <nome>: <assunto>” |
| Outbound, primeira da thread | No answer | Hoje mais três dias | “Follow up if no reply: <assunto>” |
| 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 | Não muda | |
| Result | Answered ou No answer | Answered ou No answer |
| Description° | “E-mail thread with <nome> <e-mail> via <caixa do vendedor>. First message (<direção>): <snippet>” | 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 e Ligações.