BDS0.1

Legacy — Email Logging

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

Revisado 2026-11-06Markdown
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.

Interaction do CRM

Message do Communication

Resolver o contexto

Ler a caixa de e-mail

sim

não

sim

sim

não

Gmail Trigger

Config

Normalize

Find Mailbox Account
GET Tooling Tool Account

Resolve Seller

Find Membership (CRM)
GET CRM Membership

Find Membership (Communication)
GET Communication Membership

Find Channel
GET Communication Channel

Find Person (CRM)
GET CRM People

Resolve Person

Find Person (Communication)
GET Communication Person

Find Message
GET Communication Message

Find Interaction
GET CRM Interaction

Find Relationships
GET CRM Relationship

Prepare

Message Exists?

Update Message
PATCH Communication Message

Create Message
POST Communication Message

Continue

Has Relationship?

Interaction Exists?

Update Interaction
PATCH CRM Interaction

Create Interaction
POST CRM Interaction

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:#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, 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.

  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 <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 Email 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.