Formulaire de capture de leads

Formulaire de capture de leads6 min de lecture

Créer un formulaire de demande de démo qui fait réserver l'appel

Un formulaire de réservation de démo qui stocke le lead, puis envoie le visiteur vers Cal.com ou Calendly avec son nom et son e-mail déjà remplis.

Preet SutharFondateur, Ikiform

Envoyez d'abord la demande de démo à un backend de formulaires, pour que le lead soit stocké et votre équipe prévenue même si le visiteur ne choisit jamais de créneau. Envoyez ensuite le navigateur vers votre page de réservation avec name et email dans l'URL, que Calendly et Cal.com utilisent pour pré-remplir leur formulaire. Dirigez les petites équipes ailleurs, par exemple vers une visite enregistrée, pour que votre agenda contienne des appels qui peuvent se conclure.

Ce qui change avec une demande de démo

Quelqu'un qui demande une démo veut un créneau dans un agenda, pas un échange d'e-mails. Chaque aller-retour du type « mardi, ça vous va ? » est une occasion de réserver chez un concurrent. La mission du formulaire est donc courte : recueillir de quoi qualifier, puis mettre un agenda devant la personne tant que l'onglet est encore ouvert.

Trois contraintes guident la construction :

  • Le lead doit être stocké avant l'ouverture de l'outil de réservation. Beaucoup de visiteurs ouvrent la page de réservation et la ferment. Si la seule trace d'eux est dans l'outil de réservation, ces leads sont perdus. Envoyez d'abord à Ikiform et ne redirigez qu'en cas de succès.
  • _redirect ne peut pas transporter ce qu'ils ont tapé. C'est une URL fixe, qu'Ikiform ne suit que pour une URL https: sur l'un de vos Allowed domains. Y ajouter cal.com ou calendly.com laisserait aussi passer les envois depuis ces sites. Construisez plutôt le lien de réservation dans votre propre code.
  • Toutes les demandes ne méritent pas un appel en direct. Un fondateur solo qui demande une démo d'un produit d'équipe sera mieux servi par une visite guidée et un lien d'inscription. Une question à choix fixe décide où va ensuite le navigateur.
Où va une demande de démo une fois stockéeformulairede démonom, e-mail,entreprise,tailled'équipeIkiformstocké,équipeprévenuetailled'équipe ?page deréservationnom ete-mailpré-remplisvisiteenregistréeavec un liend'inscriptionenvoiok11 ou plus1 à 10Où va une demande de démo une fois stockéeformulaire dedémonom, e-mail,entreprise, tailled'équipeIkiformstocké, équipeprévenuetailled'équipe ?page deréservationnom et e-mailpré-remplisvisiteenregistréeavec un liend'inscriptionenvoiok11 ou plus1 à 10
  1. Le visiteur remplit le nom, l'e-mail professionnel, l'entreprise et la taille de l'équipe, et le formulaire envoie à Ikiform.
  2. Ikiform stocke la demande et écrit à votre équipe. Rien d'autre ne se passe tant qu'il n'a pas répondu ok.
  3. Votre code lit la taille d'équipe choisie par le visiteur.
  4. Les équipes de 11 personnes ou plus vont vers la page de réservation, avec le nom et l'e-mail dans l'URL.
  5. Les équipes de 1 à 10 personnes vont vers une visite enregistrée avec un lien d'inscription.
L'aiguillage se fait dans votre code, une fois qu'Ikiform a le lead. L'équipe reçoit chaque demande dans tous les cas : une petite équipe qui aurait mérité un appel reste donc visible.

Quatre champs, dont un pour le routage

ChampTypePourquoi
nametextPré-remplit le formulaire de réservation, pour que le visiteur ne le tape qu'une fois
emaile-mailPré-remplit le formulaire de réservation et devient l'adresse de réponse de l'e-mail de notification
companytext, obligatoire iciVotre commercial le consulte avant l'appel
team_sizeselectDécide entre page de réservation et visite, et arrive sous la forme d'une valeur parmi quatre connues

Gardez le cas d'usage, le calendrier et le numéro de téléphone pour l'appel lui-même. L'outil de réservation peut poser une question à lui si vous avez besoin de contexte avant le rendez-vous, et Calendly comme Cal.com peuvent aussi pré-remplir des questions personnalisées.

Envoyer, puis passer la main

Chaque version envoie la demande, attend la réponse d'Ikiform et seulement ensuite construit l'URL suivante. Les exemples utilisent Cal.com ; pour Calendly, remplacez par le lien de votre événement. Calendly documente name et email comme paramètres de pré-remplissage, et Cal.com pré-remplit tout champ de réservation par son identifiant, dont name et email.

Le formulaire et son script ensemble. Sans JavaScript, le formulaire envoie quand même et arrive sur votre page Redirect after submit : placez-y donc le lien de réservation comme solution de repli.

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>
Les versions côté serveur envoient avec une clé secrète : Ikiform ignore donc Allowed domains et sa vérification humaine. Chaque envoi vient alors de l'IP de votre serveur, et la limite Standard de 5 par minute par visiteur compte tous vos visiteurs ensemble. Choisissez la limite de débit Relaxed ou Custom pour un formulaire que vous envoyez via un serveur, et gardez IKIFORM_SECRET_KEY dans des variables d'environnement réservées au serveur. Les versions serveur transmettent l'en-tête Origin du visiteur, car un fetch côté serveur n'en envoie aucun, et c'est grâce à lui qu'Ikiform détecte les tests gratuits depuis localhost.

E-mail professionnel, sans bloquer Gmail

Ikiform n'a pas de réglage qui refuse les fournisseurs d'e-mail gratuits. L'option allowed_domains du champ e-mail est une liste d'autorisation : utile pour un formulaire interne limité au domaine de votre propre entreprise, inadaptée à un formulaire de démo public. Ce n'est pas un problème, car bloquer Gmail bloque aussi les fondateurs, les consultants et les acheteurs qui remplissent des formulaires depuis leur téléphone.

Étiquetez plutôt ces demandes, là où votre équipe les voit. Cette fonction s'exécute dans le relais qui publie chaque demande dans le chat ou votre CRM, et donne un indice au commercial avant l'appel :

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

Appelez-la avec event.data.fields après verifyWebhook, puis ajoutez l'étiquette au message de chat ou à une propriété du CRM. Les leads vers HubSpot ou Pipedrive montre un relais complet.

Vérifiez que tout fonctionne

  1. Ajoutez le domaine de votre site et localhost sous Allowed domains.
  2. Envoyez avec la taille d'équipe 51 à 200. La page de réservation s'ouvre avec votre nom et votre e-mail remplis.
  3. Fermez la page de réservation sans choisir de créneau. La demande est toujours dans Submissions, et l'e-mail de notification est dans votre boîte.
  4. Envoyez à nouveau avec 1 à 10 et vérifiez que vous arrivez sur la visite guidée.
  5. Envoyez avec un e-mail invalide. L'erreur s'affiche sur le formulaire, et la page de réservation ne s'ouvre pas.
  6. Réservez un rendez-vous de test, puis vérifiez que la confirmation de l'outil de réservation arrive à l'adresse saisie.

Pièges

  • Deux enregistrements par démo réservée. Ikiform contient la demande ; l'outil de réservation contient le rendez-vous. Rapprochez-les par e-mail dans votre CRM, pas par nom.
  • Pas de confirmation de la part d'Ikiform. Ikiform n'envoie pas d'e-mail à la personne qui remplit le formulaire. La confirmation et l'invitation d'agenda de l'outil de réservation couvrent les appels réservés. Pour les demandes qui ne réservent jamais, répondez depuis l'e-mail de notification le jour même.
  • Les paramètres d'URL sont visibles. Le nom et l'e-mail dans l'URL de réservation apparaissent dans l'historique du navigateur et dans les statistiques de l'outil de réservation. N'y passez rien d'autre.
  • Les embeds. Si vous intégrez plutôt l'outil de réservation sur votre propre page /book, Cal.com ne transmet les paramètres d'URL de votre page que si forwardQueryParams est activé. Calendly documente le pré-remplissage des embeds via l'objet prefill de son embed JavaScript : utilisez-le plutôt qu'une simple iframe.
  • La vérification anti-spam. Avec Spam check réglé sur Ikiform, les versions navigateur doivent appeler challenge() de @ikiform/sdk avant d'envoyer, sinon elles reçoivent 403 challenge_required. Les versions serveur contournent la vérification.

Questions

Une étape vous bloque, ou vous voulez un guide pour votre cas ? Écrivez à hello@ikiform.com.