Guides

Guides18 min de lecture

Créer un formulaire de capture de leads qui vous parvient vite

Un formulaire de capture de leads sur votre propre site, qui vous écrit avec le lead en adresse de réponse, alerte le chat de l'équipe et alimente votre CRM, pour répondre tant que le lead est encore là.

Preet SutharFondateur, Ikiform

Placez sur votre propre page un court formulaire qui envoie le nom, l'e-mail professionnel et une question de qualification à un backend de formulaires. Activez les e-mails de notification pour que chaque lead arrive dans votre boîte avec Reply pointant vers lui, et envoyez un webhook signé vers le chat de votre équipe et votre CRM. Mesurez ensuite les minutes entre l'envoi et la première réponse, car ce chiffre fait gagner plus d'affaires que le design du formulaire.

Un formulaire de leads est un formulaire de contact avec une mission : lancer une conversation commerciale. Les gens qui le remplissent vous comparent à quelqu'un d'autre, souvent dans un autre onglet. L'équipe qui répond en premier, avec une réponse utile d'une vraie personne, obtient généralement le rendez-vous. Ce guide construit le formulaire sur votre propre site, vous fait parvenir chaque lead en quelques secondes et laisse le CRM facultatif.

Le trajet d'un lead

Le formulaire envoie à Ikiform. Ikiform vérifie que l'envoi n'est pas du spam, le stocke, puis fait trois choses à la fois : il écrit à votre équipe avec le lead comme adresse de réponse, envoie un webhook signé et affiche le lead dans le tableau de bord. C'est par le webhook que le lead atteint le chat de l'équipe et votre CRM.

Comment un lead va de votre formulaire à la personne qui lui répondformulairede leadsvotre site,toute stack outout créateurIkiformanti-spam,stocke le leade-mail denotificationRépondre écritau leadtableau debordrechercher,filtrer,exporterwebhooksignésubmission.createdchat et CRMrelais ouautomatisationenvoirelaisComment un lead va de votre formulaire à la personne qui lui répondformulairede leadsvotre site,toute stack outout créateurIkiformanti-spam,stocke le leade-mail denotificationRépondre écrit auleadtableau de bordrechercher, filtrer,exporterwebhook signésubmission.createdchat et CRMrelais ouautomatisationenvoirelais
  1. Un visiteur remplit le formulaire de leads de votre site, qui envoie à votre endpoint Ikiform.
  2. Ikiform vérifie le honeypot, le score de spam et la limite de débit, puis stocke le lead.
  3. Quelques secondes plus tard, chaque destinataire des notifications reçoit un e-mail, et appuyer sur Répondre écrit au lead.
  4. Le lead apparaît dans le tableau de bord, où vous pouvez le rechercher, le filtrer et l'exporter.
  5. Ikiform envoie un webhook submission.created signé.
  6. Un relais ou un outil d'automatisation publie le lead dans le chat de l'équipe et crée le contact dans votre CRM.
L'e-mail est le chemin le plus rapide, sans configuration. Le webhook ajoute les endroits que votre équipe surveille déjà.

Quatre façons de capter des leads

Chaque configuration courante a son point fort. Choisissez selon l'endroit où vous voulez que vivent les leads et qui maintient le formulaire.

ApprochePoints fortsCompromis
Le formulaire de votre CRM, comme les formulaires HubSpot ou les web forms de PipedriveLes leads arrivent dans le CRM comme contacts, sans colle. Suivi et lead scoring vivent dans un seul produit.Le formulaire est intégré avec le script et le style du CRM. Changer de CRM oblige à refaire chaque formulaire. Certaines fonctionnalités dépendent de l'offre.
Formulaire intégré d'un form builder, comme Typeform ou TallyDes formulaires multi-étapes soignés avec logique, sans code.Un embed qui ressemble au créateur, sauf si vous payez pour le restyler. Les webhooks et les limites de réponses dépendent de l'offre.
Votre propre route API et votre base de donnéesToute la logique que vous voulez, comme un lead scoring avant de stocker quoi que ce soit.Vous construisez le filtrage du spam, les limites de débit, les alertes e-mail, les nouvelles tentatives et l'export, et vous gardez un serveur en marche pour un seul formulaire.
Backend de formulaires, comme IkiformVotre propre HTML sur n'importe quel site. Filtrage du spam, alertes e-mail avec adresse de réponse, webhooks signés et export CSV, sans serveur.Pas de lead scoring, pas de fiches CRM et pas d'e-mail au lead. Ceux-là viennent de votre CRM ou de votre outil d'e-mailing, via webhook.

Si tout votre processus commercial tourne dans un seul CRM et que son formulaire vous convient, utilisez-le. Un backend de formulaires convient quand le formulaire doit ressembler à votre site, quand vous pourriez changer de CRM, ou quand vous voulez que le même formulaire atteigne l'e-mail, le chat et un CRM sans devoir choisir.

Demander moins, qualifier une fois

Chaque champ ajouté coûte des soumissions. La plupart des formulaires de leads ont besoin de quatre choses : à qui répondre, où la personne travaille, ce qu'elle veut, et de la place pour expliquer. Une question à choix fixe sert à qualifier, car elle arrive sous la forme d'une valeur parmi quelques valeurs connues, sur laquelle votre routage peut compter. Essayez ci-dessous : l'outil exécute le validateur d'Ikiform dans votre navigateur et montre ce qui serait stocké, ou le 422 que vous recevriez.

Aperçu

Exécute le validateur d'Ikiform dans votre navigateur. Rien n'est envoyé.

Collez cette définition dans l'onglet Fields du formulaire et Ikiform l'applique côté serveur. Le modèle de formulaire de contact en propose une version plus légère, avec un sujet au lieu d'un intérêt.
ChampPourquoiÀ garder en tête
nameUne réponse qui commence par son nomGardez l'id name. Un lien dans un champ de nom est un fort signal de spam
emailÀ qui écrit ReplyGardez l'id email. Le libellé E-mail professionnel incite à en utiliser un, sans l'imposer
companyLe rechercher avant de répondreFacultatif. L'exiger coûte les soumissions des freelances
interestRoutage et prioritéUn select stocke une valeur listée ou refuse l'envoi : les automatisations peuvent donc s'y brancher
messageDu contexte pour la première réponseFacultatif. Une zone de rédaction obligatoire est le champ devant lequel les gens abandonnent

Les numéros de téléphone, la taille de l'équipe et le budget ont leur place dans les formulaires où ils changent ce que vous faites ensuite. Le modèle de demande de devis est la version complète, avec service, budget et délai en choix fixes. Si un commercial appelle chaque lead, demandez un téléphone. Si vous routez selon la taille de l'équipe, demandez-la sous forme de select. Sinon, gardez-les pour la première réponse.

Le formulaire

Choisissez votre stack. Chaque version affiche le message du serveur sous le champ concerné et garde ce que le visiteur a tapé, car perdre un message à moitié écrit à cause d'une faute de frappe, c'est ainsi que les leads abandonnent. L'état de succès indique qui répond et quand, pour que personne ne se demande si ça a marché.

Le formulaire envoie de façon classique et redirige vers votre page de remerciement : il fonctionne donc avant le chargement de tout script. Chaque champ a un emplacement vide pour son erreur.

contact-sales.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST" id="lead-form" novalidate>
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required />
  <p class="error" data-error-for="name" hidden></p>

  <label for="email">Work email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />
  <p class="error" data-error-for="email" hidden></p>

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

  <label for="interest">What can we help with?</label>
  <select id="interest" name="interest" required>
    <option value="pricing">Pricing for my team</option>
    <option value="demo">A live demo</option>
    <option value="custom">A custom plan or contract</option>
    <option value="other">Something else</option>
  </select>

  <label for="message">Anything we should know?</label>
  <textarea id="message" name="message" rows="4"></textarea>
  <p class="error" data-error-for="message" hidden></p>

  <input type="hidden" name="page" value="pricing" />
  <input type="hidden" name="_redirect" value="https://example.com/thanks" />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Talk to sales</button>
</form>

Le script garde le visiteur sur la page. Il affiche l'erreur de chaque champ renvoyée par le serveur sous ce champ, et remplace le formulaire par une ligne qui indique qui répond et quand.

lead-form.js
const form = document.getElementById("lead-form");

function showErrors(fields) {
  form.querySelectorAll("[data-error-for]").forEach((slot) => {
    const message = fields[slot.dataset.errorFor]?.[0];
    slot.textContent = message ?? "";
    slot.hidden = !message;
  });
}

form.addEventListener("submit", async (event) => {
  event.preventDefault();
  const button = form.querySelector("button");
  button.disabled = true;
  button.textContent = "Sending";
  try {
    const response = await fetch(form.action, {
      method: "POST",
      headers: { Accept: "application/json" },
      body: new FormData(form),
    });
    const result = await response.json();
    if (result.ok) {
      const thanks = document.createElement("p");
      thanks.setAttribute("role", "status");
      thanks.textContent = `Thanks, ${form.elements.name.value.trim().split(" ")[0]}. A person on our team will reply to ${form.elements.email.value} within one working day.`;
      form.replaceWith(thanks);
      return;
    }
    showErrors(result.error.fields ?? {});
    if (!result.error.fields) alert(result.error.message);
  } catch {
    alert("Something went wrong. Email sales@example.com and we'll pick it up.");
  }
  button.disabled = false;
  button.textContent = "Talk to sales";
});
  • Remplacez frm_xxxxxxxxxxxxxxxx par l'id de votre formulaire, visible dans le tableau de bord.
  • L'input masqué _gotcha est le honeypot. Les humains ne le voient jamais ; les bots qui remplissent tous les inputs se signalent eux-mêmes comme spam.
  • L'input masqué page enregistre la page d'où vient le lead : tarifs, page de fonctionnalité, landing page de campagne. Si vous définissez des champs, ajoutez page comme champ texte facultatif, sinon l'envoi est refusé avec Unknown field.
  • 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.
  • Le formulaire HTML simple a besoin de Redirect after submit, ou d'un input _redirect vers l'un de vos Allowed domains, pour arriver sur votre propre page de remerciement.
Les versions côté serveur envoient avec une clé secrète, donc Ikiform ignore 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 et 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.

La documentation détaille la configuration de chaque framework : Next.js, Astro, SvelteKit, Nuxt, React, Vue, envoi depuis un serveur et HTML simple.

Joindre le lead en quelques minutes

Le formulaire, c'est la partie facile. Ce qui distingue un formulaire de leads qui vend d'un formulaire qui collecte, c'est le temps entre l'envoi et la réponse d'une personne. Voici à quoi ressemble ce trajet quand tout fonctionne :

Les minutes entre l'envoi d'un lead et votre première réponseenvoi0 sstockémoins d'unesecondee-mail etchatsecondes plustardvousrépondezdepuis votreboîtefile d'attenteRépondreLes minutes entre l'envoi d'un lead et votre première réponseenvoi0 sstockémoins d'une secondee-mail et chatsecondes plus tardvous répondezdepuis votre boîtefile d'attenteRépondre
  1. Le lead envoie le formulaire.
  2. Ikiform le stocke et répond au navigateur en bien moins d'une seconde.
  3. L'e-mail de notification et le webhook partent d'une file d'attente quelques secondes plus tard.
  4. Quelqu'un de l'équipe appuie sur Répondre dans sa boîte, ou sur le lien mailto dans le chat, et la réponse part au lead.
Tout jusqu'à l'e-mail prend quelques secondes. La dernière flèche est celle que vous maîtrisez, et celle qui fait gagner les affaires.

Répondre depuis votre boîte

Chaque e-mail de notification utilise le lead comme adresse de réponse. Ikiform la prend d'abord dans un champ _replyto, puis dans un champ nommé email, email_address, your_email, reply_to, contact_email. Gardez l'id de champ email et Reply écrit au lead, pas à Ikiform. L'objet est New submission: suivi du nom du formulaire : nommez donc le formulaire d'après ce qu'il est, comme Parler à un commercial, et filtrez sur cet objet pour étiqueter ou marquer les leads.

Ajoutez jusqu'à 10 destinataires par formulaire dans ses réglages de notification : des membres de l'espace de travail, ou des adresses externes qui confirment d'abord par e-mail. Envoyez-le aux personnes qui répondent, pas à un alias partagé dont personne n'est responsable : un lead dans cinq boîtes que personne ne prend en charge attend plus longtemps qu'un lead dans une seule.

Les e-mails de notification sont plafonnés à 50 par formulaire et par heure, ou 10 tant que l'espace de travail a moins de 7 jours, puis un seul récapitulatif pour le reste de l'heure. Un formulaire de leads normal n'en approche jamais. Si vous lancez une campagne qui pourrait le faire, routez aussi les leads vers le chat par webhook.

Alerter l'équipe là où elle se trouve

L'e-mail fonctionne quand quelqu'un est responsable de la boîte. Une équipe qui vit dans le chat répond plus vite quand le lead y apparaît. Ajoutez un webhook vers Slack, Teams ou Discord en suivant Slack, Microsoft Teams ou Discord. Mettez un lien mailto: dans le message pour que la personne qui le prend en charge puisse répondre en un clic.

Router selon la demande

Comme interest n'accepte que des valeurs listées, un petit relais peut s'y brancher en toute confiance. Cette route envoie les demandes de démo et les questions de contrat dans leurs propres canaux, et tout le reste dans le canal commercial principal :

app/api/leads/route.ts
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";

const CHANNELS: Record<string, string | undefined> = {
  demo: process.env.SLACK_DEMO_WEBHOOK,
  custom: process.env.SLACK_ENTERPRISE_WEBHOOK,
};

export async function POST(request: Request) {
  const payload = await request.text();
  let event;
  try {
    event = await verifyWebhook({ payload, headers: request.headers, secret: process.env.IKIFORM_WEBHOOK_SECRET! });
  } catch (error) {
    if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
    throw error;
  }
  if (event.type !== "submission.created") return new Response(null, { status: 204 });

  const lead = event.data.fields;
  const interest = String(lead.interest ?? "other");
  const target = CHANNELS[interest] ?? process.env.SLACK_SALES_WEBHOOK!;
  const text = [
    `*${lead.name}* from ${lead.company || "an unknown company"} wants: ${interest}`,
    `Reply: mailto:${lead.email}`,
    lead.message ? `> ${String(lead.message).slice(0, 300)}` : "",
  ]
    .filter(Boolean)
    .join("\n");

  const response = await fetch(target, {
    method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify({ text }),
  });
  if (!response.ok) return new Response(`Slack answered ${response.status}`, { status: 502 });
  return new Response(null, { status: 204 });
}
  • verifyWebhook vérifie la signature et l'horodatage, pour que personne d'autre ne puisse publier de faux leads dans vos canaux.
  • Un 502 quand Slack est en panne fait réessayer Ikiform pour la même livraison, avec le même webhook-id, pendant environ 3 jours.
  • Changez librement le libellé d'une option. Gardez sa valeur stable dès qu'un relais ou une automatisation en dépend.

Garder les déchets hors du pipeline

Les formulaires de leads attirent un type de spam particulier : des gens qui vous vendent du SEO, du netlinking et du développement externalisé. Il gaspille votre réponse la plus rapide : filtrez-le avant qu'il n'atteigne qui que ce soit.

DéfenseCe qu'elle arrêteConfiguration
HoneypotLes bots qui remplissent tous les inputsL'input masqué _gotcha
Score de spamPhrases de démarchage connues comme seo services (+2), liens dans le nom (+3), trois liens ou plus (+2), répétitions (+3). À 5, c'est du spamAucun
Limite de débitLes scripts qui envoient en boucleRéglez le formulaire sur Strict, 2 toutes les 10 minutes par visiteur. Un vrai lead envoie rarement deux fois en dix minutes
Domaines autorisésLes envois depuis d'autres sitesAjoutez votre domaine sous Allowed domains
Vérification humaineBots dans un vrai navigateurRéglez Spam check sur Ikiform. Les versions fetch ont alors besoin d'un token de challenge()

Le spam reçoit la même réponse de succès qu'un vrai lead, ne déclenche ni e-mail ni webhook et ne compte pas dans l'utilisation. Cela veut aussi dire qu'un lead mal jugé ne fait aucun bruit. Vérifiez le filtre Spam une fois par semaine ; marquer un envoi comme non-spam déclenche alors son e-mail et ses webhooks. La documentation anti-spam liste chaque signal.

Savoir d'où viennent les leads

Chaque soumission enregistre déjà l'origine et le referrer de la page, qui apparaissent dans le webhook sous meta.origin et meta.referrer. Les tags de campagne demandent un peu d'aide, car le visiteur arrive souvent sur une page et envoie depuis une autre. Ce snippet copie les paramètres utm_ dans des inputs masqués et les mémorise pour la session :

attribution.html
<input type="hidden" name="utm_source" />
<input type="hidden" name="utm_medium" />
<input type="hidden" name="utm_campaign" />

<script>
  const params = new URLSearchParams(location.search);
  for (const key of ["utm_source", "utm_medium", "utm_campaign"]) {
    let value = params.get(key);
    try {
      if (value) sessionStorage.setItem(key, value);
      else value = sessionStorage.getItem(key);
    } catch {}
    const input = document.querySelector(`#lead-form [name="${key}"]`);
    if (input && value) input.value = value.slice(0, 200);
  }
</script>

Dans un framework, lisez les mêmes paramètres dans l'URL côté serveur et affichez-les en inputs masqués. Si des champs sont définis, ajoutez chaque id utm_ comme champ texte facultatif. Les noms qui commencent par _ ne sont jamais stockés : ne les utilisez pas pour des données à conserver.

Ce que le lead voit ensuite

Ikiform n'envoie pas d'e-mail à la personne qui remplit le formulaire. Les e-mails de notification vont uniquement à vous et à votre équipe : il n'y a donc ni réponse automatique, ni e-mail de confirmation, ni double opt-in. Envoyez-les depuis votre outil d'e-mailing, déclenché par un webhook. Pour un formulaire de leads, c'est souvent très bien : une réponse personnelle rapide vaut mieux qu'une réponse automatique. Si vous voulez quand même un accusé de réception immédiat, envoyez-le depuis votre CRM ou votre outil d'e-mailing quand le webhook crée le contact, pour que réponses et désinscriptions soient suivies au même endroit.

Quoi que vous envoyiez, le message de succès sur la page est la promesse. Dites qui répond et quand, et tenez-le. Un formulaire qui annonce un jour ouvré et répond en dix minutes gagne la confiance ; un formulaire qui annonce dix minutes et répond le lendemain la perd.

Les leads dans votre CRM

Il n'y a pas d'intégrations en un clic. Chaque outil est atteint par un webhook signé, directement ou via un outil d'automatisation comme Zapier ou n8n. Pour un CRM, cela veut dire qu'un relais convertit le corps fixe du webhook d'Ikiform en appel de création de contact du CRM. Les leads vers HubSpot ou Pipedrive détaille les deux, doublons et nouvelles tentatives compris. Tant que vous n'avez pas besoin de CRM, le tableau de bord et un export CSV hebdomadaire font un très bon pipeline.

Choisissez votre cas

La configuration ci-dessus fonctionne pour tout lead. Ces pages couvrent ce qui change pour un type de lead particulier, et pour faire entrer les leads dans un CRM.

Vérifiez que tout fonctionne

Faites ces vérifications avant d'envoyer du trafic vers la page. Ikiform n'a pas d'offre gratuite. Les tests sont gratuits : un espace de travail sans offre accepte 50 soumissions de test par mois depuis localhost. Pour passer en production, choisissez Pro à partir de 6 $/mois pour 500 soumissions, ou payez une seule fois : 10 000 soumissions pour 49 $ ou 50 000 soumissions pour 149 $, avec des crédits qui n'expirent jamais. Voir les tarifs.

  1. Dans Allowed domains du formulaire, ajoutez le domaine de votre site, plus localhost pendant le développement. Laissez vide pour accepter les envois de partout.
  2. Remplissez le formulaire sur votre page et envoyez-le. Vous arrivez sur votre page de remerciement, ou sur celle hébergée par Ikiform.
  3. Ouvrez Submissions dans le tableau de bord. La nouvelle soumission y est, avec tous les champs envoyés.
  4. Vérifiez la boîte de chaque destinataire. L'objet est New submission: suivi du nom du formulaire, et Reply ouvre un message vers l'adresse que vous avez saisie.
  5. Si vous avez ajouté un webhook, ouvrez l'endpoint dans Webhooks. La livraison affiche succeeded avec la réponse de votre serveur.
  6. Envoyez avec le honeypot rempli, _gotcha=bot. L'envoi reçoit quand même une réponse de succès, mais la soumission est stockée comme spam et n'envoie ni e-mail ni webhook.
  7. Rien n'est arrivé ? Passez le filtre de statut du tableau de bord sur Spam. Le spam reçoit la même réponse de succès qu'une vraie soumission.
  8. Chronométrez : envoyez depuis votre téléphone et notez le temps avant l'arrivée de l'e-mail et du message dans le chat.

Dépannage

ProblèmeQue faire
Reply écrit à l'adresse d'Ikiform, pas au leadLe formulaire n'a aucun champ qu'Ikiform reconnaît comme l'e-mail du lead. Renommez le champ en email, ou envoyez un champ _replyto avec l'adresse. Noms acceptés : email, email_address, your_email, reply_to, contact_email.
422 avec Unknown field pour page ou utm_sourceLe formulaire a une définition de champs et l'input masqué n'y figure pas. Ajoutez-le comme champ texte facultatif, ou supprimez l'input.
422 validation_failedL'envoi ne correspond pas à la définition des champs du formulaire. error.fields nomme chaque champ et la raison. Faites correspondre le name de l'input à l'id du champ.
403 origin_not_allowed, ou tous les envois finissent en spamLe domaine de la page n'est pas dans les Allowed domains du formulaire. Ajoutez-le, plus localhost pour les tests en local. Les sous-domaines d'un domaine listé sont autorisés.
429 rate_limitedUn visiteur a envoyé plus que ce que permet la limite de débit du formulaire. Standard autorise 5 envois par minute et par visiteur. Attendez la durée de Retry-After, ou choisissez Relaxed ou Custom pour les formulaires qui envoient depuis une seule IP partagée.
403 challenge_requiredLe spam check du formulaire est réglé sur Ikiform et un envoi fetch n'avait pas de jeton. Obtenez-en un avec challenge(formId) de @ikiform/sdk avant chaque envoi, ou désactivez la vérification.
La soumission est dans le tableau de bord mais aucun e-mail ni webhook n'est arrivéElle a été stockée comme spam. Le spam n'envoie rien. Ouvrez-la sous le filtre Spam pour voir les raisons, et marquez-la comme non-spam pour envoyer son e-mail et ses webhooks.
Un destinataire ne reçoit aucun e-mail de notificationUne adresse extérieure à l'espace de travail doit d'abord confirmer, depuis l'e-mail qu'Ikiform lui envoie. Vérifiez qu'elle a été confirmée, puis vérifiez le dossier spam du destinataire.

Questions

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