Legacy — Email Logging
Substituído pelo Email Capture em 06/11/2026. Desenho antigo por caixa; inativo, nunca publicado.
- Plataforma
- n8n · Abrir no n8n
- Status
- Inativo
- ID do workflow
YDwJwKWtayHrH0mC- Nós
- 24
- Versão no n8n
ef290697-9cbf-46c6-ad18-73a6f6980857- Último salvamento no n8n
- 2026-11-06T16:58:26.654Z
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 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 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.
Código 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:#111Sistemas 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, CRM e Tooling and Access, 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.
- 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.
- 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.
- Canal. O Find Channel procura o Channel do Communication cujo External Identifier é a caixa.
- 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.
- 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.
- 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 <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.
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 | Não muda | |
| Description° | “E-mail thread with <nome> <e-mail> via <caixa>. First message (<direção>): <snippet>” | 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 e Ligações.