Variáveis de Personalização

Variáveis são atalhos que o NooviChat troca pelo dado real de cada contato na hora do envio — o nome, o telefone, o valor do card, a data do agendamento. Assim uma única mensagem chega personalizada para cada pessoa. Este guia mostra quais variáveis existem, em qual tela usar cada uma e quando.

O que são variáveis

Você escreve a mensagem com um marcador entre chaves duplas, por exemplo {{nome}}, e no disparo o sistema substitui pelo valor daquele destinatário. Se o contato se chama Maria, ela recebe “Olá Maria”; se é o João, ele recebe “Olá João” — a mesma mensagem, personalizada.

A parte que mais confunde

O NooviChat tem vários módulos (Disparador, Conversas, Follow-ups, Agendamentos, Flow Builder) e cada um entende um conjunto, uma grafia e um motor diferente de variáveis. Uma variável do Disparador não funciona numa Resposta Rápida, e vice-versa. O tratamento de um marcador sem valor depende do mecanismo; não existe um fallback universal. Sempre confira a seção da tela em que você está.

Regra de ouro

Combine a grafia da variável com a tela em que você está. Este é o mapa rápido — cada linha detalhada nas seções seguintes:

OndeEstiloExemplo do nome do contato
Disparador em massaplano, minúsculo, português{{nome}}
Conversas / Respostas rápidascom ponto (Liquid){{contact.name}}
Follow-upsplano, com underline{{contact_name}}
Lembretes de agendamentoplano, vocabulário de agenda{{cliente}} / {{paciente}}
Flow Builder / Sequênciascom ponto, aninhado, com espaços{{ contact.name }}
Template oficial WhatsApp (Meta)snake_case ou número{{contact_name}} ou {{1}}

Repare: o nome do contato aparece de quatro jeitos diferentes dependendo da tela. Não existe uma variável universal — é por isso que esta página existe.

Dois tipos de renderização

Conversas e passos de Sequência executam Liquid. Disparador, Follow-ups, lembretes de agendamento e Flow Builder usam resolvedores próprios por substituição. Não transfira regras de marcador ausente ou vazio de um mecanismo para outro; cada seção abaixo descreve somente o contrato confirmado daquele módulo.

Disparador em massa

No Disparador em massa as variáveis são planas, em minúsculo e em português. Valem na aba Mensagem personalizada, no valor de cada parâmetro do template do WhatsApp (o campo “insira o valor para 1”), na mensagem de follow-up automático do disparo e na mensagem de boas-vindas.

VariávelViraDe onde vem
{{nome}}Nome do contatoColuna nome do CSV, ou o nome do contato/lead da base
{{telefone}}Telefone (formato +55…)Coluna telefone do CSV, ou o telefone do contato
{{sua_coluna}}O valor daquela colunaQualquer coluna extra do CSV vira variável: {{cidade}}, {{empresa}}, {{codigo}}

Exemplo de mensagem personalizada com coluna extra do CSV:

text
Olá {{nome}}! Vi que você é de {{cidade}}.
Temos uma condição especial no seu telefone {{telefone}}. Posso te contar?

No template do WhatsApp, digite só o valor

Se o template aprovado é “Olá {{1}}, tudo bem?”, no campo “Variáveis → insira o valor para 1” digite apenas {{nome}} — não “Olá {{nome}}”. O texto ao redor já faz parte do template aprovado pela Meta; o campo é só o que entra no lugar do {{1}}.

Nome canônico e valor de reserva

O nome embutido do contato é {{nome}}, não {{name}}. No CSV, os cabeçalhos nome e name alimentam o mesmo nome canônico do contato, renderizado por {{nome}};{{name}} não é uma variável renderizada. Você também pode definir uma reserva, por exemplo {{nome | Cliente}}, usada quando o valor estiver vazio.

Conversas, mensagens e respostas rápidas

Ao responder um atendimento ou montar uma Resposta Rápida, as variáveis usam a notação com ponto (o objeto antes, o atributo depois). É o motor Liquid, que também aceita condições ({% if %}).

VariávelVira
{{contact.name}}Nome do contato
{{contact.id}}ID interno do contato
{{contact.first_name}}Primeiro nome do contato
{{contact.last_name}}Sobrenome do contato
{{contact.phone_number}}Telefone do contato
{{contact.email}}E-mail do contato
{{agent.id}}ID interno do atendente
{{agent.name}}Nome do atendente
{{agent.first_name}} / {{agent.last_name}}Nome e sobrenome do atendente
{{agent.available_name}}Nome de exibição disponível do atendente
{{agent.email}}E-mail do atendente
{{conversation.id}}ID interno da conversa
{{conversation.display_id}}Número visível da conversa na conta
{{conversation.contact_name}}Nome do contato da conversa
{{conversation.recent_messages}}Lista para loops Liquid, com sender, content e attachments das mensagens recentes
{{inbox.name}}Nome da caixa de entrada
{{inbox.id}}ID da caixa de entrada
{{account.name}}Nome da conta
{{account.id}}ID da conta
{{contact.custom_attribute.chave}}Qualquer atributo personalizado do contato
{{conversation.custom_attribute.chave}}Qualquer atributo personalizado da conversa
liquid
Olá {{contact.first_name}}, aqui é {{agent.name}} da nossa equipe.
{% if contact.custom_attribute.plano %}Vi que você está no plano {{contact.custom_attribute.plano}}.{% endif %}
Aqui {{nome}} não funciona — é uma variável do Disparador. Na conversa, o nome do contato é {{contact.name}}. Como esta mensagem passa pelo Liquid, uma variável válida mas inexistente no contexto renderiza como texto vazio. Se a sintaxe Liquid estiver inválida, o backend preserva o conteúdo original em vez de enviar uma versão parcialmente processada.

Follow-ups

Nos templates de Follow-up (manuais, por regra de pipeline ou automação), as variáveis são planas com underline. É o único formato para data e hora “de agora”. Somente neste mecanismo de Follow-up, a resolução usa account.reporting_timezone e cai em UTC quando esse campo está vazio.

VariávelVira
{{contact_name}}Nome do contato
{{contact_phone}}Telefone do contato
{{contact_email}}E-mail do contato
{{conversation_id}}Número visível da conversa na conta
{{inbox_name}}Nome da caixa de entrada
{{agent_name}}Nome do agente informado no contexto
{{card_title}}Título do card no pipeline
{{card_value}}Valor do card (R$)
{{stage_name}}Etapa atual do pipeline
{{pipeline_name}}Nome do pipeline
{{current_date}}Data de hoje (dd/mm/aaaa, fuso da conta)
{{current_time}}Hora atual (HH:MM, fuso da conta)
text
Oi {{contact_name}}, tudo bem? Passando para retomar sobre "{{card_title}}"
(valor {{card_value}}). Consigo te ligar hoje, {{current_date}}?
Cuidado para não confundir com o Disparador: aqui é {{contact_name}} (com underline), não {{nome}}.

Aliases legados

Templates antigos com notação como {{contact.name}} e {{pipeline_card.title}} ainda são normalizados pelo backend, mas a grafia canônica para novos Follow-ups é a versão plana com underline da tabela.

Substituição literal por allowlist

Follow-up não executa Liquid. Uma variável suportada sem valor vira texto vazio e o espaçamento resultante é normalizado. Marcadores fora da allowlist não fazem parte do contrato e não devem ser usados.

Lembretes de agendamento

Nos lembretes de Atendimentos/Agendamentos as variáveis usam um vocabulário próprio de agenda. As datas se referem ao horário do agendamento (não “agora”), no fuso efetivo de agendamento descrito abaixo.

VariávelVira
{{cliente}} / {{paciente}}Nome do cliente/paciente
{{profissional}}Profissional responsável
{{servico}}Serviço agendado
{{data}}Data do agendamento
{{hora}}Horário do agendamento
{{duracao}}Duração
{{valor}}Valor do atendimento, com duas casas decimais
{{empresa}}Nome da empresa

Substituição literal em uma passagem

Somente os nove tokens exatos da tabela são substituídos. Um token desconhecido permanece literal, e um texto com aparência de token vindo do nome do cliente ou de outro valor não passa por uma segunda renderização.

Formatação de data, hora e valor

{{data}} e {{valor}} usam o locale da conta, enquanto {{data}} e {{hora}} usam o fuso efetivo de agendamento: primeiro account.reporting_timezone, depois account.custom_attributes.timezone gravado pelo onboarding e, sem uma configuração válida, America/Sao_Paulo. Se esse locale não estiver disponível, o sistema usa o locale padrão da instalação quando disponível e, por fim, inglês. O valor prioriza o preço e a moeda gravados no atendimento; cada campo ausente recorre ao respectivo padrão do serviço. Sem preço ou sem moeda, {{valor}} vira texto vazio.
text
Olá {{cliente}}! Lembrete do seu {{servico}} com {{profissional}}
no dia {{data}} às {{hora}}. Valor: {{valor}}. Até lá!

Flow Builder e Sequências

Os dois recursos usam caminhos com ponto, e os espaços dentro das chaves são opcionais. Porém, os contextos não são idênticos: o Flow Builder tem o catálogo amplo abaixo, enquanto cada tipo de passo de Sequência expõe apenas o contexto do seu handler.

Flow Builder

VariávelVira
contact.id | contact.name | contact.email | contact.phone_number | contact.identifierDados do contato
conversation.id | conversation.display_id | conversation.status | conversation.priority | conversation.subject | conversation.assignee_id | conversation.team_idDados da conversa
{{ inbox.channel_type }}Tipo do canal da inbox
message.content | message.message_type | message.sender_type | message.created_atDados da mensagem que acionou o fluxo
card.id | card.title | card.pipeline_stage | card.expected_revenue | card.priority | card.owner_idDados do card do Pipeline
agent.name | agent.emailAgente associado ao contexto
account.id | account.nameConta atual
now.date | now.time | now.datetime | now.day | now.month | now.yearData/hora atual no fuso da conta
appointment.title | appointment.scheduled_at | appointment.duration_minutes | appointment.statusAgendamento no contexto do fluxo
lead_score.value | lead_score.threshold | lead_score.deltaPontuação de lead
sla.policy_name | sla.minutes_overdue | sla.threshold_minutesContexto de SLA
captain.intent | captain.confidence | captain.assistant_idContexto de IA quando fornecido ao fluxo
webhook_payload | webhook_payload.campoPayload do webhook que acionou o fluxo
response_payload | response_payload.campoResposta produzida por um passo anterior
{{ variables.X }}Variável definida antes no próprio fluxo
Prefira sempre o botão Inserir variável do editor — ele mostra só o que existe naquele contexto e evita erro de digitação.

Flow Builder não executa Liquid

O resolvedor do Flow Builder substitui apenas caminhos seguros da allowlist. Um caminho ausente ou não permitido não deve ser usado como fallback; blocos {% ... %} e filtros Liquid não são processados.

Passos de Sequência

OndeVariáveis realmente disponíveis
WhatsApp texto e legenda de mídiacontact.name | contact.email | contact.phone_number; card.id | card.title | card.stage; account.name; sequence.name | sequence.current_step | sequence.total_steps
Template de payload do webhookaccount.id | account.name; card.id | card.title | card.stage | card.pipeline_stage | card.contact_id | card.owner_id; contact.id | contact.name | contact.email | contact.phone_number; timestamp

Variáveis de Flow não migram automaticamente para Sequências

Um token como {{ card.expected_revenue }}, {{ appointment.scheduled_at }} ou {{ variables.X }} funciona no contexto apropriado do Flow Builder, mas não faz parte do contexto dos handlers de Sequência listados acima.

Sequências executam Liquid

Texto/legenda de WhatsApp e payload de webhook passam pelo Liquid com contextos separados. Uma variável ausente renderiza como texto vazio; erro de sintaxe interrompe o passo com falha, em vez de enviar o marcador cru.

Templates oficiais do WhatsApp (Meta)

Quando você cria/envia um template oficial pela API Cloud do WhatsApp, a própria Meta define o formato dos parâmetros: numéricos ({{1}}, {{2}}) ou nomeados em snake_case ({{contact_name}}, {{agent_email}}) — sem ponto. Atributos personalizados usam o prefixo {{contact_custom_chave}} ou {{conversation_custom_chave}}.

Grupo nomeadoParâmetros auto-resolvíveis
Contatocontact_name, contact_first_name, contact_last_name, contact_email, contact_phone, contact_id
Conversa e inboxconversation_id, inbox_id, inbox_name
Agente atribuídoagent_name, agent_first_name, agent_last_name, agent_email
Atributos personalizadoscontact_custom_<chave>, conversation_custom_<chave>

Auto-resolução não sobrescreve valor informado

Os parâmetros nomeados da tabela são preenchidos a partir da conversa quando o valor enviado está vazio. Um valor explícito é preservado. Parâmetros numéricos e nomes desconhecidos precisam receber um valor da integração ou do formulário.

Dois problemas diferentes com parâmetro vazio

São situações distintas: (1) quando a variável não é resolvida, o atendente pode ver o {{1}} cru na conversa (a mensagem não conseguiu preencher o parâmetro); (2) quando um valor vazio é efetivamente enviado à Meta, a Meta rejeita o disparo (#132000 — ver Erros comuns). Nos dois casos, garanta que todo parâmetro tenha um valor real. E lembre: no Disparador o {{1}} é preenchido com variável do Disparador ({{nome}}), não com a grafia da Meta.

Datas e fuso horário

Os módulos não compartilham o mesmo resolvedor. No mecanismo de Follow-ups, UTC é o fallback para {{current_date}} e {{current_time}}. Separadamente, os tokens {{ now.date }}, {{ now.time }} e {{ now.datetime }} do Flow Builder usam o próprio resolvedor de automação, com account.reporting_timezone e fallback UTC. O timestamp do webhook de Sequência usa o resolvedor do handler de Sequência: reporting_timezone ou, sem ele, o fuso padrão UTC da aplicação.

Já os lembretes de agendamento usam, nesta ordem, account.reporting_timezone, account.custom_attributes.timezone do onboarding e America/Sao_Paulo. Essa diferença importa quando apenas o fuso do onboarding foi preenchido.

Diagnostique pelo módulo

Se um horário sair incorreto, confirme primeiro qual mecanismo gerou a mensagem e depois verifique o campo de fuso usado por ele. Não assuma que o fallback de agendamentos também vale para Follow-ups, Flow Builder ou Sequências.

Erros comuns

  • Grafia da tela errada. {{contact.name}} num Disparador permanece literal; {{nome}} numa resposta rápida passa pelo Liquid e normalmente vira texto vazio. Confira o motor da seção antes de enviar.
  • Maiúscula/minúscula. No Disparador é exatamente {{nome}} minúsculo — {{Nome}} ou {{NOME}} não são reconhecidos. Colunas de CSV seguem a grafia exata do cabeçalho do arquivo.
  • Valor vazio em template oficial. Contato sem nome deixa o parâmetro em branco e a Meta rejeita o envio (erro 132000). Preencha a coluna nome da base ou use um valor fixo de reserva (ex.: “Cliente”).
  • Só o valor no parâmetro do template. No campo de cada {{1}} digite só a variável ({{nome}}), não a frase inteira.
  • Placeholder em inglês. O nome embutido do Disparador é {{nome}}. {{name}} não é renderizado: até um cabeçalho CSV name é aceito apenas como alias e seu valor fica disponível em {{nome}}. Use os botões/chips de variável quando disponíveis.

Na dúvida, teste antes

Antes de uma campanha grande, faça um envio de teste para o seu próprio número e confira se as variáveis foram substituídas corretamente.