Como o lead entra, sobe de estágio e é recuperado sem ninguém digitar nada: do pop-up da página de venda, passando pela compra do ingresso, até virar aluno e plugar a régua de recuperação. Uma oportunidade só, que progride.
Caso real: Imersão Além do Operacional (Comport Ensino). Montado e atualizado em 01/06/2026. Integração (código): Thiago. Estrutura do CRM e automações: Chardson.
A pessoa deixa o contato no pop-up da página de venda. No mesmo segundo ela vira um lead no CRM, na pipeline da imersão. Quando compra o ingresso, sobe de estágio sozinha. Quando preenche a ficha pré-aula, vira aluno categorizado. Quem não comprou cai numa régua de recuperação. Tudo sem ninguém mexer no CRM na mão.
A primeira versão deste guia cobria só a ficha (o aluno). Faltava o começo do funil: o pop-up que captura o lead frio antes da compra, o postback do Eduzz que confirma quem comprou, e a régua de recuperação de quem não comprou. Sem o pop-up gravando o lead no CRM, não havia o que recuperar. Esta versão amarra tudo.
É uma pipeline só ("Além do Operacional"), com uma oportunidade por pessoa que vai progredindo de estágio e de valor. Decidimos contra criar uma pipeline separada de recuperação: recuperação não é um destino, é um tratamento de um lead que travou no mesmo funil, e quebrar em duas pipelines fragmenta o relatório.
Três automações alimentam esses estágios, cada uma num proxy serverless (função na Vercel) com o token do GHL escondido no servidor. As três só avançam a oportunidade, nunca puxam de volta (um rank de estágio garante isso).
Na LP de venda, o pop-up "garantir vaga" pede nome, e-mail e WhatsApp e em seguida redireciona pro checkout do Eduzz. O segredo: antes de mandar a pessoa pro checkout, ele dispara os dados pro proxy, que cria o lead no GHL. Assim, quem desiste no checkout não se perde: já está no CRM como lead, pronto pra recuperação.
O proxy faz: upsert do contato (dedup por e-mail/telefone), tag imersao-lead, campo "situação = Lead" e a oportunidade no estágio 1 com valor R$97.
Como a página navega pro checkout logo depois, o POST do lead morreria no meio. Por isso o disparo usa keepalive:true: o navegador completa a requisição mesmo já tendo trocado de página. Sem isso, parte dos leads não chega no CRM.
O CRM não sabe sozinho quem comprou. Quem avisa é o Eduzz, via postback (uma notificação que o Eduzz manda pra uma URL nossa a cada evento de venda). Configura-se a URL uma vez em MyEduzz → Ferramentas → Notificações:
https://dashboard-siriusoperacional.vercel.app/api/eduzz-postback?token=<SEGREDO>
Quando a venda é aprovada, o proxy acha o contato (pelo e-mail), garante a tag imersao-comprou e move a oportunidade pro estágio 2 ("Comprou ingresso"). Se a pessoa comprou direto, sem ter passado pelo pop-up, ele cria a oportunidade já nesse estágio. Em reembolso/cancelamento, marca a oportunidade como perdida.
?token= é um segredo: sem ele, a URL devolve 401. Bloqueia qualquer um de empurrar venda fantasma no CRM.Quem comprou o ingresso recebe o link da ficha pré-aula e preenche antes da aula. Aqui a pessoa já é aluno. A ficha é uma página estática que manda os dados pro proxy (o mesmo padrão: token nunca no front, sempre no servidor).
O proxy faz upsert do contato, avança a oportunidade pro estágio 3 ("Aluno · ficha") e sobe o valor pra R$3.500 (o programa, que é o upsell pós-ingresso). Tag imersao-aluno. E o pulo do gato: as respostas viram campos personalizados filtráveis (não nota).
O GHL não filtra pelo texto de uma nota — nota é só leitura humana. Pra puxar depois "só quem tem 6-20 funcionários e quer escalar", a resposta tem que ser campo personalizado (filtrável em smart list) ou tag. Por isso cada pergunta classificatória da ficha virou um campo dedicado (prefixo "Ficha Imersão ·").
Cada estágio do funil marca uma tag no contato. São elas que disparam os Workflows do GHL (boas-vindas, recuperação):
imersao-lead — entrou pelo pop-up.imersao-comprou — pagou o ingresso (vem do postback). É o gatilho das boas-vindas e o sinal de "sai da recuperação".imersao-aluno — preencheu a ficha.O contacts/upsert do GHL substitui o conjunto de tags, não mescla. Se cada etapa mandasse a tag dentro do upsert, a ficha apagaria imersao-lead e imersao-comprou ao gravar imersao-aluno, e a pessoa sumiria dos gatilhos. A correção: gravar tag pelo endpoint aditivo POST /contacts/{id}/tags, nunca no corpo do upsert.
Essas duas automações vivem dentro do GHL (Workflows), montadas por quem cuida do CRM. A integração só prepara o terreno: coloca o lead no estágio certo e as tags certas. Os Workflows reagem a isso.
imersao-lead).imersao-comprou → manda o link da oferta.imersao-comprou entra, a pessoa sai da régua (marcar "remove from workflow"), pra não receber desconto depois de já ter comprado.As copys e o link de desconto estão organizados no painel do Miro da campanha.
imersao-comprou.Uma conta GHL de agência tem várias subcontas (locations). No caso da Comport havia três, com nomes parecidos e enganosos ("INATIVO", "Perfil Cleber", "Comport Ensino"). Gravar na errada = lead perdido. A regra: nunca confie no nome de cor, confirme pela API.
# Confirma o nome real da location pelo ID
curl https://services.leadconnectorhq.com/locations/<LOCATION_ID> \
-H "Authorization: Bearer <TOKEN>" -H "Version: 2021-07-28"
# resposta: { "location": { "name": "Comport Ensino", ... } } ← essa é a certa
Cada token (PIT) é amarrado a uma location. Token de uma subconta dá erro 403 em outra. Achar o par certo (location + token) é o primeiro passo antes de qualquer escrita.
Os três proxies fazem upsert: se a pessoa já existe (mesmo e-mail/telefone), atualiza; se não, cria. É o que garante uma oportunidade só por pessoa, mesmo passando por pop-up, compra e ficha.
POST /contacts/upsert
{ "locationId": "<LOCATION>", "firstName": "...", "lastName": "...",
"email": "...", "phone": "+55...", "source": "...",
"customFields": [...] } // tags NÃO vão aqui (ver "tags são gatilhos")
Cada pergunta classificatória da ficha é um campo dedicado (prefixo "Ficha Imersão ·"), criado uma vez por API. O proxy converte o código do formulário pro rótulo exato da opção e manda no customFields do upsert.
POST /locations/<LOCATION>/customFields
{ "name": "Ficha Imersão · Funcionários", "dataType": "SINGLE_OPTIONS",
"options": ["Trabalho sozinho(a)","De 1 a 5 pessoas","De 6 a 20 pessoas","Mais de 20 pessoas"] }
# tipos: SINGLE_OPTIONS, CHECKBOX (várias), NUMERICAL, TEXT, LARGE_TEXT
A oportunidade é criada uma vez (no estágio de entrada) e depois só avança. Antes de mover, o proxy compara o rank do estágio atual com o de destino: se já está igual ou à frente, não mexe. Anti-duplicata: busca por contact_id na pipeline antes de criar outra.
POST /opportunities/ # criar (estágio de entrada)
PUT /opportunities/{id} # avançar estágio / subir valor
O plano Hobby do Vercel aceita no máximo 12 serverless functions. Pop-up, ficha e postback foram consolidados num único arquivo (/api/imersao?fn=popup|ficha|eduzz); as URLs antigas continuam funcionando por rewrites no vercel.json.
Testamos o funil inteiro com dados fake, e no fim apagamos o contato de teste pra não sujar a base. O caminho completo:
imersao-lead.imersao-comprou.imersao-aluno e os campos.É aqui que a categorização paga. Como cada resposta é um campo filtrável, dá pra montar qualquer recorte e disparar só pra ele.
Ficha Imersão · Funcionários é De 6 a 20 pessoas.Ficha Imersão · Maior desafio contém Escalar o faturamento.Vale pra qualquer combinação: faturamento, segmento, interesse, ICP, origem. Salvou a lista, reusa quando quiser.
contacts/upsert SUBSTITUI o conjunto de tags. Mandar tag no upsert apaga as anteriores. Use sempre POST /contacts/{id}/tags (aditivo).keepalive. A página navega pro checkout e cancela o POST do lead no meio. Sem keepalive:true, parte dos leads some.?token= de validação, qualquer um empurra venda fantasma no CRM. Exija o segredo.+5511987650001, algo@sirius.test).name via API antes de gravar.A integração (pop-up → CRM, postback do Eduzz, ficha, proxies, campos) é de quem cuida de tecnologia (Thiago). A estrutura do CRM e as automações são de quem cuida do CRM (Chardson): renomear os estágios da pipeline e montar os dois Workflows (recuperação e boas-vindas), que reagem às tags/estágios que a integração já entrega.
Os IDs dos estágios não mudam ao renomear, então a integração continua funcionando antes mesmo do rename. Recuperação não é estágio: é Workflow + tag. "Perdido" é o status lost da oportunidade.
Documento de apoio com o fluxo visual e os prints: siriuspetvet.com.br/imersao-ficha-fluxo/