Formular zur Lead-Erfassung

Formular zur Lead-Erfassung6 Min. Lesezeit

Ein Formular für Demo-Anfragen bauen, das den Termin bucht

Ein Formular zum Demo-Buchen, das den Lead speichert und den Besucher dann mit vorausgefülltem Namen und E-Mail zu Cal.com oder Calendly schickt.

Preet SutharGründer, Ikiform

Sende die Demo-Anfrage zuerst an ein Formular-Backend, damit der Lead gespeichert ist und dein Team eine E-Mail bekommt, auch wenn der Besucher nie einen Termin wählt. Schick den Browser dann zu deiner Buchungsseite, mit name und email im Query-String, mit denen Calendly und Cal.com ihr Formular vorausfüllen. Schick kleine Teams woandershin, etwa zu einer aufgezeichneten Tour, damit dein Kalender Gespräche enthält, die zum Abschluss führen können.

Was bei einer Demo-Anfrage anders ist

Wer eine Demo anfragt, will einen Termin im Kalender, keinen E-Mail-Verlauf. Jede Runde "Passt dir Dienstag?" ist eine Chance, stattdessen bei einem Mitbewerber zu buchen. Die Aufgabe des Formulars ist also kurz: genug erfassen, um zu qualifizieren, und dann einen Kalender zeigen, solange der Tab noch offen ist.

Drei Rahmenbedingungen prägen den Aufbau:

  • Der Lead muss gespeichert sein, bevor sich der Terminplaner öffnet. Viele Besucher öffnen die Buchungsseite und schließen sie wieder. Wenn der einzige Datensatz von ihnen im Terminplaner liegt, sind diese Leads weg. Sende zuerst an Ikiform und leite nur bei Erfolg weiter.
  • _redirect kann nicht mitnehmen, was eingegeben wurde. Es ist eine feste URL, und Ikiform folgt ihr nur bei einer https:-URL auf einer deiner Allowed domains. cal.com oder calendly.com dort einzutragen, würde auch Posts von diesen Sites durchlassen. Baue den Buchungslink stattdessen in deinem eigenen Code.
  • Nicht jede Anfrage verdient ein Live-Gespräch. Einem Solo-Gründer, der eine Demo eines Teamprodukts anfragt, ist mit einer Tour und einem Anmeldelink besser gedient. Eine Frage mit festen Optionen entscheidet, wohin der Browser als Nächstes geht.
Wohin eine Demo-Anfrage geht, nachdem sie gespeichert istDemo-FormularName,E-Mail,Unternehmen,TeamgrößeIkiformgespeichert,TeambenachrichtigtTeamgröße?BuchungsseiteName undE-MailvorausgefülltaufgezeichneteTourmitAnmeldelinkPostok11 oder mehr1 bis 10Wohin eine Demo-Anfrage geht, nachdem sie gespeichert istDemo-FormularName, E-Mail,Unternehmen,TeamgrößeIkiformgespeichert, TeambenachrichtigtTeamgröße?BuchungsseiteName und E-MailvorausgefülltaufgezeichneteTourmitAnmeldelinkPostok11 oder mehr1 bis 10
  1. Der Besucher gibt Name, geschäftliche E-Mail, Unternehmen und Teamgröße ein, und das Formular sendet an Ikiform.
  2. Ikiform speichert die Anfrage und schickt deinem Team eine E-Mail. Nichts anderes passiert, bis es mit ok antwortet.
  3. Dein Code liest die Teamgröße, die der Besucher gewählt hat.
  4. Teams ab 11 Personen gehen zur Buchungsseite, mit Name und E-Mail im Query-String.
  5. Teams mit 1 bis 10 Personen gehen zu einer aufgezeichneten Tour mit Anmeldelink.
Die Verzweigung läuft in deinem Code, nachdem Ikiform den Lead hat. Das Team bekommt in jedem Fall jede Anfrage, sodass ein kleines Team, das ein Gespräch hätte bekommen sollen, trotzdem sichtbar ist.

Vier Felder, eines davon fürs Routing

FeldTypWarum
nameTextFüllt das Buchungsformular vor, sodass der Besucher es nur einmal eintippt
emailE-MailFüllt das Buchungsformular vor und wird zum Reply-To der Benachrichtigungs-E-Mail
companyText, hier PflichtDein Vertriebler recherchiert es vor dem Gespräch
team_sizeselectEntscheidet zwischen Buchungsseite und Tour und kommt als einer von vier bekannten Werten an

Heb dir Anwendungsfall, Zeitrahmen und Telefonnummer für das Gespräch selbst auf. Der Terminplaner kann selbst eine Frage stellen, wenn du vor dem Meeting Kontext brauchst, und sowohl Calendly als auch Cal.com können auch eigene Fragen vorausfüllen.

Erst senden, dann übergeben

Jede Version sendet die Anfrage, wartet auf Ikiforms Antwort und baut erst dann die nächste URL. Die Beispiele nutzen Cal.com; für Calendly setzt du deinen Event-Link ein. Calendly dokumentiert name und email als Parameter zum Vorausfüllen, und Cal.com füllt jedes Buchungsfeld über seinen Bezeichner vor, auch name und email.

Das Formular und sein Skript zusammen. Ohne JavaScript sendet das Formular trotzdem und landet auf deiner Seite aus Redirect after submit, also setze den Buchungslink dort als Fallback hin.

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>
Die serverseitigen Versionen senden mit einem Secret Key, also überspringt Ikiform Allowed domains und seine Menschlichkeitsprüfung. Jeder Post kommt dann von der IP deines Servers, und das Standard-Limit von 5 pro Minute und Besucher zählt alle deine Besucher zusammen. Wähle das Rate-Limit Relaxed oder Custom für ein Formular, das du über einen Server sendest, und halte IKIFORM_SECRET_KEY in Umgebungsvariablen, die nur der Server sieht. Die Serverversionen leiten den Origin-Header des Besuchers weiter, weil ein serverseitiger Fetch keinen sendet und Ikiform daran kostenlose localhost-Tests erkennt.

Geschäftliche E-Mail, ohne Gmail zu blockieren

Ikiform hat keine Einstellung, die kostenlose E-Mail-Anbieter ablehnt. Die Option allowed_domains des E-Mail-Felds ist eine Allowlist: nützlich für ein internes Formular, das auf die Domain deines eigenen Unternehmens beschränkt ist, falsch für ein öffentliches Demo-Formular. Das ist in Ordnung, denn wer Gmail blockiert, blockiert auch Gründer, Berater und Käufer, die Formulare vom Handy ausfüllen.

Markiere diese Anfragen stattdessen dort, wo dein Team sie sieht. Diese Funktion läuft im Relay, das jede Anfrage in den Chat oder dein CRM postet, und gibt dem Vertriebler vor dem Gespräch einen Hinweis:

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

Ruf sie nach verifyWebhook mit event.data.fields auf und füge den Tag dann der Chat-Nachricht oder einer CRM-Eigenschaft hinzu. Leads an HubSpot oder Pipedrive zeigt ein vollständiges Relay.

Prüfen, ob es funktioniert

  1. Füge die Domain deiner Site und localhost unter Allowed domains hinzu.
  2. Sende mit Teamgröße 51 to 200 ab. Die Buchungsseite öffnet sich mit deinem Namen und deiner E-Mail vorausgefüllt.
  3. Schließ die Buchungsseite, ohne einen Termin zu wählen. Die Anfrage ist trotzdem unter Submissions, und die Benachrichtigungs-E-Mail liegt in deinem Posteingang.
  4. Sende erneut mit 1 to 10 ab und prüfe, dass du bei der Tour landest.
  5. Sende mit einer ungültigen E-Mail ab. Der Fehler erscheint im Formular, und die Buchungsseite öffnet sich nicht.
  6. Buche ein Test-Meeting und prüfe dann, ob die Bestätigung des Terminplaners an die eingegebene Adresse geht.

Stolperfallen

  • Zwei Datensätze pro gebuchter Demo. Ikiform hält die Anfrage, der Terminplaner das Meeting. Ordne sie in deinem CRM per E-Mail zu, nicht per Name.
  • Keine Bestätigung von Ikiform. Ikiform schreibt der Person, die das Formular ausfüllt, keine E-Mail. Die eigene Bestätigung und Kalendereinladung des Terminplaners decken gebuchte Gespräche ab. Auf Anfragen, die nie buchen, antwortest du noch am selben Tag aus der Benachrichtigungs-E-Mail.
  • Query-Strings sind sichtbar. Name und E-Mail in der Buchungs-URL tauchen im Browserverlauf und in den Analytics des Terminplaners auf. Gib dort nichts anderes mit.
  • Einbettungen. Bettest du den Terminplaner stattdessen auf deiner eigenen /book-Seite ein, leitet Cal.com die Query-Parameter deiner Seite nur weiter, wenn forwardQueryParams aktiviert ist. Calendly dokumentiert das Vorausfüllen bei Einbettungen über das prefill-Objekt seines JavaScript-Embeds, also nutze das statt eines einfachen iframes.
  • Die Spamprüfung. Ist Spam check auf Ikiform gesetzt, müssen die Browser-Versionen vor dem Senden challenge() aus @ikiform/sdk aufrufen, sonst bekommen sie 403 challenge_required. Die Server-Versionen überspringen die Prüfung.

Fragen

Hängst du bei einem Schritt fest oder willst eine Anleitung für deinen Fall? Schreib an hello@ikiform.com.