Warteliste für ein neues SaaS

Warteliste für ein neues SaaS8 Min. Lesezeit

So baust du eine Pre-Launch-E-Mail-Liste für einen Product-Hunt-Launch

Sammle Wochen vor Product Hunt eine Launch-Liste, markiere jede Anmeldung nach Kanal und sende die Launch-E-Mail in zwei Wellen, abgestimmt auf den Reset nach Pacific Time.

Preet SutharGründer, Ikiform

Fang vier bis sechs Wochen vor dem Launch an, auf deiner eigenen Seite E-Mails zu sammeln, mit einem versteckten Quellfeld, damit du weißt, über welchen Kanal jede Anmeldung kam. Bitte die Leute, einer Launch-Tag-E-Mail zuzustimmen, exportiere die Liste in der Woche davor und teile sie in zwei Versände auf: einen direkt nachdem der Product-Hunt-Tag um 0:01 Uhr Pacific Time beginnt, und einen für Amerika an dessen Vormittag.

Ein Product-Hunt-Launch hat ein festes Datum und ein 24-Stunden-Fenster. Die Leute, die dein Produkt am ehesten ausprobieren und einen durchdachten Kommentar hinterlassen, sind die, die von dir hören wollten, die Liste zählt also mehr als der Launch-Post. Diese Seite behandelt, was sich ändert, wenn die Liste für diesen einen Tag gebaut wird.

Was an einer Product-Hunt-Liste anders ist

  • Die Deadline steht fest. Eine normale Warteliste kann warten, bis das Produkt fertig ist. Hier muss die Liste exportiert, bereinigt und in dein E-Mail-Tool geladen sein, bevor ein Datum kommt, das du vor Wochen gewählt hast.
  • Der Tag läuft nach Pacific Time. Launches gehen um 0:01 Uhr PT live und konkurrieren um den Rang dieses Tages. Deine Liste lebt in allen Zeitzonen, ein einzelner Versand zu einer Uhrzeit erreicht also die Hälfte im Schlaf.
  • Die Bitte ist Feedback, nicht Stimmen. Die Regeln von Product Hunt verbieten es, um Upvotes zu bitten, und das kann einen Launch disqualifizieren. Bitte die Liste, das Produkt auszuprobieren und zu kommentieren, was sie ändern würde. Das ist regelkonform, und Kommentare wirken ohnehin besser als eine Zahl.
  • Der Launch-Tag bringt einen Ansturm. Besucher von Product Hunt landen auf deiner Site und melden sich innerhalb weniger Minuten an. Formularlimits, die wochenlang keine Rolle spielten, können für ein paar Stunden wichtig werden.
Eine Product-Hunt-Launch-Liste von der ersten Anmeldung bis zum Tag danachVorherLaunch-Tag, Pacific Time6 bis 4WochenvorherSeitelive, refproKanal1Wochevorherexportieren,deduplizieren,Wellenteilender TagdavorformularweitesLimiterhöhen12:01a.m.Launchgeht liveWelle1Europa,Afrika,Asien,Ozeanien6 a.m.Welle 2:AmerikanächsterTagDankeschön,refsvergleichenwöchentlich teilenMinutenEine Product-Hunt-Launch-Liste von der ersten Anmeldung bis zum Tag danachVorherLaunch-Tag, Pacific Time6 bis 4 Wochen vorherSeite live, ref pro Kanal1 Woche vorherexportieren, deduplizieren,Wellen teilender Tag davorformularweites Limit erhöhen12:01 a.m.Launch geht liveWelle 1Europa, Afrika, Asien, Ozeanien6 a.m.Welle 2: Amerikanächster TagDankeschön, refs vergleichenwöchentlich teilenMinuten
  1. Vier bis sechs Wochen vorher geht die Seite mit dem Formular live, und jeder Kanal, in dem du sie teilst, bekommt seinen eigenen ref-Wert.
  2. Exportiere eine Woche vorher die Liste, entferne Duplikate und teile die Leute, die zugestimmt haben, nach Land in zwei Wellen auf.
  3. Erhöhe am Tag davor das Limit für das ganze Formular, damit Launch-Traffic nicht abgewiesen wird.
  4. Um 0:01 Uhr Pacific Time geht der Launch live.
  5. Minuten später sendest du Welle 1 an alle außerhalb Amerikas, wo es Vormittag oder Nachmittag ist.
  6. Gegen 6 Uhr Pacific Time sendest du Welle 2 an Amerika.
  7. Bedanke dich am nächsten Tag bei der Liste und vergleiche, welche ref-Werte die Leute gebracht haben, die sich angemeldet haben und geblieben sind.
Ikiform erfasst das Land jeder Anmeldung, die Aufteilung braucht also keine zusätzliche Frage im Formular. Unbekannte Länder kommen in die zweite Welle.

Das Formular

Starte mit dem reinen E-Mail-Formular aus der Hauptanleitung und füge zwei Dinge hinzu: eine Checkbox, die nach der Launch-Tag-E-Mail fragt, und ein verstecktes ref, das aus dem Link gefüllt wird, über den die Leute kamen.

index.html
<form id="launch-list" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required>
  <label>
    <input name="launch_reminder" type="checkbox" value="true">
    Email me the morning we launch on Product Hunt
  </label>
  <input type="hidden" name="ref" value="direct">
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>
  <button>Get early access</button>
</form>

<script>
  const params = new URLSearchParams(location.search);
  const ref = params.get("ref") || params.get("utm_source");
  if (ref) {
    document.querySelector('#launch-list [name="ref"]').value = ref.toLowerCase().replace(/[^a-z0-9_-]/g, "").slice(0, 40);
  }
</script>
  • Die Checkbox ist anfangs nicht angehakt. Eine Launch-Tag-E-Mail ist etwas anderes als früher Zugang, die Leute stimmen ihr also ausdrücklich zu. Ikiform speichert true oder false mit dem Zeitstempel der Anmeldung.
  • Das Skript kopiert ?ref= oder ?utm_source= in das versteckte Eingabefeld und entfernt alles, was kein Buchstabe, keine Ziffer, kein - oder _ ist. Ohne beides bleibt ref auf direct.
  • Product Hunt hängt den Links auf deiner Launch-Seite meist ref=producthunt an, Anmeldungen am Launch-Tag markieren sich also selbst.

Füge die Felddefinition im Tab Fields des Formulars hinzu. Ikiform lehnt dann Posts ohne E-Mail ab, speichert die Checkbox als echtes true oder false und begrenzt ref auf 40 Zeichen, damit niemand es vollstopfen kann.

Felder
{
  "version": 1,
  "title": "Launch list",
  "fields": [
    { "id": "email", "type": "email", "label": "Email", "required": true },
    { "id": "launch_reminder", "type": "checkbox", "label": "Email me the morning we launch on Product Hunt" },
    { "id": "ref", "type": "text", "label": "Source", "validation": { "max_length": 40 } }
  ]
}

Ein ref pro Kanal

Leg die Werte fest, bevor du den Link irgendwo teilst, und nutze sie jedes Mal:

Wo du teilstLinkGespeicherter ref
Deine Posts auf X oder Blueskyexample.com/?ref=xx
LinkedInexample.com/?ref=linkedinlinkedin
Ein Community-Post, etwa auf Indie Hackersexample.com/?ref=ihih
Dein Newsletter oder Blogexample.com/?utm_source=newsletternewsletter
Deine Product-Hunt-Launch-SeiteVon Product Hunt hinzugefügtproducthunt

Mach das Formular bereit für Launch-Traffic

Die Standardlimits passen zu einer ruhigen Pre-Launch-Seite. Der Launch-Tag ist nicht ruhig. Jeder Besucher kann 5-mal pro Minute senden, was reichlich ist, aber das ganze Formular ist auf 300 pro Minute begrenzt. Ein Launch auf der Startseite kann in einer vollen Minute mehr Anmeldungen bringen.

  • Öffne am Tag davor die Einstellungen des Formulars und wähle ein Custom-Rate-Limit mit einem höheren Limit für das Formular. Stell es nach der Launch-Woche zurück.
  • Wenn du bei einem Meetup oder in einem Coworking-Space eine Demo zeigst, teilen sich alle eine IP. Wähle für diesen Tag Relaxed.
  • Ein abgelehnter Post bekommt 429 rate_limited und einen Retry-After-Header. Das einfache HTML-Formular zeigt Ikiforms Fehlerseite mit einem Link zurück.
  • Aktiviere die Menschlichkeitsprüfung unter Spam check, wenn der Launch-Tag Bots bringt. Das einfache Formular braucht dafür keine Änderung; siehe Spamschutz.

Die Launch-E-Mail in zwei Wellen aufteilen

Lies eine Woche vor dem Launch die Liste über die REST-API und teile sie auf. Dieses Skript behält die neueste Anmeldung pro E-Mail, verwirft alle, die das Häkchen nicht gesetzt haben, und schreibt nach dem Land, das Ikiform erfasst hat, zwei CSV-Dateien. Es braucht einen Secret Key mit submissions:read.

waves.mjs
import { writeFileSync } from "node:fs";
import { createClient } from "@ikiform/sdk";

const AMERICAS = new Set(["US", "CA", "MX", "BR", "AR", "CO", "CL", "PE", "EC", "UY", "PY", "BO", "VE", "GT", "CR", "PA", "DO", "PR"]);
const ikiform = createClient({ apiKey: process.env.IKIFORM_SECRET_KEY });
const seen = new Set();
const waves = { midnight: [], morning: [] };

for await (const submission of ikiform.submissions.iterate({ formId: "frm_xxxxxxxxxxxxxxxx", status: "received", limit: 100 })) {
  const email = String(submission.fields.email ?? "").trim().toLowerCase();
  if (!email || seen.has(email)) continue;
  seen.add(email);
  if (submission.fields.launch_reminder !== true) continue;
  const country = submission.meta.country ?? "";
  const wave = !country || AMERICAS.has(country) ? waves.morning : waves.midnight;
  wave.push([email, String(submission.fields.ref ?? "").replaceAll(",", ""), country].join(","));
}

for (const [name, rows] of Object.entries(waves)) {
  writeFileSync(`wave-${name}.csv`, ["email,ref,country", ...rows].join("\n"));
  console.log(`${name}: ${rows.length} people`);
}
  • Anmeldungen kommen neueste zuerst, eine Person, die sich zweimal angemeldet hat, wird also nach ihrer letzten Antwort beurteilt. Hat sie das Häkchen beim zweiten Mal entfernt, bleibt sie außen vor.
  • Importiere beide Dateien als getrennte Segmente in dein E-Mail-Tool und plane sie: Welle 1 für ein paar Minuten nach 0:01 Uhr Pacific Time, Welle 2 für etwa 6 Uhr Pacific Time.
  • Führe es am Vorabend des Launchs noch einmal aus, um die Anmeldungen der letzten Woche mitzunehmen.

Die Launch-Tag-E-Mail

Sende sie aus deinem E-Mail-Tool, damit Abmeldungen und Bounces behandelt werden. Stell das Produkt an den Anfang, verlinke die Launch-Seite an zweiter Stelle und bitte um einen Kommentar, nicht um eine Stimme:

Launch-Tag-E-Mail
Subject: We're on Product Hunt today

Hi,

You joined the Acme list a few weeks ago. Today we launched on Product Hunt,
and the product is open to everyone on this list first.

Try it: https://acme.example/start
Our launch page: https://www.producthunt.com/products/acme

If you have a minute, tell us on the launch page what you'd change.
Honest comments help more than anything else today.

Ada, founder of Acme
Ikiform schreibt der Person, die das Formular ausfüllt, keine E-Mail. Benachrichtigungs-E-Mails gehen nur an dich und dein Team, es gibt also keinen Autoresponder, keine Bestätigungs-E-Mail und kein Double-Opt-in. Sende diese aus deinem E-Mail-Tool, ausgelöst durch einen Webhook. Wenn du eine Willkommens-E-Mail willst, sobald sich jemand einträgt, leite Anmeldungen per Webhook an dein E-Mail-Tool weiter; die Hauptanleitung zeigt das Relay.

Der Tag danach

Exportiere die Liste erneut mit Export CSV, gefiltert auf die letzten 7 Tage, und zähle die Anmeldungen nach ref. Die Kanäle, die Leute gebracht haben, die sich später angemeldet haben, sind der Ort für deinen nächsten Launch-Post. Schick den Leuten, die sich am Launch-Tag eingetragen haben, aus deinem E-Mail-Tool ein kurzes Dankeschön; sie haben dich über Product Hunt gefunden und noch nichts von dir gehört.

Prüfen, ob es funktioniert

Mach das eine Woche vor dem Launch, nicht in der Nacht davor.

  1. Füge unter Allowed domains des Formulars die Domain deiner Site hinzu, plus localhost, während du entwickelst. Lass das Feld leer, um Posts von überall anzunehmen.
  2. Öffne die Seite mit ?ref=x und sende ab. Die Einsendung zeigt ref als x und launch_reminder als false.
  3. Sende erneut mit gesetztem Häkchen und ohne Query-String. ref lautet direct und launch_reminder lautet true.
  4. Öffne Submissions im Dashboard. Die neue Einsendung ist da, mit jedem Feld, das du gesendet hast.
  5. Führe das Wellen-Skript aus und prüfe, dass jede Testadresse in der Datei steht, die du für ihr Land erwartest.
  6. Nichts angekommen? Stell den Statusfilter im Dashboard auf Spam. Spam bekommt dieselbe Erfolgsantwort wie eine echte Einsendung.

Stolperfallen

ProblemWas zu tun ist
429 rate_limitedEin Besucher hat mehr gesendet, als das Rate-Limit des Formulars erlaubt. Standard erlaubt 5 pro Minute und Besucher. Warte Retry-After ab oder wähle Relaxed oder Custom für Formulare, die von einer gemeinsamen IP aus senden.
422 mit Unknown field für utm_source oder einen anderen ParameterNur ref ist definiert. Das Skript liest utm_source in ref ein, statt es zu senden, prüfe also, dass du kein weiteres verstecktes Eingabefeld hinzugefügt hast.
Jede Anmeldung hat ref auf directDas Skript läuft, bevor das Formular existiert, oder die id des Formulars weicht ab. Setze das Skript hinter das Formular und behalte id="launch-list".
Ein Land ist im Export leerIkiform konnte nicht feststellen, wo der Besucher war. Das Skript steckt leere Länder in die Vormittagswelle, die Amerika wach erreicht und alle anderen später an ihrem Tag.
Die Einsendung ist im Dashboard, aber keine E-Mail und kein Webhook kam anSie wurde als Spam gespeichert. Spam löst nichts aus. Öffne sie unter dem Filter Spam, um die Gründe zu sehen, und markiere sie als kein Spam, um ihre E-Mail und Webhooks zu senden.

Fragen

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