# Email Capture

Lê o e-mail dos vendedores copiado para a non-reply@, resolve o contexto do CRM e registra cada e-mail; inativo até configurar.

| Platform | Workflow ID | Status | Version | Last saved | Nodes | Systems |
| --- | --- | --- | --- | --- | --- | --- |
| n8n | SAyagoahreVjMNmE | Active | 8bd6ad9b-9bcf-4481-8878-2ae51a9b4d40 | 2026-11-06T19:42:09.676Z | 11 | Communication, CRM, Tooling and Access |

O Email Capture guarda o registro dos e-mails entre vendedores e clientes. O Google Workspace copia todo e-mail externo enviado ou recebido por um membro do grupo `sales-crm@snackprompt.com` para a caixa de captura `non-reply@snackprompt.com`. Este workflow lê essas cópias, acha o vendedor e o cliente nos sistemas e entrega cada e-mail ao [Communication — Record Email](/pt-br/automations/communication-record-email), que grava uma Message no Communication e uma Interaction por thread no CRM. Depois marca o e-mail no Gmail com um marcador de status. Nunca cria uma pessoa e nunca apaga e-mail.

O workflow está **ativo** desde 06/11/2026. [Antes de ativar](#before-activating) guarda a lista de preparação e o que ainda falta. Ele substitui o [Email Logging](/pt-br/automations/email-logging), que precisava de uma credencial do Gmail por vendedor.

O maintainer do Communication cuida da caixa de captura e das Messages; o do CRM cuida das Interactions e das regras de follow-up; o do Tooling and Access cuida da Tool Account de cada vendedor.

## 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["Ler a caixa de captura"]
    n1(["Gmail Trigger"]):::trigger
    n0["Config"]:::logic
    n6["List Labels"]:::logic
    n7["Normalize"]:::logic
  end
  subgraph g1["Resolver e registrar"]
    n9["Resolve CRM Context<br/><small>CRM — Resolve Context</small>"]:::subflow
    n2{{"Known Person?"}}:::decision
    n8["Record Email<br/><small>Communication — Record Email</small>"]:::subflow
  end
  subgraph g2["Marcadores de status"]
    n5["Label Registered"]:::logic
    n4["Label No Match"]:::logic
    n3["Label Error"]:::logic
  end
  n1 --> n0
  n0 --> n6
  n6 --> n7
  n7 --> n9
  n9 --> n2
  n2 -->|sim| n8
  n2 -->|não| n4
  n8 --> n5
  n8 -.->|erro| n3
  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

Este workflow não lê nem grava nenhuma tabela do Airtable diretamente. Ele lê o Gmail e chama dois sub-workflows que fazem o trabalho no Airtable.

| Sistema | Por meio de | Lê | Grava |
| --- | --- | --- | --- |
| Gmail (caixa de captura) | Gmail Trigger, List Labels, nós Label | Cópias marcadas, lista de marcadores | Marcadores de status em cada cópia |
| Tooling and Access, CRM | [CRM — Resolve Context](/pt-br/automations/crm-resolve-context) | Tool Account, Membership, People, Deal | Nada |
| Communication, CRM | [Communication — Record Email](/pt-br/automations/communication-record-email) | Message, Interaction, Person | Message, Interaction |

## Como as cópias chegam na caixa

Duas regras de roteamento no Admin Console do Google Workspace copiam o e-mail dos membros de `sales-crm@`: uma para o enviado, entregue em `non-reply+crm-out@`, e outra para o recebido, entregue em `non-reply+crm-in@`. A cópia leva três headers: `X-capture-source: external-contacts`, `X-capture-direction` (outbound ou inbound) e, nas cópias recebidas, `X-Gm-Original-To` com o endereço do vendedor. A cópia do cliente não leva nenhum deles. Filtros do Gmail na caixa de captura marcam as cópias com `CRM/CRM - Outbound` e `CRM/CRM - Inbound` e pulam a caixa de entrada. E-mail entre domínios internos não é copiado.

## Gatilho e configuração

O Gmail Trigger consulta a caixa de captura a cada minuto com a busca `deliveredto:non-reply+crm-out@snackprompt.com OR deliveredto:non-reply+crm-in@snackprompt.com` (os mesmos endereços dos filtros do Gmail), lidas e não lidas, e devolve as mensagens completas com headers. Cada cópia nova é um item.

O Config define cinco valores que os nós seguintes leem: `mailbox` (o endereço de captura), `internalDomains` (domínios da empresa separados por vírgula) e os nomes dos três marcadores de status: `labelRegistered`, `labelNoMatch` e `labelError`.

O List Labels lê a lista de marcadores da caixa uma vez por execução, para o Normalize converter os nomes nos ids que os nós Label precisam.

### O que o Normalize mantém

| Valor | Como é definido |
| --- | --- |
| Mantida ou descartada | Descartada quando `X-capture-source` existe e não é `external-contacts`, quando a cópia não foi entregue em um endereço `+crm-`, ou quando a cópia já leva o marcador `CRM/CRM - Registered` |
| Direção | `X-capture-direction`; fallback: o endereço de entrega `+crm-out` ou `+crm-in`, depois o domínio do From |
| Vendedor | Enviado: o endereço do From. Recebido: `X-Gm-Original-To`, depois o primeiro endereço interno em To ou Cc. Descartada quando não há vendedor interno |
| Contraparte | Recebido: o remetente. Enviado: o primeiro endereço externo em To, depois Cc. Descartada quando é interna ou automática (no-reply, mailer-daemon, notifications) |
| Cc externos | Os outros endereços externos em To e Cc |
| Participantes internos | Os outros endereços internos em To e Cc, sem o vendedor |
| Message-ID, In-Reply-To | Dos headers, sem os sinais de maior e menor |
| Assunto, enviada em, corpo, snippet | Assunto cortado em 250 caracteres; a data da mensagem ou o horário do processamento; texto puro cortado em 20.000 caracteres; uma linha cortada em 300 caracteres |
| Link da thread | `https://mail.google.com/mail/u/0/#all/` mais o id da thread do Gmail na caixa de captura |
| Ids dos marcadores | Ids dos três marcadores de status, vazios quando um marcador não existe |

Quando todas as cópias de uma consulta são descartadas, a execução termina no Normalize.

## Resolver e registrar

O Resolve CRM Context chama o [CRM — Resolve Context](/pt-br/automations/crm-resolve-context) uma vez por e-mail com o endereço do vendedor, o endereço e o nome da contraparte. Ele devolve a Membership e a empresa do vendedor, a pessoa, a empresa da pessoa e o Deal aberto, mais notas.

O Known Person? só segue quando a pessoa foi achada no mirror People do CRM. O Record Email então chama o [Communication — Record Email](/pt-br/automations/communication-record-email) com o e-mail normalizado e o contexto. Esse sub-workflow grava a Message e a Interaction e aplica a tag `email-log-n8n`.

## Marcadores de status

| Resultado | Marcador | Efeito |
| --- | --- | --- |
| Message e Interaction gravadas | `CRM/CRM - Registered` | Feito |
| Pessoa fora do mirror People do CRM | `CRM/CRM - No match` | Nada gravado; revise a pessoa e tire o marcador para reprocessar |
| Record Email falhou | `CRM/CRM - Error` | Tire o marcador e deixe o gatilho pegar a cópia de novo |

Os nós Label adicionam o marcador na cópia da caixa de captura. Quando um nome de marcador do Config não existe no Gmail, o nó Label não tem id para adicionar e segue sem erro. Nenhum nó tira marcadores, marca como lida ou apaga e-mail: o Evidence URL da Interaction aponta para a thread nesta caixa.

## Nós

O workflow tem 11 nós: 10 que executam e uma nota adesiva. Num nó If, a saída 0 é verdadeiro e a saída 1 é falso. O Record Email tem uma segunda saída para erros.

| Nó | Tipo | O que faz |
| --- | --- | --- |
| Gmail Trigger | gmailTrigger | Consulta a caixa de captura a cada minuto pelos dois marcadores de captura |
| Config | set | Caixa, domínios internos e os nomes dos três marcadores de status |
| List Labels | gmail | Lê a lista de marcadores uma vez por execução |
| Normalize | code | Um item por cópia; lê os headers de captura; descarta o que não é contato com cliente |
| Resolve CRM Context | executeWorkflow | Chama o CRM — Resolve Context por e-mail |
| Known Person? | if | Segue só quando a contraparte é uma pessoa do CRM |
| Record Email | executeWorkflow | Chama o Communication — Record Email; saída de erro em falha |
| Label Registered | gmail | Adiciona CRM/CRM - Registered na cópia |
| Label No Match | gmail | Adiciona CRM/CRM - No match na cópia |
| Label Error | gmail | Adiciona CRM/CRM - Error na cópia |
| Sticky Note | stickyNote | Nota de configuração no canvas; não executa |

## Ligações

| De | Saída | Para |
| --- | --- | --- |
| Gmail Trigger | 0 | Config |
| Config | 0 | List Labels |
| List Labels | 0 | Normalize |
| Normalize | 0 | Resolve CRM Context |
| Resolve CRM Context | 0 | Known Person? |
| Known Person? | 0 | Record Email |
| Known Person? | 1 | Label No Match |
| Record Email | 0 | Label Registered |
| Record Email | 1 | Label Error |

## Configurações e tratamento de erro

| Configuração | Valor |
| --- | --- |
| Status | Ativo desde 06/11/2026 |
| Ordem de execução | v1 |
| Workflow de erro | Nenhum |
| On error | Record Email: segue pela saída de erro. Nós Label: seguem pela saída normal. Outros nós: param o workflow (padrão) |
| Chamadas de sub-workflow | Uma chamada por item, esperando o resultado |
| 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 Gmail Trigger, o List Labels e os três nós Label usam a credencial OAuth de `non-reply@snackprompt.com` | n8n | Feito: os cinco usam a credencial `no-reply mail` |
| Os marcadores `CRM/CRM - Registered`, `CRM/CRM - No match` e `CRM/CRM - Error` existem na caixa de captura | Gmail | Feito |
| As regras de roteamento e os filtros do Gmail estão prontos e testados | Google Workspace | Configurados; os cinco testes do documento de configuração estão pendentes |
| Todo membro de `sales-crm@` tem uma Tool Account (Google Workspace, Login Alias = e-mail) com Identity Binding | Tooling and Access | Pendente |
| Os dois sub-workflows existem e podem ser chamados | n8n | Criados, inativos; um sub-workflow não precisa estar ativo para ser chamado |
| O Channel da `non-reply@` está Active | Communication | Feito |

## Lacunas conhecidas

Estas vêm da configuração dos nós e do lado Google.

| Lacuna | Efeito |
| --- | --- |
| Cliente só em Cco de um e-mail enviado não aparece nos headers da cópia | Esse e-mail fica sem contraparte e é descartado |
| Só o primeiro endereço externo é a contraparte | Uma mensagem para vários clientes é registrada em um deles; os outros vão para Receivers (Person) ou ficam como `cc:` em About Keys |
| E-mail entre domínios internos não é copiado pelo Google | Threads internas nunca são registradas, de propósito |
| "Hoje" e "mais três dias" usam a data UTC | E-mail processado no fim da noite no Brasil fica com o dia seguinte |
| O link da thread abre na caixa de captura | Só o admin da caixa abre o Evidence URL |
| Os bounces são suprimidos no endereço de captura | Uma regra de roteamento quebrada falha em silêncio; o [Email Capture — Health Check](/pt-br/automations/email-capture-health-check) cobre isso |

## Recuperar uma gravação parcial

| O que foi salvo | O que fazer |
| --- | --- |
| Cópia com `CRM/CRM - Error` | Corrija a causa e tire o marcador; a próxima consulta reprocessa a cópia e o sub-workflow atualiza no lugar |
| Cópia com `CRM/CRM - No match` | Crie ou ache a pessoa no Core, espere o mirror do CRM e tire o marcador |
| Message gravada, Interaction faltando | Tire o marcador de status; o Record Email atualiza a Message e cria a Interaction pelo link da thread |

## 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).