Integrar o formulário ao CRM significa capturar o lead com contexto, não só com nome e e-mail
Conectar o formulário do site ao CRM é passar automaticamente cada novo lead para o funil de vendas, já com a origem, a campanha e o canal que trouxeram aquela pessoa. Sem isso, você recebe o contato mas não sabe se veio do Google Ads, do Instagram orgânico ou de um parceiro, e o vendedor aborda todo mundo do mesmo jeito. O resultado é previsível: taxa de conversão baixa e verba de mídia mal alocada.
Este guia mostra como montar essa integração do zero, capturar os parâmetros UTM corretamente e garantir que a origem chegue limpa no CRM, sem depender de planilha nem de memória do time.
Por que a maioria das integrações falha antes de começar
O erro mais comum é conectar o formulário ao CRM e achar que o trabalho acabou. O lead chega, mas o campo "origem" fica em branco, ou pior, vem preenchido com "Direto" para todo mundo porque ninguém configurou o repasse de UTMs.
Outros problemas frequentes:
- Cookie de UTM sobrescrito: o usuário clicou no anúncio, saiu, voltou dias depois pelo orgânico. O cookie foi substituído e a UTM original se perdeu.
- Formulário em iframe: iframes bloqueiam cookies de terceiros em vários navegadores. A UTM nunca chega no script da página principal.
- Campos ocultos não mapeados: o campo
utm_sourceexiste no HTML mas o CRM não sabe para qual propriedade enviar o valor. - Webhook sem tratamento de erro: o formulário envia, o CRM retorna erro 500, ninguém percebe e o lead some.
Pré-requisitos antes de tocar no código
1. Defina a estrutura de UTMs da sua empresa
Antes de capturar qualquer parâmetro, padronize o que você vai usar. Uma sugestão prática:
| Parâmetro | O que representa | Exemplo |
|---|---|---|
| utm_source | Canal de origem | google, meta, linkedin |
| utm_medium | Tipo de mídia | cpc, email, organic |
| utm_campaign | Nome da campanha | fundo-funil-jul25 |
| utm_content | Variação do criativo | banner-verde, headline-a |
| utm_term | Palavra-chave (Search) | crm-para-vendas |
Defina isso antes de criar as campanhas. Mudar a nomenclatura no meio do caminho quebra os relatórios históricos.
2. Escolha onde guardar as UTMs na sessão do usuário
Use sessionStorage para manter a UTM da sessão atual e localStorage para preservar o primeiro toque, mesmo que o usuário volte depois. A estratégia mais comum é gravar no primeiro acesso e nunca sobrescrever, assim você atribui o lead à mídia que gerou o interesse original.
Passo a passo da integração
Passo 1: Script para capturar e salvar as UTMs
Cole este script no <head> de todas as páginas do site, antes de qualquer formulário:
(function() {
var params = new URLSearchParams(window.location.search);
var utmKeys = ['utm_source','utm_medium','utm_campaign','utm_content','utm_term'];
utmKeys.forEach(function(key) {
var val = params.get(key);
if (val && !localStorage.getItem(key)) {
localStorage.setItem(key, val);
}
});
})();
A lógica !localStorage.getItem(key) garante que o primeiro toque nunca seja sobrescrito por visitas orgânicas posteriores.
Passo 2: Adicionar campos ocultos no formulário
No HTML do formulário, adicione um campo oculto para cada UTM:
<input type="hidden" name="utm_source" id="f_utm_source">
<input type="hidden" name="utm_medium" id="f_utm_medium">
<input type="hidden" name="utm_campaign" id="f_utm_campaign">
<input type="hidden" name="utm_content" id="f_utm_content">
<input type="hidden" name="utm_term" id="f_utm_term">
<input type="hidden" name="landing_page" id="f_landing_page">
O campo landing_page captura a URL exata da página onde o lead converteu, útil para saber qual conteúdo converte mais.
Passo 3: Preencher os campos ocultos com JavaScript
Logo antes do fechamento do </body>:
document.addEventListener('DOMContentLoaded', function() {
var utmKeys = ['utm_source','utm_medium','utm_campaign','utm_content','utm_term'];
utmKeys.forEach(function(key) {
var el = document.getElementById('f_' + key);
if (el) el.value = localStorage.getItem(key) || '';
});
var lp = document.getElementById('f_landing_page');
if (lp) lp.value = window.location.href;
});
Passo 4: Enviar para o CRM via webhook ou API
A maioria dos CRMs aceita leads por webhook (POST com JSON) ou por integração nativa. O payload mínimo que você deve enviar:
{
"nome": "Maria Souza",
"email": "maria@empresa.com.br",
"telefone": "11999990000",
"origem": "google",
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "fundo-funil-jul25",
"utm_content": "banner-verde",
"utm_term": "crm-para-vendas",
"landing_page": "https://seusite.com.br/lp/crm-vendas"
}
No Vendalo, o campo "origem" do lead alimenta diretamente os relatórios por canal e permite que o rodízio de leads distribua contatos de origens específicas para equipes diferentes, algo útil quando você tem um time dedicado ao Google Ads e outro ao Meta.
Passo 5: Tratar erros e confirmar o recebimento
Configure o formulário para capturar a resposta do webhook. Se o CRM retornar qualquer código diferente de 200 ou 201, guarde o payload em fila (localStorage ou banco próprio) e tente reenviar. Um lead perdido por falha técnica é dinheiro jogado fora, especialmente quando você já pagou pelo clique.
Como testar se a integração está funcionando
- Acesse uma página com formulário adicionando UTMs manualmente na URL:
?utm_source=teste&utm_medium=cpc&utm_campaign=validacao - Abra o console do navegador e digite
localStorage.getItem('utm_source'). O retorno deve ser"teste". - Preencha e envie o formulário.
- Vá ao CRM e confirme que o lead chegou com os campos de UTM preenchidos.
- Repita o teste abrindo a URL sem UTMs (simula visita orgânica posterior). As UTMs já gravadas no localStorage não devem ser substituídas.
Integração com ferramentas de formulário sem código
Se você usa RD Station Forms, Typeform, HubSpot Forms ou similar, o processo muda um pouco:
- RD Station Forms: suporta campos ocultos nativamente. Adicione os campos na interface e eles capturam via URL automaticamente se os nomes baterem com os parâmetros.
- Typeform: use Hidden Fields. Passe as UTMs via URL:
typeform.com/to/SEU-ID#utm_source=xxxxx. O Typeform injeta nos campos ocultos. - Elementor / Gravity Forms (WordPress): ambos têm campos ocultos com opção de "preencher automaticamente pela URL". Ative e mapeie os parâmetros.
Em todos os casos, o destino final ainda precisa ser um webhook ou integração nativa com o CRM. Use Zapier ou Make se não houver integração direta, mas monitore falhas, essas ferramentas têm limites de tarefa e podem silenciosamente parar de funcionar.
O que fazer com a origem depois que o lead chega no CRM
Capturar a UTM é só metade do trabalho. O valor real aparece quando você cruza origem com resultado de vendas:
- Quantos leads vieram de cada campanha no mês?
- Qual campanha gerou mais reuniões realizadas?
- Qual canal trouxe clientes com maior ticket médio?
Com esses dados você para de otimizar para custo por lead e começa a otimizar para custo por cliente, que é o número que realmente importa para o negócio.
O Vendalo permite exportar conversões offline (negócios fechados no CRM) de volta para o Google Ads, fechando o loop entre o clique pago e a venda real. O algoritmo do Google passa a aprender com vendas, não com formulários preenchidos, o que tende a melhorar significativamente o CPA real das campanhas.
Erros que vão aparecer em produção (e como resolver)
| Erro | Causa provável | Solução |
|---|---|---|
| UTM vem em branco | Script não está no head ou o formulário está em iframe | Mova o script para o head, tire o formulário do iframe |
| Todos os leads vêm como "Direto" | Cookie/localStorage sendo sobrescrito | Revise a lógica de não-sobrescrita no script |
| Lead não chega no CRM | Webhook com erro 4xx ou 5xx | Adicione log de resposta e alerta por e-mail ou Slack |
| UTM com caracteres estranhos | URL não foi codificada corretamente | Use encodeURIComponent ao montar links de campanha |
| Duplicata de lead no CRM | Usuário enviou o formulário duas vezes | Configure deduplicação por e-mail ou telefone no CRM |
Resumo do fluxo completo
- Usuário clica no anúncio com UTMs na URL.
- Script no head grava as UTMs no localStorage (apenas no primeiro acesso).
- Usuário preenche o formulário; campos ocultos são preenchidos pelo script.
- Formulário envia dados mais UTMs para o CRM via webhook.
- CRM cria o lead com origem, canal e campanha já preenchidos.
- Vendedor aborda o lead sabendo exatamente o contexto do interesse.
- Ao fechar o negócio, a conversão é exportada para o Google Ads como evento offline.
Montar isso uma vez e manter funcionando poupa horas de investigação toda vez que o dono da empresa pergunta "de onde vieram os clientes desse mês?". A resposta vai estar no CRM, com dados precisos, sem depender de memória de ninguém.