Liste d'attente pour un nouveau SaaS

Liste d'attente pour un nouveau SaaS9 min de lecture

Comment constituer une liste e-mail avant un lancement sur Product Hunt

Collectez une liste des semaines avant Product Hunt, taguez chaque inscription par canal et envoyez l'e-mail du jour J en deux vagues calées sur l'heure du Pacifique.

Preet SutharFondateur, Ikiform

Commencez à collecter des e-mails sur votre propre page quatre à six semaines avant le lancement, avec un champ de source masqué pour savoir de quel canal vient chaque inscription. Proposez aux gens d'accepter un e-mail le jour du lancement, puis exportez la liste la semaine précédente et répartissez-la en deux envois : un juste après le début de la journée Product Hunt à 0 h 01, heure du Pacifique, et un pour les Amériques dans leur matinée.

Un lancement sur Product Hunt a une date fixe et une fenêtre de 24 heures. Les personnes les plus susceptibles d'essayer votre produit et de laisser un commentaire réfléchi sont celles qui ont demandé à avoir de vos nouvelles : la liste compte donc plus que le post de lancement. Cette page couvre ce qui change quand la liste est construite pour ce seul jour.

Ce qui change pour une liste Product Hunt

  • La date limite est fixe. Une liste d'attente classique peut attendre que le produit soit prêt. Ici, la liste doit être exportée, nettoyée et chargée dans votre outil d'e-mailing avant une date choisie des semaines plus tôt.
  • La journée suit l'heure du Pacifique. Les lancements sont mis en ligne à 0 h 01 PT et se disputent le classement de ce jour-là. Votre liste est répartie sur tous les fuseaux horaires : un seul envoi à une seule heure trouve la moitié des destinataires endormis.
  • On demande des retours, pas des votes. Les règles de Product Hunt interdisent de solliciter des upvotes, et le faire peut entraîner la disqualification d'un lancement. Demandez à la liste d'essayer le produit et de commenter ce qu'elle changerait. C'est conforme aux règles, et des commentaires valent mieux qu'un compteur de toute façon.
  • Le jour du lancement apporte un pic. Les visiteurs de Product Hunt arrivent sur votre site et s'inscrivent à quelques minutes d'intervalle. Des limites de formulaire sans importance pendant des semaines peuvent compter pendant quelques heures.
Une liste de lancement Product Hunt, de la première inscription au lendemainAvantJour du lancement, heure du Pacifique6 à 4semainesavantpage enligne,ref parcanal1semaineavantexport,dédoublonnage,vagueslaveillereleverla limiteglobale12:01a.m.lancementen lignevague 1Europe,Afrique,Asie,Océanie6 a.m.vague 2 :lesAmériqueslelendemainremerciements,comparerles refspartager chaque semaineminutesUne liste de lancement Product Hunt, de la première inscription au lendemainAvantJour du lancement, heure du Pacifique6 à 4 semaines avantpage en ligne, ref par canal1 semaine avantexport, dédoublonnage, vaguesla veillerelever la limite globale12:01 a.m.lancement en lignevague 1Europe, Afrique, Asie, Océanie6 a.m.vague 2 : les Amériquesle lendemainremerciements, comparer les refspartager chaque semaineminutes
  1. Quatre à six semaines avant, la page est mise en ligne avec le formulaire, et chaque canal où vous la partagez reçoit sa propre valeur ref.
  2. Une semaine avant, exportez la liste, supprimez les doublons et répartissez les personnes qui ont accepté en deux vagues selon le pays.
  3. La veille, augmentez la limite globale du formulaire pour que le trafic du lancement ne soit pas refoulé.
  4. À 0 h 01, heure du Pacifique, le lancement est en ligne.
  5. Quelques minutes plus tard, envoyez la vague 1 à tous ceux qui sont hors des Amériques, où c'est le matin ou l'après-midi.
  6. Vers 6 h, heure du Pacifique, envoyez la vague 2 aux Amériques.
  7. Le lendemain, remerciez la liste et comparez quelles valeurs ref ont amené les personnes qui se sont inscrites et sont restées.
Ikiform enregistre le pays de chaque inscription : la répartition ne demande donc aucune question supplémentaire dans le formulaire. Les pays inconnus vont dans la seconde vague.

Le formulaire

Partez du formulaire e-mail seul du guide principal et ajoutez deux choses : une case qui demande l'accord pour l'e-mail du jour du lancement, et un ref masqué rempli à partir du lien d'arrivée.

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>
  • La case est décochée au départ. Un e-mail le jour du lancement est distinct de l'accès anticipé : les gens doivent donc l'accepter. Ikiform stocke true ou false avec l'horodatage de l'inscription.
  • Le script copie ?ref= ou ?utm_source= dans l'input masqué et supprime tout ce qui n'est pas une lettre, un chiffre, - ou _. Sans l'un ni l'autre, ref reste à direct.
  • Product Hunt ajoute généralement ref=producthunt aux liens de votre page de lancement : les inscriptions du jour J se taguent donc toutes seules.

Ajoutez la définition des champs dans l'onglet Fields du formulaire. Ikiform refuse alors les envois sans e-mail, stocke la case comme un vrai true ou false, et limite ref à 40 caractères pour que personne ne puisse le bourrer.

Champs
{
  "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 } }
  ]
}

Une ref par canal

Choisissez les valeurs avant de partager le lien où que ce soit, et utilisez-les à chaque fois :

Où vous partagezLienRef stockée
Vos posts sur X ou Blueskyexample.com/?ref=xx
LinkedInexample.com/?ref=linkedinlinkedin
Un post dans une communauté, comme Indie Hackersexample.com/?ref=ihih
Votre newsletter ou votre blogexample.com/?utm_source=newsletternewsletter
Votre page de lancement Product HuntAjoutée par Product Huntproducthunt

Préparer le formulaire au trafic du lancement

Les limites par défaut conviennent à une page d'avant-lancement calme. Le jour du lancement ne l'est pas. Chaque visiteur peut envoyer 5 fois par minute, ce qui est largement suffisant, mais le formulaire entier est plafonné à 300 par minute. Un lancement en première page peut envoyer plus d'inscriptions que cela pendant une minute chargée.

  • La veille, ouvrez les réglages du formulaire et choisissez une limite de débit Custom avec une limite plus élevée pour le formulaire. Remettez-la après la semaine du lancement.
  • Si vous faites une démo dans un meetup ou un espace de coworking, tout le monde partage une même IP. Choisissez Relaxed pour ce jour-là.
  • Un envoi refusé reçoit 429 rate_limited et un en-tête Retry-After. Le formulaire HTML classique affiche la page d'erreur d'Ikiform avec un lien de retour.
  • Activez la vérification humaine sous Spam check si le jour du lancement amène des bots. Le formulaire classique n'a besoin d'aucune modification pour cela ; voir protection anti-spam.

Répartir l'e-mail de lancement en deux vagues

Une semaine avant le lancement, lisez la liste via l'API REST et répartissez-la. Ce script garde l'inscription la plus récente par e-mail, écarte quiconque n'a pas coché la case, et écrit deux fichiers CSV selon le pays enregistré par Ikiform. Il lui faut une clé secrète avec 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`);
}
  • Les inscriptions arrivent de la plus récente à la plus ancienne : une personne inscrite deux fois est donc jugée sur sa dernière réponse. Si elle a décoché la case la seconde fois, elle est exclue.
  • Importez les deux fichiers dans votre outil d'e-mailing comme segments distincts et programmez-les : la vague 1 quelques minutes après 0 h 01 heure du Pacifique, la vague 2 vers 6 h heure du Pacifique.
  • Relancez-le la veille du lancement pour récupérer la dernière semaine d'inscriptions.

L'e-mail du jour du lancement

Envoyez-le depuis votre outil d'e-mailing, pour que désinscriptions et erreurs de remise soient gérées. Commencez par le produit, mettez le lien vers la page de lancement en second, et demandez un commentaire, pas un vote :

E-mail du jour du lancement
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 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. Si vous voulez un e-mail de bienvenue dès qu'une personne s'inscrit, transmettez les inscriptions par webhook à votre outil d'e-mailing ; le guide principal montre le relais.

Le lendemain

Exportez à nouveau la liste avec Export CSV, filtrée sur les 7 derniers jours, et comptez les inscriptions par ref. Les canaux qui ont amené des personnes qui se sont ensuite connectées sont ceux où ira votre prochain post de lancement. Envoyez aux personnes inscrites le jour du lancement un court remerciement depuis votre outil d'e-mailing ; elles vous ont trouvé via Product Hunt et n'ont pas encore eu de vos nouvelles.

Vérifiez que tout fonctionne

Faites-le une semaine avant le lancement, pas la veille au soir.

  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. Ouvrez la page avec ?ref=x et envoyez. La soumission affiche ref à x et launch_reminder à false.
  3. Envoyez à nouveau avec la case cochée et sans paramètres d'URL. ref vaut direct et launch_reminder vaut true.
  4. Ouvrez Submissions dans le tableau de bord. La nouvelle soumission y est, avec tous les champs envoyés.
  5. Lancez le script de vagues et vérifiez que chaque adresse de test est dans le fichier attendu pour son pays.
  6. 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.

Pièges

ProblèmeQue faire
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.
422 avec Unknown field pour utm_source ou un autre paramètreSeul ref est défini. Le script lit utm_source dans ref au lieu de l'envoyer : vérifiez donc que vous n'avez pas ajouté d'autre input masqué.
Toutes les inscriptions ont ref à directLe script s'exécute avant que le formulaire n'existe, ou l'id du formulaire est différent. Placez le script après le formulaire et gardez id="launch-list".
Un pays est vide dans l'exportIkiform n'a pas pu déterminer où se trouvait le visiteur. Le script place les pays vides dans la vague du matin, qui touche les Amériques réveillées et les autres plus tard dans leur journée.
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.

Questions

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