Formulario de captación de leads

Formulario de captación de leads7 min de lectura

Crea un formulario de solicitud de demo que reserve la llamada

Un formulario para reservar una demo que guarda el lead y luego envía al visitante a Cal.com o Calendly con su nombre y email ya rellenados.

Preet SutharFundador, Ikiform

Envía primero la solicitud de demo a un backend de formularios, para que el lead quede guardado y tu equipo reciba el email aunque el visitante nunca elija una hora. Después manda el navegador a tu página de reservas con name y email en la query string, que Calendly y Cal.com usan para rellenar su formulario. Envía a los equipos pequeños a otro sitio, como un tour grabado, para que tu calendario tenga llamadas que puedan cerrarse.

Qué cambia en una solicitud de demo

Quien pide una demo quiere un hueco en un calendario, no un hilo de emails. Cada ronda de "¿te va bien el martes?" es una oportunidad para que reserve con la competencia. Así que el trabajo del formulario es corto: recoger lo justo para cualificar y poner un calendario delante mientras aún tiene la pestaña abierta.

Tres restricciones dan forma a la implementación:

  • El lead debe guardarse antes de que se abra el calendario de reservas. Muchos visitantes abren la página de reservas y la cierran. Si el único registro de ellos vive en la herramienta de reservas, esos leads se pierden. Envía primero a Ikiform y redirige solo si todo va bien.
  • _redirect no puede llevar lo que escribieron. Es una URL fija, e Ikiform solo la sigue si es una URL https: de uno de tus Allowed domains. Añadir ahí cal.com o calendly.com también dejaría pasar envíos desde esos sitios. Construye el enlace de reserva en tu propio código.
  • No toda solicitud merece una llamada en directo. A un fundador en solitario que pide una demo de un producto para equipos le sirve mejor un tour y un enlace de registro. Una pregunta de opciones fijas decide adónde va el navegador después.
Adónde va una solicitud de demo después de guardarseformulariode demonombre,email,empresa,tamaño delequipoIkiformguardado,equipoavisado¿tamañodelequipo?página dereservasnombre yemailrellenadostourgrabadocon unenlace deregistroenvíook11 o más1 a 10Adónde va una solicitud de demo después de guardarseformulario dedemonombre, email, empresa,tamaño del equipoIkiformguardado, equipoavisado¿tamaño delequipo?página dereservasnombre y emailrellenadostourgrabadocon unenlace deregistroenvíook11 o más1 a 10
  1. El visitante rellena nombre, email de trabajo, empresa y tamaño del equipo, y el formulario se envía a Ikiform.
  2. Ikiform guarda la solicitud y avisa a tu equipo por email. No pasa nada más hasta que responde ok.
  3. Tu código lee el tamaño de equipo que eligió el visitante.
  4. Los equipos de 11 o más van a la página de reservas, con el nombre y el email en la query string.
  5. Los equipos de 1 a 10 van a un tour grabado con un enlace de registro.
La bifurcación se ejecuta en tu código, cuando Ikiform ya tiene el lead. El equipo recibe todas las solicitudes en cualquier caso, así que un equipo pequeño que debería haber tenido llamada sigue siendo visible.

Cuatro campos, uno de ellos para enrutar

CampoTipoPor qué
nametextoRellena el formulario de reserva, así el visitante lo escribe una sola vez
emailemailRellena el formulario de reserva y se convierte en el reply-to del email de notificación
companytexto, obligatorio aquíTu comercial lo consulta antes de la llamada
team_sizeselectDecide entre página de reservas o tour, y llega como uno de cuatro valores conocidos

Deja el caso de uso, los plazos y el teléfono para la propia llamada. La herramienta de reservas puede hacer una pregunta propia si necesitas contexto antes de la reunión, y tanto Calendly como Cal.com también pueden rellenar preguntas personalizadas.

Envía y luego pasa el relevo

Cada versión envía la solicitud, espera la respuesta de Ikiform y solo entonces construye la siguiente URL. Los ejemplos usan Cal.com; para Calendly, pon tu enlace de evento. Calendly documenta name y email como parámetros de prerrelleno, y Cal.com rellena cualquier campo de reserva por su identificador, incluidos name y email.

El formulario y su script juntos. Sin JavaScript, el formulario sigue enviándose y llega a tu página de Redirect after submit, así que pon ahí el enlace de reservas como alternativa.

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>
Las versiones de servidor envían con una clave secreta, así que Ikiform se salta Allowed domains y su verificación humana. Entonces todos los envíos vienen de la IP de tu servidor, y el límite Standard de 5 por minuto por visitante cuenta a todos tus visitantes juntos. Elige el límite de frecuencia Relaxed o Custom para un formulario que envías a través de un servidor, y guarda IKIFORM_SECRET_KEY en variables de entorno solo de servidor. Las versiones de servidor reenvían la cabecera Origin del visitante, porque un fetch desde el servidor no envía ninguna e Ikiform detecta a partir de ella las pruebas gratuitas desde localhost.

Email de trabajo, sin bloquear Gmail

Ikiform no tiene ningún ajuste que rechace los proveedores de email gratuitos. La opción allowed_domains del campo de email es una lista de permitidos: útil para un formulario interno limitado al dominio de tu empresa, inadecuada para un formulario de demo público. Y está bien así, porque bloquear Gmail también bloquea a fundadores, consultores y compradores que rellenan formularios desde el móvil.

En lugar de eso, etiqueta esas solicitudes donde tu equipo las vea. Esta función se ejecuta en el relay que envía cada solicitud al chat o a tu CRM, y le da al comercial una pista antes de la llamada:

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";
}

Llámala con event.data.fields después de verifyWebhook y añade la etiqueta al mensaje del chat o a una propiedad del CRM. Leads a HubSpot o Pipedrive muestra un relay completo.

Comprueba que funciona

  1. Añade el dominio de tu sitio y localhost en Allowed domains.
  2. Envía con un tamaño de equipo de 51 to 200. La página de reservas se abre con tu nombre y tu email ya rellenos.
  3. Cierra la página de reservas sin elegir hora. La solicitud sigue en Submissions y el email de notificación está en tu bandeja de entrada.
  4. Vuelve a enviar con 1 to 10 y comprueba que llegas al tour.
  5. Envía con un email no válido. El error aparece en el formulario y la página de reservas no se abre.
  6. Reserva una reunión de prueba y comprueba que la confirmación de la herramienta de reservas llega a la dirección que introdujiste.

Errores comunes

  • Dos registros por demo reservada. Ikiform guarda la solicitud; la herramienta de reservas guarda la reunión. Relaciónalos por email en tu CRM, no por nombre.
  • Ikiform no envía confirmación. Ikiform no envía email a la persona que rellena el formulario. La confirmación y la invitación de calendario de la propia herramienta de reservas cubren las llamadas reservadas. Para las solicitudes que nunca reservan, responde desde el email de notificación el mismo día.
  • Las query strings son visibles. El nombre y el email en la URL de reservas aparecen en el historial del navegador y en la analítica de la herramienta de reservas. No pases nada más ahí.
  • Embeds. Si en lugar de eso incrustas la herramienta de reservas en tu propia página /book, Cal.com reenvía los parámetros de query de tu página solo cuando forwardQueryParams está activado. Calendly documenta el prerrelleno en embeds mediante el objeto prefill de su embed de JavaScript, así que usa eso en lugar de un iframe normal.
  • La comprobación antispam. Con Spam check en Ikiform, las versiones de navegador deben llamar a challenge() de @ikiform/sdk antes de enviar, o reciben 403 challenge_required. Las versiones de servidor se saltan la comprobación.

Preguntas

¿Te atascaste en un paso o quieres una guía para tu caso? Escribe a hello@ikiform.com.