Guia profissional · WhatsApp + Meta

Da origem da conversa às conversões.

O cliente manda “oi”. Você identifica o anúncio, reconhece a intenção de reservar e registra a venda quando pedido e pagamento estão confirmados. Use o caso da loja do vestido para construir o rastreio, definir os critérios do seu negócio e devolver os resultados à Meta. Como a origem chega.

Começar o guia 6 etapas · 6 prompts para Claude ou ChatGPT

O caminho: anúncio → WhatsApp oficial → origem no atendimento → marco confirmado → conversão para a MetaVocê pode usar Claude ou ChatGPT para construir o código dessa integração. A conversa com a IA produz os arquivos e as instruções; o programa precisa ser instalado em um ambiente que receba os eventos e permaneça funcionando.

Antes de começar

Separe acesso administrativo ao portfólio empresarial, aplicativo Meta, conta WhatsApp Business e número; acesso autorizado à conta de anúncios; Chatwoot com API e webhooks disponíveis. Para executar o programa, você precisará de hospedagem com HTTPS e armazenamento durável, definidos nas instruções de implantação. Cadastre tokens como variáveis de ambiente no servidor; não os cole na conversa com a IA.

Para o passo de conversões, separe também os critérios comerciais, a fonte confiável que confirma uma venda e os acessos ao dataset e ao Gerenciador de Eventos da Meta. Os prompts de critérios e envio transformam essas definições em regras; elas não precisam estar prontas em código.

A conexão manual abaixo serve para um número novo ou preparado para Cloud API. Se você mantém o WhatsApp Business no aplicativo, verifique o fluxo de coexistência e sua elegibilidade: ele é separado e pode manter aplicativo e API no mesmo número. Não apague sua conta para executar este guia. Chatwoot: requisitos da conexão, Meta: coexistência.

Etapa 1 de 6

Conecte o WhatsApp e o Chatwoot

1A. Prepare a conexão na Meta

Abra Meta Developers — Meus aplicativos e siga My Apps → Create App → Connect with customers through WhatsApp. Vincule o portfólio empresarial e a conta WhatsApp Business. Entre em Use cases → Customize → API Setup; interfaces anteriores mostram WhatsApp → API Setup. Adicione o número e conclua a verificação por SMS ou ligação. Anote o Phone Number ID e o WhatsApp Business Account ID. Início oficial.

Para produção, abra as Configurações empresariais da Meta, selecione o portfólio correto e entre em Users → System users. Crie/selecione o usuário do sistema, atribua aplicativo e conta WhatsApp e gere o token com whatsapp_business_management e whatsapp_business_messaging; operações de gestão podem exigir business_management. O token temporário do teste não serve como configuração duradoura. Permissão e acesso ao ativo precisam existir juntos. Tokens e ativos.

Verificar a posse do número e registrá-lo na Cloud API são operações diferentes. Se ainda não estiver registrado, a integração deve executar a chamada abaixo, com o PIN de seis dígitos da verificação em duas etapas — não o código recebido por SMS. Não repita o registro de um número já conectado. Registro do número.

Registrar um número ainda não conectadoExemplo HTTP
HTTP · adapte os campos
POST https://graph.facebook.com/{VERSAO_GRAPH}/{PHONE_NUMBER_ID}/register
Authorization: Bearer {TOKEN_WHATSAPP}
Content-Type: application/json

{"messaging_product":"whatsapp","pin":"{PIN_DE_6_DIGITOS}"}

1B. Ligue o número ao Chatwoot

Acesse o painel Chatwoot da sua equipe. Se você usa a versão hospedada, entre no Chatwoot Cloud. Em instalação própria, use o endereço fornecido pela sua empresa. Os menus de caixas de entrada, atributos e webhooks abaixo ficam nesse painel; o endereço exato depende da instalação.

Abra Settings → Inboxes → Add Inbox → WhatsApp → Manual Setup. Informe telefone, Phone Number ID, WhatsApp Business Account ID e token. Escolha os atendentes. O Chatwoot fornece o endereço de recebimento e o token de verificação. Configuração manual.

Na Meta, entre em Use cases → Customize → Configuration — ou WhatsApp → Configuration — e preencha Callback URL e Verify token com esses dados. Confirme em Verify and save e assine o campo messages. Verifique também a inscrição do aplicativo na conta WhatsApp: GET /{WABA_ID}/subscribed_apps; quando ausente, faça a inscrição com POST no mesmo caminho. Callback, inscrição da conta.

Envie uma mensagem de outro telefone e responda pelo painel. Só avance depois de confirmar entrada e resposta.

Se precisar de orientação conforme sua configuração, comece pelo prompt abaixo.

Para Claude ou ChatGPT

Prompt 1 — Conferir a conexão oficial

Ler o prompt completo
Quero rastrear anúncios que abrem o WhatsApp e registrar a origem no Chatwoot. Antes de me orientar, pergunte se o número é novo, se já usa Cloud API ou se preciso manter o aplicativo WhatsApp Business; pergunte se uso Chatwoot Cloud ou instalação própria e quais acessos administrativos tenho.

Com base nisso, monte um checklist para a conexão oficial: aplicativo e portfólio Meta, número e WABA, token de servidor, caixa de entrada WhatsApp no Chatwoot, callback e inscrição messages. Diferencie verificação por SMS de registro na Cloud API e não mande apagar uma conta nem repetir o registro de um número já conectado. Se houver coexistência, confira elegibilidade e caminho específico na documentação atual.

Use os links oficiais deste guia e adapte os nomes de menus à minha versão. Nunca peça tokens, PIN, código SMS ou credenciais nesta conversa. Termine com um teste de entrada e resposta pelo Chatwoot e uma lista dos identificadores/configurações que preciso guardar no ambiente, sem revelar seus valores aqui.

Confira antes de avançar: uma mensagem entra no Chatwoot e a resposta chega ao telefone de teste.

Etapa 2 de 6

Obtenha uma amostra real anonimizada

Antes de pedir código, obtenha um exemplo do que sua instalação entrega. Use um anúncio real em um teste autorizado: apague a mensagem pronta antes de enviar “oi” e localize a conversa no Chatwoot.

O caminho de captura depende do seu acesso: API autorizada para ler as mensagens da conversa, ou receptor HTTPS controlado pela equipe para capturar message_created. O prompt orienta a escolha e a anonimização no seu ambiente. Não cole o evento bruto na IA nem use um coletor público. Webhooks do Chatwoot.

Código do anúncio: content_attributes.referral.source_id identifica o anúncio para consultar seus nomes. Código do clique: content_attributes.referral.ctwa_clid liga o retorno da conversão àquele clique; preserve o original no servidor, sem hash. O source_id fora de referral é outro campo. Implementação do Chatwoot, identificador de clique na Meta.

Para Claude ou ChatGPT

Prompt 2 — Obter uma amostra anonimizada

Ler o prompt completo
A conexão oficial com o Chatwoot já funciona. Guie-me para obter uma amostra real do evento de mensagem message_created do Chatwoot, vindo de um anúncio direto para WhatsApp. Antes, pergunte se uso Cloud ou instalação própria, se tenho acesso autorizado à API, ao servidor ou a um receptor de webhooks controlado pela minha equipe. Não presuma que existe um botão de exportar webhook. A amostra desejada é do Chatwoot, não o payload bruto recebido da Meta.

Oriente um teste autorizado: clicar em um anúncio real, apagar a mensagem pronta antes de enviar e mandar “oi”. Identifique a conversa de teste. Se houver acesso à API, ensine a consultar suas mensagens com a credencial somente no meu ambiente para localizar referral; a resposta dessa consulta não é, por si, um webhook. Para capturar o evento message_created, ensine a usar registros autorizados do receptor existente ou configurar um receptor HTTPS controlado, validando a assinatura. Diferencie os formatos e não invente um envelope como se tivesse sido capturado. Confira o contrato e a versão do Chatwoot. Não use coletores públicos nem altere o callback Meta → Chatwoot. Sem acesso suficiente, indique exatamente o que solicitar ao administrador.

Antes de compartilhar qualquer amostra com você, forneça instruções ou um script local para remover nome, telefone, e-mail, endereço, texto pessoal, URLs de anexos, cookies, tokens e assinaturas. Troque IDs de conta, caixa, conversa, mensagem, anúncio e clique por valores fictícios consistentes, preservando chaves, tipos e relações; limite a amostra ao necessário. O original permanece protegido no meu ambiente. Mostre como revisar o resultado antes de colar aqui.

Na cópia anonimizada, localize content_attributes.referral.source_id (anúncio) e content_attributes.referral.ctwa_clid (clique). Não confunda source_id externo com o anúncio. Se referral ou clique estiverem ausentes, registre a ausência sem inventar valor. Entregue a amostra anonimizada e um mapa campo → função para usarmos no próximo prompt.

Entregável: uma amostra anonimizada com chaves e tipos preservados, mais um mapa dos campos encontrados. Se não houver referral ou ctwa_clid, marque a ausência; uma mensagem direta ao número não substitui o teste pelo anúncio.

Etapa 3 de 6

Automatize a origem e os nomes

Envie somente a amostra revisada do passo 2 à mesma conversa com a IA. O programa deve guardar os identificadores, consultar os nomes na Meta e preencher o atendimento automaticamente.

No Chatwoot, em Settings → Custom Attributes → Add Custom Attribute, crie atributos de Conversation, tipo Text: rastreio_anuncio_id, rastreio_clique_id, rastreio_mensagem_id, rastreio_data, rastreio_anuncio, rastreio_conjunto, rastreio_campanha e rastreio_criativo. IDs ficam como texto. Atributos personalizados.

A consulta de nomes exige ads_read e acesso autorizado à conta de anúncios; o token do WhatsApp, sozinho, não concede esse acesso. Objeto anúncio, consulta oficial de exemplo.

Para Claude ou ChatGPT

Prompt 3 — Construir a integração de origem e nomes

Ler o prompt completo
Use a amostra anonimizada e a configuração definidas antes para construir a integração completa. Entregue arquivos, dependências, migrações, .env.example sem segredos, testes locais e README. Use runtime com suporte ativo, armazenamento durável, POST /webhooks/chatwoot e GET /health.

No recebimento, valide X-Chatwoot-Signature com HMAC-SHA256 sobre timestamp + ponto + corpo bruto; confira X-Chatwoot-Timestamp antes de interpretar JSON. O extrator de origem só processa message_created, incoming, não privado, da conta e caixa configuradas. Leia content_attributes.referral com source_type=ad; preserve source_id como texto e ctwa_clid quando existir. Essa filtragem vale para origem: outros eventos de negócio terão tratamento próprio no passo 4. Não invente origem nem apague a anterior quando uma mensagem vier sem referral.

Guarde conta, caixa, conversa, mensagem, anúncio, clique e instante. Use unicidade por conta+mensagem, histórico e tarefa durável de sincronização. Confirme recebimento após persistir. Preserve os códigos reais no servidor; nunca use os valores fictícios da amostra em produção.

Consulte GET https://graph.facebook.com/{META_GRAPH_VERSION}/{AD_ID_SALVO} com Authorization: Bearer {META_MARKETING_TOKEN} e fields=id,account_id,name,adset{id,name},campaign{id,name},creative{id,name}. O token precisa de ads_read e acesso à conta. Valide o ID retornado e account_id autorizado. Guarde também IDs dos objetos relacionados, nomes e data da consulta. Antes de atualizar, confirme que a ocorrência ainda é a origem mais recente; resposta atrasada não sobrescreve clique posterior.

Leia GET /api/v1/accounts/{account_id}/conversations/{conversation_id} e grave POST no mesmo caminho com /custom_attributes, usando api_access_token. Preserve campos existentes, use merge:true quando suportado e serialize tarefas da conversa. Preencha os oito atributos rastreio listados no guia. Sinalize “Consulta pendente” quando a consulta falhar e “Nome indisponível” para nome ausente; preserve IDs, histórico e tentativa posterior controlada.

Configurações de servidor: CHATWOOT_URL, CHATWOOT_ACCOUNT_ID, CHATWOOT_INBOX_ID, CHATWOOT_API_TOKEN, CHATWOOT_WEBHOOK_SECRET, DATABASE_URL, META_GRAPH_VERSION, META_AD_ACCOUNT_ID e META_MARKETING_TOKEN. Nada de segredos no navegador ou nos logs. Teste origem válida/ausente, IDs sem perda de dígitos, conta/caixa erradas, assinatura inválida, duplicata, novo clique, acesso negado e respostas fora de ordem.

Confira a saída: a conversa de teste mostra anúncio “Vestido de linho”, conjunto “Público local”, campanha “Coleção de verão” e criativo “Vídeo do vestido” — ou os nomes reais da sua conta. Uma falha na consulta mantém o código e fica pendente; não vira uma origem inventada.

O programa precisa preservar os demais atributos e serializar gravações. A API atual documenta merge: true, mas versões anteriores podem substituir os campos: leitura da conversa, gravação dos atributos. Nomes podem mudar; IDs mantêm a referência. O nome do criativo não identifica necessariamente cada variação de um anúncio dinâmico.

Etapa 4 de 6

Defina os critérios de conversão

A origem explica de onde veio a conversa. Agora defina o que aconteceu nela. Na loja do vestido, intenção de reservar + tamanho disponível gera um lead qualificado; pedido + pagamento confirmados gera uma venda. Adapte esses critérios à sua operação.

O contexto ajuda a reconhecer intenção. Estoque e pagamento precisam de uma fonte confiável, como o sistema da loja ou confirmação registrada por um atendente autorizado. “Vou comprar”, atendimento encerrado ou envio de um comprovante, sozinhos, não confirmam venda.

Para Claude ou ChatGPT

Prompt 4 — Definir e validar os critérios

Ler o prompt completo
Continue o projeto e crie regras de conversão configuráveis. Use este caso como exemplo, não como regra universal: na loja do vestido, o contato é qualificado quando expressa intenção de reservar e o tamanho solicitado está disponível. Venda exige pedido e pagamento confirmados. “Vou comprar” não basta.

Pergunte quais critérios valem no meu negócio e qual fonte confiável comprova estoque, pedido e pagamento. Pode ser um sistema integrado ou confirmação registrada por um atendente autorizado; não presuma que uma frase do cliente ou um comprovante em imagem prova pagamento. Explique como ligar cada registro à oportunidade e à conversa corretas.

Use a IA para extrair intenção e evidências do contexto, confrontando-as com os dados verificados. Sem evidência suficiente ou diante de conflito, mantenha pendente para revisão. Trate eventos comerciais separadamente do extrator de referral; eles não precisam repetir o código do anúncio.

Persista o marco, a versão da regra, as evidências mínimas, a origem do dado e a data real. Congele a origem aplicável ao marco, incluindo ctwa_clid e IDs disponíveis; novos cliques não alteram o passado. Use chave única por oportunidade+marco e por pedido para compra. Primeiro produza os registros internos; ainda não envie à Meta.

Entregue o módulo e testes: intenção de reservar+tamanho disponível; tamanho indisponível; intenção sem confirmação; pedido sem pagamento; pedido e pagamento confirmados; evidência conflitante; mesmo marco repetido. Mostre a tabela esperado → obtido e peça minha validação das regras antes de ativá-las.

Entregável: critérios aprovados e registros internos com evidência. Tamanho indisponível ou pagamento pendente não podem aparecer como conversão confirmada. Resolva divergências antes de ligar o envio automático.

Etapa 5 de 6

Devolva os resultados à Meta

Conecte os marcos internos à Conversions API for Business Messaging. Os eventos documentados incluem LeadSubmitted, QualifiedLead e Purchase. No exemplo, a qualificação confirmada vira QualifiedLead e a compra confirmada vira Purchase, com valor e moeda reais. Contrato oficial.

Abra o Gerenciador de Eventos e confira o dataset vinculado à WABA via GET /{WABA_ID}/dataset; a criação usa POST quando necessária. Confira whatsapp_business_management, whatsapp_business_manage_events e acesso aos ativos nas Configurações empresariais e no Meta Developers. Dataset da conta WhatsApp.

Envie o ctwa_clid preservado da origem aplicável. O ID do anúncio permanece no histórico, sem substituir o clique. Esta rota não deduplica eventos na Meta: o controle deve acontecer no seu programa. Compra concluída no checkout do site usa o contrato de website, mesmo quando houve conversa antes.

Para Claude ou ChatGPT

Prompt 5 — Enviar os resultados à Meta

Ler o prompt completo
Acrescente ao projeto o envio à Meta dos marcos confirmados no passo anterior. Use Conversions API for Business Messaging para conversões ocorridas no WhatsApp: POST https://graph.facebook.com/{META_GRAPH_VERSION}/{META_DATASET_ID}/events. Event_name: QualifiedLead para o marco qualificado; Purchase para compra confirmada; LeadSubmitted somente se houver um marco de lead recebido explicitamente definido. Não use Lead genérico nem dispare todos na primeira mensagem.

Em cada evento use event_time real em segundos, action_source=business_messaging, messaging_channel=whatsapp e user_data com whatsapp_business_account_id e ctwa_clid preservado, sem hash neste clique. Ad_id fica no histórico interno e não substitui ctwa_clid. Sem clique válido, não invente vínculo. Purchase inclui custom_data.value e currency reais. Compra concluída no checkout do site usa o canal/contrato de website, mesmo se houve conversa antes.

Adicione META_DATASET_ID, META_CAPI_TOKEN e WHATSAPP_BUSINESS_ACCOUNT_ID ao ambiente. Confirme o dataset vinculado à WABA via GET /{WABA_ID}/dataset e explique POST quando necessário. Confira whatsapp_business_management, whatsapp_business_manage_events e acesso aos ativos. Credencial fica no servidor, com dados e logs limitados ao necessário.

Use registro durável e fila com reserva atômica por marco real. Estados: pendente, em envio, aceito, falha confirmada e resultado desconhecido. A Meta não deduplica esta rota: event_id não resolve repetição. Após timeout, queda do processo ou perda da resposta depois de possível envio, exija reconciliação antes de repetir; nunca reenvie cegamente. Em falha confirmada, respeite o erro documentado e a idade do evento, sem alterar sua data para fazê-lo passar.

Entregue arquivos, migrações e testes locais: compra com moeda/valor; marco repetido; duas tarefas concorrentes; token recusado; clique ausente; novo clique posterior; conversão de website; falha confirmada; timeout após possível aceite. Separe recibo da API, atribuição ao anúncio e elegibilidade de otimização. Não prometa melhora automática de campanha.

Confira antes de ativar: o mesmo pedido/notificação produz um único marco e uma reserva de envio. Se houver timeout após possível aceite, o estado é desconhecido e exige reconciliação. Receber eventos não ativa otimização automaticamente nem garante resultado melhor. Otimizações elegíveis no WhatsApp. O limite documentado de sete dias para envio não é a janela de atribuição. Tempo do evento.

Etapa 6 de 6

Instale e teste o percurso inteiro

A integração precisa de hospedagem com HTTPS, banco durável e execução das tarefas pendentes. Cadastre as credenciais somente no servidor e siga as migrações e comandos gerados para o ambiente escolhido.

No Chatwoot, use Settings → Integrations → Webhooks → Configure → Add new webhook e cadastre o endereço do programa, terminando em /webhooks/chatwoot. O prompt deve listar os eventos necessários; a origem começa por message_created. Guarde o segredo em CHATWOOT_WEBHOOK_SECRET. Esse endereço é Chatwoot → seu programa, diferente de Meta → Chatwoot. Cadastro e assinatura.

Para Claude ou ChatGPT

Prompt 6 — Instalar e testar o percurso

Ler o prompt completo
Revise o projeto completo e pergunte onde vou hospedar a integração e o banco. A partir do ambiente disponível, entregue arquivos finais, dependências, migrações, variáveis sem segredos, comandos de instalação, inicialização e atualização, além de instruções para HTTPS, persistência e execução da fila. Uma página estática ou esta conversa aberta não mantém o serviço rodando.

Forneça o endereço exato do meu serviço a cadastrar em Chatwoot → Settings → Integrations → Webhooks, os eventos necessários para origem e critérios e onde guardar o segredo de assinatura. Não confunda esse endereço com o callback Meta → Chatwoot. Explique como verificar /health, registros de erro e tarefas pendentes.

Monte e execute primeiro testes locais sem acessar contas reais: dois anúncios → duas origens; mensagem sem referral preserva a anterior; tamanho disponível+intenção de reservar → qualificado; pedido sem pagamento → nenhuma venda; pedido+pagamento confirmados → compra com valor/moeda; notificação repetida ou concorrente → um único marco; timeout após possível envio → resultado desconhecido sem repetição automática. Inclua autenticação inválida, consulta Meta negada e respostas fora de ordem.

Depois descreva a validação autorizada em ambiente separado, com dados de teste isolados de produção. Confira uma compra real autorizada recebida pela Meta, com valor e moeda correspondentes, sem disparar de novo um marco já enviado. Oriente o Gerenciador de Eventos e a aba Testar eventos; test_event_code sozinho não isola dados fictícios e eventos de teste podem ser usados pela Meta. Termine com um relatório esperado → observado e os itens pendentes. Recebimento, atribuição e otimização são verificações diferentes; não declare conclusão com base apenas no código gerado.

Testes para encerrar a instalação

  • Clique em dois anúncios diferentes, apague a mensagem pronta e envie “oi”: confira duas origens correspondentes no atendimento.
  • Envie uma mensagem comum depois: ela não deve apagar a origem nem criar outra ocorrência de anúncio.
  • No caso da loja, intenção de reservar com tamanho disponível qualifica; pedido sem pagamento não registra venda.
  • Confirme pedido e pagamento no ambiente de teste: confira valor, moeda e clique associados ao marco.
  • Repita a notificação e execute tarefas concorrentes: o mesmo marco não pode ser enviado duas vezes. Simule timeout após possível envio: exija reconciliação.

Rode primeiro os testes locais com serviços simulados. Para validação integrada fictícia, use ambiente e ativos separados de produção. No Gerenciador de Eventos, selecione o dataset de testes e abra Testar eventos. test_event_code sozinho não isola esses dados; a Meta informa que eventos de teste podem participar de medição e segmentação. Uso e testes da API.

Entregável final: relatório com esperado, observado e pendências, incluindo registros do programa, campos no Chatwoot e recebimento na Meta. Confira também uma compra real autorizada recebida pela Meta, com valor e moeda correspondentes, sem reenviar um marco já registrado. Recebimento, atribuição e otimização continuam sendo verificações distintas.

Referência técnica para a IA

Estes trechos ajudam a conferir a implementação gerada. São exemplos para adaptação, não o serviço completo. O parser recebe o JSON depois da validação da assinatura; config.accountId e config.inboxId são strings provenientes da configuração do servidor.

Exemplo — extrair a origem de um evento validado

JS · adapte os campos
function id(v) {
  if (typeof v === "number" && !Number.isSafeInteger(v)) return null;
  if (typeof v !== "string" && typeof v !== "number") return null;
  const s = String(v).trim();
  return /^[1-9]\d*$/.test(s) ? s : null;
}

export function extrairOrigem(body, config) {
  if (body?.event !== "message_created" ||
      body.message_type !== "incoming" || body.private === true) return null;

  const accountId = id(body.account?.id);
  const inboxId = id(body.inbox?.id ?? body.conversation?.inbox_id);
  const conversationId = id(body.conversation?.id ?? body.conversation?.display_id);
  const messageId = id(body.id);
  if (accountId !== config.accountId || inboxId !== config.inboxId ||
      !conversationId || !messageId) return null;

  const r = body.content_attributes?.referral;
  if (!r || Array.isArray(r) || r.source_type !== "ad") return null;
  const adId = id(r.source_id);
  if (!adId) return null;

  const time = typeof body.created_at === "number"
    ? body.created_at * 1000 : Date.parse(body.created_at);
  if (!Number.isFinite(time)) throw new Error("Data da mensagem inválida");

  return {
    account_id: accountId, inbox_id: inboxId,
    conversation_id: conversationId, message_id: messageId,
    message_key: `${accountId}:${messageId}`,
    ad_id: adId,
    click_id: typeof r.ctwa_clid === "string" ? r.ctwa_clid : "",
    message_at: new Date(time).toISOString()
  };
}

Exemplo — gravar os campos da conversa

A credencial api_access_token vem do perfil de um usuário autorizado do Chatwoot. Leia os atributos atuais antes do POST; não use o conteúdo do webhook como cópia atual do cadastro.

HTTP · adapte os campos
GET {CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/conversations/{CONVERSATION_ID}
api_access_token: {CHATWOOT_API_TOKEN}

POST {CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/conversations/{CONVERSATION_ID}/custom_attributes
api_access_token: {CHATWOOT_API_TOKEN}
Content-Type: application/json

JS · adapte os campos
// Montagem do corpo do POST com os resultados reais da integração.
const corpo = {
  merge: true,
  custom_attributes: {
    ...conversaAtual.custom_attributes,
    rastreio_anuncio_id: origem.ad_id,
    rastreio_clique_id: origem.click_id,
    rastreio_mensagem_id: origem.message_id,
    rastreio_data: origem.message_at,
    rastreio_anuncio: anuncio.name || "Nome indisponível",
    rastreio_conjunto: anuncio.adset?.name || "Nome indisponível",
    rastreio_campanha: anuncio.campaign?.name || "Nome indisponível",
    rastreio_criativo: anuncio.creative?.name || "Nome indisponível"
  }
};

Exemplo — montar uma conversão de WhatsApp

O destino é POST https://graph.facebook.com/{META_GRAPH_VERSION}/{META_DATASET_ID}/events, com Authorization: Bearer {META_CAPI_TOKEN} e Content-Type: application/json, no servidor. A função abaixo apenas monta o corpo: não confirma a compra, não escolhe a origem e não controla o envio. Essas verificações e a reserva atômica pertencem ao programa solicitado no prompt 5. Não envie o mesmo marco novamente só porque o retorno da primeira chamada se perdeu.

JS · adapte os campos
// Exemplo puro: monta o corpo, sem enviar nada à Meta.
// O registro persistido já deve ter critério, evidência e origem conferidos.
function montarConversaoMeta(marco) {
  const permitidos = ["LeadSubmitted", "QualifiedLead", "Purchase"];
  if (!permitidos.includes(marco.event_name) ||
      marco.canal !== "whatsapp" ||
      marco.ocorrido_na_conversa !== true || marco.confirmado !== true) {
    throw new Error("Marco ainda não elegível para Business Messaging");
  }
  if (!Number.isInteger(marco.event_time) || marco.event_time <= 0 ||
      typeof marco.waba_id !== "string" || !marco.waba_id.trim() ||
      typeof marco.ctwa_clid !== "string" || !marco.ctwa_clid.trim()) {
    throw new Error("Instante real, WABA e clique preservado são necessários");
  }
  const evento = {
    event_name: marco.event_name,
    event_time: marco.event_time,
    action_source: "business_messaging",
    messaging_channel: "whatsapp",
    user_data: {
      whatsapp_business_account_id: marco.waba_id,
      ctwa_clid: marco.ctwa_clid // não aplicar hash
    }
  };
  if (marco.event_name === "Purchase") {
    if (!marco.pedido_id || !Number.isFinite(marco.valor) ||
        marco.valor < 0 || !/^[A-Z]{3}$/.test(marco.moeda)) {
      throw new Error("Compra requer pedido, valor real e moeda válidos");
    }
    evento.custom_data = { currency: marco.moeda, value: marco.valor };
  }
  return { data: [evento] };
}

O resultado

O “oi” passa a ter uma origem visível no atendimento. A loja consegue separar interesse, qualificação e venda confirmada, e a integração informa à Meta os marcos definidos pelo negócio com o clique preservado.

Claude ou ChatGPT ajudam a produzir e revisar o programa. O serviço instalado opera com credenciais, regras, armazenamento e acompanhamento de falhas. A confirmação comercial vem das evidências da operação, e o envio não garante melhora automática da campanha.

NRS · Sistemas sob medida

Rastreio e conversões na sua operação.

Conectamos a origem das conversas aos critérios do seu negócio e ao retorno de conversões para a Meta.

Falar com a NRS