# 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.

Publié le 2026-10-25 · https://ikiform.com/fr/guides/waitlist/product-hunt

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.

Schéma : Une liste de lancement Product Hunt, de la première inscription au lendemain

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](https://ikiform.com/fr/guides/waitlist.md#form) 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`:

```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`:

```json
{
  "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` |
| LinkedIn | `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](https://ikiform.com/fr/docs/rate-limits.md) 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](https://ikiform.com/fr/docs/spam.md#human-check).

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

Une semaine avant le lancement, lisez la liste via l'[API REST](https://ikiform.com/fr/docs/api.md#list-submissions) 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`:

```js
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`:

```text
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](https://ikiform.com/fr/docs/webhooks.md). 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](https://ikiform.com/fr/guides/waitlist.md#confirm) 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è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

### Combien de temps avant un lancement Product Hunt faut-il démarrer une liste d'attente ?

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.

### Puis-je demander à ma liste d'attente de voter sur Product Hunt ?

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.

### À quelle heure envoyer l'e-mail de lancement ?

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.

### Ikiform sait-il de quel pays vient une inscription ?

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.

### Ikiform est-il gratuit ?

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.

## Autres guides

- [Liste d'attente pour un nouveau SaaS](https://ikiform.com/fr/guides/waitlist.md): Créez une liste d'attente avant lancement sur votre landing page : le formulaire, l'anti-spam, les doublons, les e-mails de confirmation et un export propre le jour J.
- [Inscription bêta avec sélection](https://ikiform.com/fr/guides/waitlist/beta-signup.md): Un formulaire de candidature bêta avec des questions de sélection appliquées côté serveur, et un script qui note les candidats et choisit chaque cohorte.
- [Liste d'attente en HTML simple](https://ikiform.com/fr/guides/waitlist/html.md): Une page de liste d'attente complète en HTML simple, sans build, qui fonctionne sans JavaScript, remercie sur place quand il se charge, et se replie si besoin.
- [Liste d'attente sur Framer](https://ikiform.com/fr/guides/waitlist/framer.md): Deux façons de collecter des inscriptions sur Framer : le formulaire Framer avec un webhook vers Ikiform, ou un code component qui garde limites et anti-spam.
- [Liste d'attente d'application mobile](https://ikiform.com/fr/guides/waitlist/mobile-app.md): Une liste d'attente avant lancement pour une app iOS ou Android qui demande le téléphone utilisé, envoie les testeurs iPhone vers TestFlight et remplit un test fermé Play.
- [Liste d'attente Next.js](https://ikiform.com/fr/guides/waitlist/nextjs.md): Une liste d'attente Next.js App Router : une server action qui transmet avec une clé secrète, useActionState, un merci optimiste et une limite par visiteur.
