Normalizacao de Nomes - Workflows n8n β
Documentado em 2026-02-10 | Projeto: mottivme-sales | Categoria:
workflow
Resumo β
Processo completo para corrigir nomes de leads que chegam em formatos incorretos nos workflows n8n. Cobre o fluxo principal de conversa e o follow-up, tratando nomes grudados em CAPS, telefones como nome, usernames e Title Case PT-BR.
Informacoes β
| Campo | Valor |
|---|---|
| Categoria | workflow |
| Projeto | mottivme-sales |
| Data | 2026-02-10 |
| Status | Ativo |
| Workflows | Principal (HXWGWQFBY4KVfY64), Follow-Up (3Yx6JniDrQw4KBCi) |
Problema β
Leads chegam com nomes em formatos invalidos:
| Formato | Exemplo | Causa |
|---|---|---|
| ALL CAPS grudado | MARCELORAMOS | GHL importa sem espaco |
| Numeros no nome | MARCELO123 | Username copiado |
| Telefone como nome | 18005550521 | Campo nome preenchido com telefone |
| Username | uke11.maritzaaaja | Handle do Instagram |
| Email como nome | joao@email.com | Campo errado |
| Nome + sobrenome no follow-up | Marcos Daniels | Query retornava nome completo |
Solucao Aplicada β
1. Node "Normalizar Nome1" (Fluxo Principal) β
Workflow: HXWGWQFBY4KVfY64 | Node ID: 0006f3ef
Codigo v2 com 3 funcoes principais:
Dicionario de nomes brasileiros (~150 nomes) β
const nomesBR = new Set([
'ana','marcos','maria','jose','joao','pedro',
'marcelo','ramos','silva','santos','oliveira',
// ... 150+ nomes comuns
]);Por que dicionario? O regex
([a-z])([A-Z])so detecta transicao minusculaβmaiuscula (camelCase). Nomes ALL CAPS comoMARCELORAMOSnao tem essa transicao.
Funcao separarPalavrasGrudadas(str) β
function separarPalavrasGrudadas(str) {
const lower = str.toLowerCase();
// 1. Tenta separar por dicionario (guloso, maior match primeiro)
// 2. Fallback: padrao vogal-consoante
// 3. Ultimo fallback: retorna original
}Funcao capitalizar(str) β
function capitalizar(str) {
const preposicoes = ['de','da','do','das','dos','e','di'];
return palavras.map((p, i) =>
i > 0 && preposicoes.includes(p.toLowerCase())
? p.toLowerCase()
: p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()
).join(' ');
}Resultado: MARCELORAMOS β Marcelo Ramos | MARCELO123 β Marcelo
2. Validacao de Nomes Invalidos (Follow-Up) β
Workflow: 3Yx6JniDrQw4KBCi | Node: "Formatacao" (e7a511e5)
function validarNome(nome) {
if (!nome || nome.trim() === '') return null;
nome = nome.trim();
if (/^\d+$/.test(nome)) return null; // telefone
if (nome.includes('@')) return null; // email
if (/^[a-zA-Z0-9._]+$/.test(nome)
&& nome.includes('.')) return null; // username
if (nome.length <= 1) return null; // caractere solto
return nome;
}Regra no prompt da IA: Se nome vazio/null, usar saudacao generica sem nome.
3. First Name no Follow-Up (SQL) β
Workflow: 3Yx6JniDrQw4KBCi | Node: "Sem Resposta" (a5f1966e)
SELECT
CASE
WHEN fq.contact_name IS NULL OR TRIM(fq.contact_name) = '' THEN 'Visitante'
WHEN fq.contact_name ~ '^\d+$' THEN 'Visitante'
ELSE INITCAP(SPLIT_PART(
REGEXP_REPLACE(fq.contact_name, '[0-9]', '', 'g'),
' ', 1
))
END as first_name,
...3 nodes atualizados para usar first_name em vez de full_name:
- Formatacao (
e7a511e5) - Informacoes Relevantes - FUP (
f6c59ef8) - Assistente de follow up eterno (
52876071)
4. Cadencia por Canal (WhatsApp vs Instagram) β
Tabela: fuu_cadences | Coluna: channel (varchar)
A query "Sem Resposta" agora filtra por canal:
AND channel = CASE
WHEN fq.canal_origem ILIKE '%whatsapp%' THEN 'whatsapp'
ELSE 'instagram'
ENDCadencias WhatsApp (mais agressivas que Instagram):
| Tentativa | Intervalo | Mensagem |
|---|---|---|
| 1 | 2h | Retomada casual |
| 2 | 6h | Valor adicional |
| 3 | 24h | Prova social |
| 4 | 48h | Escassez |
| 5 | 72h | Ultimo contato |
Checklist de Verificacao β
Apos aplicar as correcoes, verificar com execucoes reais:
Buscar execucao recente via API n8n:
GET /api/v1/executions?workflowId={id}&limit=3&status=successVerificar output do node com
includeData=true:GET /api/v1/executions/{id}?includeData=trueChecar nos dados:
- [ ] Nomes grudados estao separados? (
MARCELORAMOSβMarcelo Ramos) - [ ] Numeros removidos? (
MARCELO123βMarcelo) - [ ] Title Case correto? (
maria da silvaβMaria da Silva) - [ ] Telefones como nome tratados? (
18005550521β nome omitido) - [ ] Follow-up usa primeiro nome? (nao nome completo)
- [ ] Cadencia WhatsApp diferente de Instagram?
- [ ] Nomes grudados estao separados? (
Troubleshooting β
Nome ainda vem errado β
- Verificar se o node "Normalizar Nome1" esta ativo no workflow
- Verificar se o nome esta no dicionario
nomesBRβ adicionar se necessario - Para nomes compostos raros, o fallback vogal-consoante pode errar β adicionar ao dicionario
Follow-up chama por nome completo β
- Verificar node "Sem Resposta" β query deve ter
SPLIT_PART(..., ' ', 1) - Verificar nodes downstream β devem usar
{{ $json.first_name }}e nao{{ $json.contact_name }}
Cadencia identica nos 2 canais β
- Verificar coluna
channelna tabelafuu_cadences - Query deve ter
AND channel = CASE WHEN ... END - Verificar se existem registros com
channel = 'whatsapp'na tabela
Skill Relacionada β
Manual completo disponivel como skill Claude Code:
~/.claude/skills/n8n-name-normalization.mdInvocar com: /sl n8n-name-normalization
