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.
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.
- 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.
- Une semaine avant, exportez la liste, supprimez les doublons et répartissez les personnes qui ont accepté en deux vagues selon le pays.
- La veille, augmentez la limite globale du formulaire pour que le trafic du lancement ne soit pas refoulé.
- À 0 h 01, heure du Pacifique, le lancement est en ligne.
- 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.
- Vers 6 h, heure du Pacifique, envoyez la vague 2 aux Amériques.
- Le lendemain, remerciez la liste et comparez quelles valeurs ref ont amené les personnes qui se sont inscrites et sont restées.
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.
<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
trueoufalseavec 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,refreste àdirect. - Product Hunt ajoute généralement
ref=producthuntaux 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.
{
"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 partagez | Lien | Ref stockée |
|---|---|---|
| Vos posts sur X ou Bluesky | example.com/?ref=x | x |
example.com/?ref=linkedin | linkedin | |
| Un post dans une communauté, comme Indie Hackers | example.com/?ref=ih | ih |
| Votre newsletter ou votre blog | example.com/?utm_source=newsletter | newsletter |
| Votre page de lancement Product Hunt | Ajoutée par Product Hunt | producthunt |
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_limitedet un en-têteRetry-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.
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 :
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 AcmeLe 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.
- Dans Allowed domains du formulaire, ajoutez le domaine de votre site, plus
localhostpendant le développement. Laissez vide pour accepter les envois de partout. - Ouvrez la page avec
?ref=xet envoyez. La soumission afficherefàxetlaunch_reminderàfalse. - Envoyez à nouveau avec la case cochée et sans paramètres d'URL.
refvautdirectetlaunch_remindervauttrue. - Ouvrez Submissions dans le tableau de bord. La nouvelle soumission y est, avec tous les champs envoyés.
- Lancez le script de vagues et vérifiez que chaque adresse de test est dans le fichier attendu pour son pays.
- 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ème | Que faire |
|---|---|
429 rate_limited | Un 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ètre | Seul 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 à direct | Le 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'export | Ikiform 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
Quatre à six semaines vous laissent le temps de partager la page à quelques endroits et de voir lesquels fonctionnent. Commencez plus tôt si vous n'avez pas encore d'audience ; la liste grandit lentement au début.
Non. Les règles de Product Hunt interdisent de solliciter des upvotes, et le faire peut entraîner la disqualification d'un lancement. Demandez aux gens d'essayer le produit et de laisser un commentaire sur ce qu'ils changeraient. Cela vous garde dans les règles et vous donne des retours exploitables.
Les lancements sont mis en ligne à 0 h 01, heure du Pacifique. Envoyez une vague quelques minutes plus tard aux personnes hors des Amériques, et une seconde vers 6 h heure du Pacifique aux Amériques, pour que la plupart le lisent le matin.
En général. Chaque soumission enregistre le pays de la connexion du visiteur quand c'est possible, et il apparaît dans l'API et les webhooks sous meta.country. Il peut être vide : considérez-le comme une indication.
Non, il n'y a pas d'offre gratuite. Les tests sont gratuits : vous pouvez envoyer 50 soumissions de test par mois depuis localhost avant de payer. Pour passer en production, Pro commence à 6 $/mois pour 500 soumissions, ou vous pouvez payer une seule fois 10 000 soumissions pour 49 $ ou 50 000 soumissions pour 149 $, avec des crédits qui n'expirent jamais.
Une étape vous bloque, ou vous voulez un guide pour votre cas ? Écrivez à hello@ikiform.com.