# Legacy — Email Logging

Substituído pelo Email Capture em 06/11/2026. Desenho antigo por caixa; inativo, nunca publicado.

| Platform | Workflow ID | Status | Version | Last saved | Nodes | Systems |
| --- | --- | --- | --- | --- | --- | --- |
| n8n | YDwJwKWtayHrH0mC | Inactive | ef290697-9cbf-46c6-ad18-73a6f6980857 | 2026-11-06T16:58:26.654Z | 24 | Communication, CRM, Tooling and Access |

O Email Logging guarda o registro dos e-mails com clientes. Cada mensagem de uma caixa do Gmail, recebida ou enviada, vira uma Message no Communication. Quando a outra pessoa tem um Relationship aberto no CRM, a thread inteira também vira uma Interaction nesse Relationship, e a data de follow-up anda: responder hoje quando a pessoa escreveu, conferir de novo em três dias depois da primeira mensagem que você mandou. E-mail entre endereços internos e de remetentes automáticos é ignorado. O workflow nunca cria uma pessoa.

O workflow está **inativo**. Ele nunca foi publicado no n8n, então nada desta página está rodando ainda. [Antes de ativar](#before-activating) lista o que precisa estar pronto antes. Uma cópia do workflow atende uma caixa de e-mail.

**Substituído.** Em 06/11/2026 este desenho foi substituído pelo [Email Capture](/pt-br/automations/email-capture) e seus dois sub-workflows, que leem uma caixa de captura só (`non-reply@snackprompt.com`), alimentada pelo roteamento do Google Workspace, em vez de uma credencial do Gmail por vendedor, e gravam Deals em vez de Relationships. Este workflow continua salvo e inativo no n8n; esta página descreve ele como está salvo, com os passos de Relationship, e será removida quando o workflow for apagado.

O maintainer do Communication cuida das Messages e da configuração da caixa; o maintainer 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["Ler a caixa de e-mail"]
    n13(["Gmail Trigger"]):::trigger
    n0["Config"]:::logic
    n17["Normalize"]:::logic
  end
  subgraph g1["Resolver o contexto"]
    n6[("Find Mailbox Account<br/><small>GET Tooling Tool Account</small>")]:::read
    n20["Resolve Seller"]:::logic
    n8[("Find Membership (CRM)<br/><small>GET CRM Membership</small>")]:::read
    n7[("Find Membership (Communication)<br/><small>GET Communication Membership</small>")]:::read
    n4[("Find Channel<br/><small>GET Communication Channel</small>")]:::read
    n11[("Find Person (CRM)<br/><small>GET CRM People</small>")]:::read
    n19["Resolve Person"]:::logic
    n10[("Find Person (Communication)<br/><small>GET Communication Person</small>")]:::read
    n9[("Find Message<br/><small>GET Communication Message</small>")]:::read
    n5[("Find Interaction<br/><small>GET CRM Interaction</small>")]:::read
    n12[("Find Relationships<br/><small>GET CRM Relationship</small>")]:::read
    n18["Prepare"]:::logic
  end
  subgraph g2["Message do Communication"]
    n16{{"Message Exists?"}}:::decision
    n22[("Update Message<br/><small>PATCH Communication Message</small>")]:::write
    n3[("Create Message<br/><small>POST Communication Message</small>")]:::write
    n1["Continue"]:::logic
  end
  subgraph g3["Interaction do CRM"]
    n14{{"Has Relationship?"}}:::decision
    n15{{"Interaction Exists?"}}:::decision
    n21[("Update Interaction<br/><small>PATCH CRM Interaction</small>")]:::write
    n2[("Create Interaction<br/><small>POST CRM Interaction</small>")]:::write
  end
  n13 --> n0
  n0 --> n17
  n17 --> n6
  n6 --> n20
  n20 --> n8
  n8 --> n7
  n7 --> n4
  n4 --> n11
  n11 --> n19
  n19 --> n10
  n10 --> n9
  n9 --> n5
  n5 --> n12
  n12 --> n18
  n18 --> n16
  n16 -->|sim| n22
  n16 -->|não| n3
  n22 --> n1
  n3 --> n1
  n1 --> n14
  n14 -->|sim| n15
  n15 -->|sim| n21
  n15 -->|não| n2
  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 |
| --- | --- | --- | --- |
| Tooling and Access | Tool Account | Find Mailbox Account | Nada |
| CRM | Membership (mirror) | Find Membership (CRM) | Nada |
| CRM | People (mirror) | Find Person (CRM) | Nada |
| CRM | Relationship | Find Relationships | Nada |
| CRM | Interaction | Find Interaction | Create Interaction, Update Interaction |
| Communication | Membership (mirror) | Find Membership (Communication) | Nada |
| Communication | Channel | Find Channel | Nada |
| Communication | Person (mirror) | Find Person (Communication) | Nada |
| Communication | Message | Find Message | Create Message, Update Message |

Toda chamada ao Airtable é um nó HTTP Request com uma credencial de token do Airtable. As leituras filtram pelo nome do campo: `{Login Alias}` e `{Tool}` em Tool Account, `{Membership #}` no mirror Membership do CRM, `{Membership ID}` no mirror Membership do Communication, `{External Identifier}` em Channel, `{Email}` nos dois mirrors de pessoas, `{External Message Id}` em Message e `{Evidence URL}` em Interaction. As gravações usam IDs de campo. Renomear um desses campos quebra a busca sem erro: o nó não devolve registro e o fluxo segue como se nada tivesse sido encontrado.

As páginas dos sistemas descrevem os registros que este workflow preenche: [Communication](/pt-br/systems/communication/overview), [CRM](/pt-br/systems/crm/overview) e [Tooling and Access](/pt-br/systems/tooling/overview), onde ficam a Tool Account da caixa e o vínculo dela com a membership.

## Gatilho e caixa de e-mail

O Gmail Trigger consulta a caixa da sua credencial do Gmail a cada minuto com a busca `in:inbox OR in:sent`, lidas e não lidas, e devolve as mensagens completas (não o formato simplificado). Cada mensagem nova é um item.

O Config define dois valores que todos os nós seguintes leem: `mailbox`, o endereço da caixa desta cópia, e `internalDomains`, a lista separada por vírgulas dos domínios de e-mail da própria empresa. A caixa do Config precisa ser a mesma da credencial do Gmail; nada confere se elas batem.

### O que o Normalize mantém

O Normalize transforma cada mensagem em um item e descarta as que não são contato com cliente.

| Valor | Como é definido |
| --- | --- |
| Direção | Outbound quando o remetente é a caixa ou o Gmail marca a mensagem como SENT; Inbound nos outros casos |
| Contraparte | Inbound: o remetente. Outbound: o primeiro endereço em To, depois Cc, que não é de domínio interno. Os outros destinatários são ignorados |
| Descartada | Sem contraparte, contraparte de domínio interno, ou endereço com no-reply, noreply, mailer-daemon, notification ou notifications |
| Id do Gmail e id da thread | `id` e `threadId` do Gmail; o id da thread cai no id da mensagem |
| Assunto | `subject`, cortado em 250 caracteres; "(no subject)" quando falta |
| Enviada em | A `date` da mensagem; o horário do processamento quando a data não pode ser lida |
| Corpo | A parte em texto puro, ou o snippet do Gmail, cortado em 20.000 caracteres |
| Snippet | O snippet do Gmail, ou o corpo, em uma linha e cortado em 300 caracteres |
| Link da thread | `https://mail.google.com/mail/u/0/#all/` seguido do id da thread |

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

## Resolver o contexto

Cada mensagem mantida faz nove buscas em sequência, uma chamada HTTP cada.

1. **Conta da caixa.** O Find Mailbox Account procura no Tooling a Tool Account cujo Login Alias é a caixa e cujo Tool contém Google Workspace. O Resolve Seller lê o Bound Membership ID dela.
2. **Memberships.** O Find Membership (CRM) procura a Membership do CRM cujo Membership # começa com esse número seguido de " - ". A Business Unit dela vira a empresa responsável. O Find Membership (Communication) procura a Membership do Communication com esse Membership ID. Sem Bound Membership ID, as duas buscas não acham nada.
3. **Canal.** O Find Channel procura o Channel do Communication cujo External Identifier é a caixa.
4. **Pessoas.** O Find Person (CRM) procura o e-mail da contraparte no mirror People do CRM e o Resolve Person junta os Relationships ligados a ela. O Find Person (Communication) procura o mesmo e-mail no mirror Person do Communication.
5. **Registros existentes.** O Find Message procura uma Message cujo External Message Id é o id do Gmail. O Find Interaction procura uma Interaction cuja Evidence URL é o link da thread.
6. **Relationship.** O Find Relationships lê os Relationships da pessoa. O Prepare fica com os que não estão em Stage* Lost ou Disqualified e pega o primeiro cujo Accountable (Company)* contém a empresa responsável, depois o primeiro cujo Accountable (Membership)* contém a membership, depois o primeiro aberto.

O Prepare então monta os dois registros e adiciona uma nota quando algo falta: nenhuma Tool Account para a caixa, nenhuma membership, a contraparte fora do mirror People do CRM, ou nenhum Relationship aberto. As notas vão para o Failure Reason da Message.

## 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. Os dois mandam os mesmos campos, então processar uma mensagem de novo sobrescreve a Message com os mesmos valores. O Continue então passa o item preparado para a parte do CRM.

A Message é gravada mesmo quando faltam a pessoa ou o Relationship; é o único registro que uma mensagem dessas ganha.

## Gravar a Interaction

O Has Relationship? para o item se o Prepare não achou Relationship aberto. O Interaction Exists? então 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.

## Campos gravados

### Message do Communication (Create Message e Update Message)

| Campo | Valor |
| --- | --- |
| Name | Assunto |
| Body | Corpo em texto puro, até 20.000 caracteres |
| Sent At | Enviada em |
| Status | Received para inbound, Sent para outbound |
| External Message Id | Id do Gmail |
| Direction | Inbound ou Outbound |
| Thread Id | Id da thread do Gmail |
| Context Base | CRM |
| About Keys | Uma linha cada: `email:` contraparte, `mailbox:` caixa, `gmail:` id do Gmail e `rfc:` Message-ID quando existe |
| Context Key | `Relationship/` seguido do ID do registro do Relationship, quando achou um aberto |
| Channel | O Channel da caixa, quando encontrado |
| Recipients (Person) | Só outbound: a contraparte no mirror Person do Communication, quando encontrada |
| Recipients (Membership) | Só inbound: a membership da caixa no mirror Membership do Communication, quando encontrada |
| Failure Reason | As notas do Prepare, quando houver |

### Interaction do CRM

| Campo | Create Interaction | Update Interaction |
| --- | --- | --- |
| Person (link para Relationship; apagado em 04/11/2026) | O Relationship aberto | Não muda |
| Date* | Enviada em | Enviada em desta mensagem |
| Title* | Assunto | Não muda |
| Type | Email | Não muda |
| Description° | "E-mail thread with &lt;nome&gt; &lt;e-mail&gt; via &lt;caixa&gt;. First message (&lt;direção&gt;): &lt;snippet&gt;" | Não muda |
| Result | Answered ou No answer | Answered ou No answer |
| Evidence URL | Link da thread | 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 (Membership) | A membership, quando encontrada | Não muda |
| Accountable (Company) | A Business Unit da membership, quando encontrada | Não muda |

Na tabela Interaction, o campo chamado Person era o link para Relationship; ele foi apagado com essa tabela em 04/11/2026. Toda gravação manda `typecast: true`: um valor de select que ainda não existe é criado como opção nova. O Status de Message não tem a opção Received hoje, então a primeira mensagem inbound a cria.

## Nós

O workflow tem 24 nós: 23 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 |
| --- | --- | --- |
| Gmail Trigger | gmailTrigger | Consulta a caixa a cada minuto, entrada e enviados |
| Config | set | Define o endereço da caixa e os domínios internos |
| Normalize | code | Um item por e-mail; descarta e-mail interno e no-reply |
| Find Mailbox Account | httpRequest | Tool Account do Tooling da caixa |
| Resolve Seller | code | Lê o Bound Membership ID e monta as buscas de membership |
| Find Membership (CRM) | httpRequest | Mirror Membership do CRM pelo número da membership |
| Find Membership (Communication) | httpRequest | Mirror Membership do Communication pelo Membership ID |
| Find Channel | httpRequest | Channel do Communication da caixa |
| Find Person (CRM) | httpRequest | Mirror People do CRM pelo e-mail da contraparte |
| Resolve Person | code | Monta a busca dos Relationships da pessoa |
| Find Person (Communication) | httpRequest | Mirror Person do Communication pelo e-mail da contraparte |
| Find Message | httpRequest | Message com o mesmo External Message Id |
| Find Interaction | httpRequest | Interaction com o mesmo link de thread em Evidence URL |
| Find Relationships | httpRequest | Os Relationships do CRM da pessoa |
| Prepare | code | Escolhe o Relationship e monta os corpos da Message e da Interaction |
| Message Exists? | if | Atualizar ou criar a Message |
| Update Message | httpRequest | PATCH na Message existente |
| Create Message | httpRequest | POST de uma Message nova |
| Continue | code | Repassa o item preparado depois da gravação da Message |
| Has Relationship? | if | Para se não achou Relationship aberto |
| Interaction Exists? | if | Atualizar ou criar a Interaction |
| Update Interaction | httpRequest | PATCH na Interaction da thread |
| Create Interaction | httpRequest | POST da Interaction da thread |
| Sticky Note | stickyNote | Nota de configuração no canvas; não executa |

## Ligações

| De | Saída | Para |
| --- | --- | --- |
| Gmail Trigger | 0 | Config |
| Config | 0 | Normalize |
| Normalize | 0 | Find Mailbox Account |
| Find Mailbox Account | 0 | Resolve Seller |
| Resolve Seller | 0 | Find Membership (CRM) |
| Find Membership (CRM) | 0 | Find Membership (Communication) |
| Find Membership (Communication) | 0 | Find Channel |
| Find Channel | 0 | Find Person (CRM) |
| Find Person (CRM) | 0 | Resolve Person |
| Resolve Person | 0 | Find Person (Communication) |
| Find Person (Communication) | 0 | Find Message |
| Find Message | 0 | Find Interaction |
| Find Interaction | 0 | Find Relationships |
| Find Relationships | 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 | Has Relationship? |
| Has Relationship? | 0 | Interaction Exists? |
| Interaction Exists? | 0 | Update Interaction |
| Interaction Exists? | 1 | Create Interaction |

## Configurações e tratamento de erro

| Configuração | Valor |
| --- | --- |
| Status | Inativo; nunca publicado |
| 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 |
| Caller policy | Workflows do mesmo dono |
| Disponível no MCP | Não |
| Retenção dos dados de execução | Padrão da instância; este workflow não define |

O agendamento é a consulta do Gmail Trigger, a cada minuto. Uma chamada que ainda falha depois de três tentativas para a execução; os itens já gravados nessa execução continuam gravados.

## Antes de ativar

Confira cada item nos sistemas e depois publique o workflow no n8n.

| Passo | Onde | Estado na última revisão |
| --- | --- | --- |
| A credencial do Gmail no Gmail Trigger é da caixa que esta cópia registra | n8n | Há uma credencial selecionada |
| O `mailbox` do Config é essa caixa e `internalDomains` lista todos os domínios da empresa | n8n | Preenchidos |
| Find Relationships, Prepare e as gravações da Interaction usam Deals no lugar da tabela Relationship e do campo Person, que foram apagados | n8n | Pendente; os nós ainda leem a Relationship |
| A caixa tem uma Tool Account com Login Alias = caixa, Tool = Google Workspace e um Bound Membership ID | Tooling and Access | A Tool Account existe; o Bound Membership ID está vazio, então toda Message levaria a nota "no active Identity Binding" e as Interactions ficariam sem Accountable |
| Um Channel com External Identifier = caixa | Communication | Não existe; as Messages ficariam sem Channel |
| O Status de Message tem a opção Received | Communication | Não existe; a primeira mensagem inbound a cria pelo typecast |
| Uma segunda caixa ganha sua própria cópia, com credencial e Config próprios | n8n | Existe uma cópia |

## Lacunas conhecidas

O workflow nunca rodou. Estas vêm da configuração dos nós.

| Lacuna | Efeito |
| --- | --- |
| Os ids de thread do Gmail são por caixa | Duas caixas registradas na mesma conversa geram duas Interactions |
| O link da thread sempre usa `/u/0/` | Ele só abre a thread quando a caixa é a primeira conta Google logada no navegador |
| Toda mensagem outbound põe Result em No answer | Uma resposta enviada depois que o cliente respondeu volta uma Interaction Answered para No answer |
| O Relationship cai no primeiro aberto | Sem empresa ou membership correspondente, a thread vai para qualquer Relationship aberto da pessoa, mesmo de outro vendedor |
| Só o primeiro destinatário externo conta | Uma mensagem para vários clientes é registrada para um deles |
| "Hoje" e "mais três dias" usam a data UTC | E-mail processado no fim da noite no Brasil fica com o dia seguinte |
| Failure Reason guarda notas informativas | Uma Message entregue normalmente mostra texto num campo chamado Failure Reason |
| O aviso de pessoa ausente no CRM diz "not a Person in Core" | A busca é no mirror People do CRM; a pessoa pode existir no Core e ainda não estar no mirror |
| Os nós Find leem uma página (até 100 registros) | Uma pessoa com mais de 100 Relationships pode cair no errado |
| Até onze chamadas ao Airtable por mensagem | Uma primeira consulta grande pode bater no limite de requisições do Airtable; as três tentativas só absorvem picos curtos |
| A Message nunca é ligada à sua Interaction | O Context Key guarda o Relationship, não a Interaction |

## Recuperar uma gravação parcial

Veja o que foi salvo antes de processar uma mensagem de novo.

| O que foi salvo | O que fazer |
| --- | --- |
| Message gravada, Interaction falhou | Rode de novo; a Message é atualizada no lugar e a Interaction é criada ou atualizada pelo link da thread |
| Message com "no open Relationship" | Registre a Interaction à mão no Deal; a tabela Relationship não existe mais |
| Message com aviso de membership | Preencha o Bound Membership ID na Tool Account da caixa, depois ajuste o Accountable das Interactions criadas nesse meio-tempo |
| Duas Interactions para uma thread | Fique com uma, mantenha a Evidence URL dela, depois apague a outra |

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