Formulário de captação de leads

Formulário de captação de leads6 min de leitura

Monte um formulário de pedido de demonstração que agenda a reunião

Um formulário de agendar demonstração que armazena o lead e depois manda o visitante para o Cal.com ou o Calendly com nome e e-mail já preenchidos.

Preet SutharFundador, Ikiform

Envie o pedido de demonstração primeiro a um backend de formulários, para que o lead fique armazenado e a sua equipe receba o e-mail mesmo que o visitante nunca escolha um horário. Depois mande o navegador para a sua página de agendamento com name e email na query string, que o Calendly e o Cal.com usam para preencher o formulário deles. Mande equipes pequenas para outro lugar, como um tour gravado, para que a sua agenda fique com reuniões que podem fechar negócio.

O que muda num pedido de demonstração

Quem pede uma demonstração quer um horário na agenda, não uma troca de e-mails. Cada rodada de "terça serve?" é uma chance de a pessoa agendar com um concorrente. Então a missão do formulário é curta: captar o suficiente para qualificar e colocar uma agenda na frente da pessoa enquanto a aba ainda está aberta.

Três restrições definem a construção:

  • O lead precisa estar armazenado antes de o agendador abrir. Muitos visitantes abrem a página de agendamento e a fecham. Se o único registro deles fica no agendador, esses leads se perdem. Envie ao Ikiform primeiro e redirecione só em caso de sucesso.
  • O _redirect não consegue levar o que a pessoa digitou. Ele é uma URL fixa, e o Ikiform só o segue para uma URL https: em um dos seus Allowed domains. Adicionar cal.com ou calendly.com ali também deixaria passar envios vindos desses sites. Monte o link de agendamento no seu próprio código.
  • Nem todo pedido merece uma reunião ao vivo. Um fundador solo pedindo demonstração de um produto para equipes fica mais bem atendido com um tour e um link de cadastro. Uma pergunta de escolha fixa decide para onde o navegador vai em seguida.
Para onde vai um pedido de demonstração depois de armazenadoformuláriode demonome,e-mail,empresa,tamanho daequipeIkiformarmazenado,equipeavisadatamanhodaequipe?página deagendamentonome ee-mailpreenchidostourgravadocom um linkde cadastroenviook11 ou mais1 a 10Para onde vai um pedido de demonstração depois de armazenadoformulário dedemonome, e-mail, empresa,tamanho da equipeIkiformarmazenado, equipeavisadatamanho daequipe?página deagendamentonome e e-mailpreenchidostourgravadocom um linkde cadastroenviook11 ou mais1 a 10
  1. O visitante preenche nome, e-mail de trabalho, empresa e tamanho da equipe, e o formulário envia ao Ikiform.
  2. O Ikiform armazena o pedido e manda um e-mail para a sua equipe. Nada mais acontece até ele responder ok.
  3. O seu código lê o tamanho de equipe que o visitante escolheu.
  4. Equipes de 11 ou mais vão para a página de agendamento, com nome e e-mail na query string.
  5. Equipes de 1 a 10 vão para um tour gravado com um link de cadastro.
A ramificação roda no seu código, depois que o Ikiform já tem o lead. A equipe recebe todos os pedidos de qualquer forma, então uma equipe pequena que deveria ter tido uma reunião continua visível.

Quatro campos, um deles para roteamento

CampoTipoPor quê
nametextPreenche o formulário de agendamento, para o visitante digitar uma vez só
emaile-mailPreenche o formulário de agendamento e vira o reply-to do e-mail de notificação
companytext, obrigatório aquiO seu vendedor pesquisa antes da reunião
team_sizeselectDecide entre página de agendamento ou tour, e chega como um de quatro valores conhecidos

Deixe o caso de uso, o prazo e o telefone para a própria reunião. O agendador pode fazer uma pergunta própria se você precisar de contexto antes da reunião, e tanto o Calendly quanto o Cal.com também conseguem preencher perguntas personalizadas.

Envie e depois passe adiante

Cada versão envia o pedido, espera a resposta do Ikiform e só então monta a próxima URL. Os exemplos usam o Cal.com; para o Calendly, troque pelo link do seu evento. O Calendly documenta name e email como parâmetros de preenchimento, e o Cal.com preenche qualquer campo de agendamento pelo identificador dele, incluindo name e email.

O formulário e o script juntos. Sem JavaScript o formulário ainda envia e cai na sua página de Redirect after submit, então coloque o link de agendamento lá como plano B.

demo.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST" id="demo-form">
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required />

  <label for="email">Work email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />

  <label for="company">Company</label>
  <input id="company" name="company" autocomplete="organization" required />

  <label for="team_size">Team size</label>
  <select id="team_size" name="team_size" required>
    <option value="1_10">1 to 10</option>
    <option value="11_50">11 to 50</option>
    <option value="51_200">51 to 200</option>
    <option value="201_plus">201 or more</option>
  </select>

  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <p role="alert" id="demo-error" hidden></p>
  <button>Pick a time</button>
</form>

<script>
  const BOOKING = "https://cal.com/acme/demo";
  const SELF_SERVE = "/tour";
  const form = document.getElementById("demo-form");
  const error = document.getElementById("demo-error");

  form.addEventListener("submit", async (event) => {
    event.preventDefault();
    const data = new FormData(form);
    form.querySelector("button").disabled = true;
    error.hidden = true;
    try {
      const response = await fetch(form.action, {
        method: "POST",
        headers: { Accept: "application/json" },
        body: data,
      });
      const result = await response.json();
      if (!result.ok) throw new Error(Object.values(result.error.fields ?? {})[0]?.[0] ?? result.error.message);
      const small = data.get("team_size") === "1_10";
      const next = new URL(small ? SELF_SERVE : BOOKING, location.href);
      next.searchParams.set("name", String(data.get("name")));
      next.searchParams.set("email", String(data.get("email")));
      location.assign(next);
    } catch (failure) {
      error.textContent = failure instanceof Error ? failure.message : "Couldn't send. Try again.";
      error.hidden = false;
      form.querySelector("button").disabled = false;
    }
  });
</script>
As versões no servidor enviam com uma chave secreta, então o Ikiform pula Allowed domains e a verificação humana. Todo envio passa a vir do IP do seu servidor, e o limite Standard de 5 por minuto por visitante conta todos os seus visitantes juntos. Escolha o limite de taxa Relaxed ou Custom para um formulário que você envia por um servidor, e mantenha IKIFORM_SECRET_KEY em variáveis de ambiente só do servidor. As versões no servidor repassam o header Origin do visitante, porque um fetch feito no servidor não envia nenhum e o Ikiform detecta por ele os testes gratuitos de localhost.

E-mail de trabalho, sem bloquear o Gmail

O Ikiform não tem uma configuração que recuse provedores de e-mail gratuitos. A opção allowed_domains do campo de e-mail é uma allowlist: útil para um formulário interno restrito ao domínio da sua própria empresa, errada para um formulário público de demonstração. Tudo bem, porque bloquear o Gmail também bloqueia fundadores, consultores e compradores que preenchem formulários pelo celular.

Em vez disso, marque esses pedidos onde a sua equipe os vê. Esta função roda no relay que publica cada pedido no chat ou no seu CRM, e dá uma pista ao vendedor antes da reunião:

lib/demo-tag.ts
const FREE_MAIL = new Set(["gmail.com", "googlemail.com", "outlook.com", "hotmail.com", "yahoo.com", "icloud.com", "proton.me"]);

export function demoTag(fields: Record<string, unknown>) {
  const domain = String(fields.email ?? "").split("@")[1]?.toLowerCase() ?? "";
  const size = String(fields.team_size ?? "");
  if (FREE_MAIL.has(domain)) return "personal address, check the company";
  if (size === "51_200" || size === "201_plus") return "priority";
  return "standard";
}

Chame-a com event.data.fields depois do verifyWebhook e então adicione a tag à mensagem do chat ou a uma propriedade do CRM. Leads no HubSpot ou no Pipedrive mostra um relay completo.

Confira se funciona

  1. Adicione o domínio do seu site e localhost em Allowed domains.
  2. Envie com o tamanho de equipe 51 to 200. A página de agendamento abre com seu nome e e-mail preenchidos.
  3. Feche a página de agendamento sem escolher um horário. O pedido continua em Submissions, e o e-mail de notificação está na sua caixa de entrada.
  4. Envie de novo com 1 to 10 e confira se você cai no tour.
  5. Envie com um e-mail inválido. O erro aparece no formulário, e a página de agendamento não abre.
  6. Agende uma reunião de teste e confira se a confirmação do agendador chega ao endereço que você digitou.

Pegadinhas

  • Dois registros por demonstração agendada. O Ikiform guarda o pedido; o agendador guarda a reunião. Associe os dois pelo e-mail no seu CRM, não pelo nome.
  • Nenhuma confirmação do Ikiform. O Ikiform não envia e-mail para quem preenche o formulário. A confirmação e o convite de calendário do próprio agendador cobrem as reuniões agendadas. Para pedidos que nunca agendam, responda pelo e-mail de notificação no mesmo dia.
  • Query strings ficam visíveis. Nome e e-mail na URL de agendamento aparecem no histórico do navegador e nas análises do agendador. Não passe mais nada por ali.
  • Embeds. Se, em vez disso, você incorporar o agendador na sua própria página /book, o Cal.com só repassa os parâmetros de query da sua página quando forwardQueryParams está ligado. O Calendly documenta o preenchimento em embeds pelo objeto prefill do embed em JavaScript, então use isso em vez de um iframe simples.
  • A verificação de spam. Com Spam check definido como Ikiform, as versões no navegador precisam chamar challenge() de @ikiform/sdk antes de enviar, ou recebem 403 challenge_required. As versões no servidor pulam a verificação.

Perguntas

Travou em algum passo ou quer um guia para o seu caso? Envie um e-mail para hello@ikiform.com.