# Product Hunt のローンチに向けてローンチ前のメールリストを作る方法

> Product Hunt の数週間前からローンチリストを集め、登録をチャネルごとにタグ付けし、太平洋時間のリセットに合わせてローンチ日のメールを 2 回に分けて送ります。

公開日 2026-10-25 · https://ikiform.com/ja/guides/waitlist/product-hunt

ローンチの 4〜6 週間前から自分のページでメールアドレスを集め始め、非表示の流入元フィールドで各登録がどのチャネルから来たかがわかるようにします。ローンチ日のメールへのオプトインを求め、1 週間前にリストをエクスポートして 2 回の送信に分けます。1 回目は太平洋時間の午前 0 時 1 分に Product Hunt の 1 日が始まった直後、2 回目は南北アメリカの朝に合わせて送ります。

Product Hunt のローンチは日付が決まっていて、期間は 24 時間です。プロダクトを試して丁寧なコメントを残してくれる可能性がいちばん高いのは、あなたからの連絡を希望した人たちなので、ローンチの投稿よりもリストのほうが重要です。このページでは、その 1 日のためにリストを作る場合に何が変わるかを説明します。

## Product Hunt 向けのリストは何が違うか

- **締め切りが決まっています。** 通常のウェイトリストは、プロダクトの準備ができるまで待てます。ここでは、何週間も前に決めた日付までに、リストをエクスポートし、整理して、メールツールに取り込む必要があります。
- **1 日は太平洋時間で動きます。** ローンチは太平洋時間の午前 0 時 1 分に公開され、その日の順位を競います。リストはあらゆるタイムゾーンにいるので、1 つの時刻に 1 回送ると、半分の人は寝ています。
- **頼むのは投票ではなくフィードバックです。** Product Hunt のルールでは upvote を頼むことが禁止されており、頼むとローンチが失格になることがあります。リストには、プロダクトを試して変えてほしい点をコメントしてもらうよう頼みましょう。これはルールの範囲内で、どのみち数字よりコメントのほうが印象に残ります。
- **ローンチ日には急増します。** Product Hunt の訪問者がサイトにやって来て、数分のうちに次々と登録します。何週間も問題にならなかったフォームの制限が、数時間だけ問題になることがあります。

図: 最初の登録から翌日までの Product Hunt ローンチリスト

1. 4〜6 週間前に、フォームを載せたページを公開し、共有するチャネルごとに独自の ref 値を割り当てます。
2. 1 週間前に、リストをエクスポートして重複を取り除き、オプトインした人を国ごとに 2 つのグループに分けます。
3. 前日に、フォーム全体の制限を引き上げて、ローンチのトラフィックを取りこぼさないようにします。
4. 太平洋時間の午前 0 時 1 分にローンチが公開されます。
5. 数分後、朝か午後を迎えている南北アメリカ以外の全員に 1 回目を送ります。
6. 太平洋時間の午前 6 時ごろ、南北アメリカに 2 回目を送ります。
7. 翌日、リストにお礼を伝え、登録して定着した人をどの ref 値が連れてきたかを比べます。

Ikiform は各登録の国を記録するので、フォームに質問を追加しなくても分けられます。国が不明な人は 2 回目に入れます。

## フォーム

[メインのガイド](https://ikiform.com/ja/guides/waitlist.md#form)のメールアドレスだけのフォームから始めて、2 つ追加します。ローンチ日のメールを希望するかを尋ねるチェックボックスと、訪問者が来たリンクから埋める非表示の `ref` です。

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

- チェックボックスは最初はオフです。ローンチ日のメールは先行アクセスとは別物なので、本人にオプトインしてもらいます。Ikiform は登録のタイムスタンプとともに `true` か `false` を保存します。
- スクリプトは `?ref=` または `?utm_source=` を非表示の入力欄にコピーし、英数字、`-`、`_` 以外の文字を取り除きます。どちらもなければ、`ref` は `direct` のままです。
- Product Hunt はたいていローンチページのリンクに `ref=producthunt` を付けるので、ローンチ日の登録は自動的にタグ付けされます。

フォームの **Fields** タブでフィールドを定義します。すると Ikiform はメールアドレスのない送信を拒否し、チェックボックスを本物の `true` か `false` として保存し、`ref` を 40 文字までに制限するので、誰も詰め込めなくなります。

`フィールド`:

```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 } }
  ]
}
```

### チャネルごとに 1 つの ref

どこかでリンクを共有する前に値を決め、毎回同じ値を使いましょう:

| 共有する場所 | リンク | 保存される ref |
| --- | --- | --- |
| 自分の X や Bluesky の投稿 | `example.com/?ref=x` | `x` |
| LinkedIn | `example.com/?ref=linkedin` | `linkedin` |
| Indie Hackers などのコミュニティ投稿 | `example.com/?ref=ih` | `ih` |
| 自分のニュースレターやブログ | `example.com/?utm_source=newsletter` | `newsletter` |
| 自分の Product Hunt のローンチページ | Product Hunt が付与 | `producthunt` |

## ローンチのトラフィックに備えてフォームを準備する

デフォルトの制限は、静かなローンチ前のページ向けです。ローンチ日は静かではありません。訪問者 1 人あたり 1 分に 5 件は十分ですが、フォーム全体では 1 分あたり 300 件が上限です。トップページに載るローンチでは、忙しい 1 分間にそれ以上の登録が来ることがあります。

- 前日にフォームの設定を開き、Custom の[レート制限](https://ikiform.com/ja/docs/rate-limits.md)を選んでフォームの上限を引き上げます。ローンチ週が終わったら元に戻してください。
- ミートアップやコワーキングスペースでデモをするなら、全員が 1 つの IP を共有します。その日は Relaxed を選んでください。
- 拒否された送信には `429 rate_limited` と `Retry-After` ヘッダーが返ります。プレーンな HTML フォームでは、戻るリンク付きの Ikiform のエラーページが表示されます。
- ローンチ当日にボットが来たら、**Spam check** で人間確認をオンにします。プレーンなフォームは変更不要です。[スパム対策](https://ikiform.com/ja/docs/spam.md#human-check) を参照してください。

## ローンチメールを 2 回に分けて送る

ローンチの 1 週間前に [REST API](https://ikiform.com/ja/docs/api.md#list-submissions) でリストを読み取り、分割します。このスクリプトは、メールアドレスごとに最新の登録だけを残し、チェックボックスにチェックしなかった人を除外して、Ikiform が記録した国ごとに 2 つの CSV ファイルを書き出します。`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`);
}
```

- 登録は新しい順に届くので、2 回登録した人は最新の回答で判断されます。2 回目にチェックを外していれば、その人は対象外になります。
- 両方のファイルを別々のセグメントとしてメールツールにインポートし、送信を予約します。第 1 弾は太平洋時間の午前 0 時 1 分の数分後、第 2 弾は太平洋時間の午前 6 時ごろです。
- ローンチ前夜にもう一度実行して、最後の 1 週間の登録を取り込みます。

### ローンチ当日のメール

配信停止やバウンスが処理されるよう、メールツールから送ります。まずプロダクトを紹介し、ローンチページへのリンクはその次に置き、投票ではなくコメントをお願いします:

`ローンチ当日のメール`:

```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 はフォームに入力した人にはメールを送りません。通知メールが届くのはあなたとチームだけなので、自動返信、確認メール、ダブルオプトインはありません。それらは [Webhook](https://ikiform.com/ja/docs/webhooks.md) をきっかけにメールツールから送ってください。登録した瞬間にウェルカムメールを送りたい場合は、登録を Webhook でメールツールに転送します。中継の方法は[メインのガイド](https://ikiform.com/ja/guides/waitlist.md#confirm)にあります。

## ローンチの翌日

**Export CSV** で直近 7 日に絞ってリストをもう一度エクスポートし、`ref` ごとに登録数を数えます。のちにサインインした人を連れてきたチャネルが、次のローンチ投稿を出す場所です。ローンチ当日に登録した人には、メールツールから短いお礼を送りましょう。Product Hunt であなたを知ったばかりで、まだ何も連絡を受けていません。

## 動作を確認する

これはローンチ当夜ではなく、1 週間前に行います。

1. フォームの **Allowed domains** に、自分のサイトのドメインと、開発中は `localhost` を追加します。空にしておくと、どこからの送信も受け付けます。
2. `?ref=x` を付けてページを開き、送信します。送信データの `ref` は `x`、`launch_reminder` は `false` になります。
3. チェックボックスにチェックを入れ、クエリ文字列なしでもう一度送信します。`ref` は `direct`、`launch_reminder` は `true` になります。
4. ダッシュボードで **Submissions** を開きます。送ったすべてのフィールドを含む新しい送信データがあります。
5. 分割スクリプトを実行し、各テストアドレスがその国に対応するファイルに入っていることを確認します。
6. 何も届かない場合は、ダッシュボードのステータスフィルターを **Spam** に切り替えてください。スパムにも本物の送信データと同じ成功の応答が返ります。

## ハマりどころ

| 問題 | 対処法 |
| --- | --- |
| `429 rate_limited` | 1 人の訪問者が、フォームのレート制限を超えて送信しました。Standard では訪問者ごとに 1 分あたり 5 件までです。`Retry-After` まで待つか、共有の 1 つの IP から送信するフォームには Relaxed か Custom を選んでください。 |
| `utm_source` などのパラメーターで Unknown field の `422` | 定義されているのは `ref` だけです。スクリプトは `utm_source` を送信せずに `ref` に読み込むので、別の hidden 入力欄を追加していないか確認してください。 |
| すべての登録で `ref` が `direct` になる | スクリプトがフォームより前に実行されているか、フォームの `id` が違います。スクリプトはフォームの後に置き、`id="launch-list"` のままにしてください。 |
| エクスポートで国が空になっている | Ikiform が訪問者の所在地を判別できませんでした。スクリプトは国が空の登録を朝の回に入れるので、南北アメリカの人には起きている時間に、それ以外の人にはその日の遅めの時間に届きます。 |
| 送信データはダッシュボードにあるのに、メールも Webhook も届かない | スパムとして保存されています。スパムは何も送りません。**Spam** フィルターで開いて理由を確認し、スパムではないとマークすると、メールと Webhook が送られます。 |

## よくある質問

### Product Hunt でローンチする何週間前からウェイトリストを始めるべきですか？

4〜6 週間あれば、いくつかの場所でページを共有し、どこが効果的かを知る時間が取れます。まだオーディエンスがいないなら、もっと早く始めましょう。最初のうちはリストはゆっくりしか増えません。

### ウェイトリストの人に Product Hunt での upvote を頼んでもいいですか？

いいえ。Product Hunt のルールでは upvote を頼むことが禁止されていて、頼むとローンチが失格になることがあります。代わりに、プロダクトを試して、変えてほしい点をコメントしてもらいましょう。ルールを守りつつ、活用できるフィードバックが得られます。

### ローンチメールは何時に送るべきですか？

ローンチは太平洋時間の午前 0 時 1 分に公開されます。その数分後に南北アメリカ以外の人へ第 1 弾を、太平洋時間の午前 6 時ごろに南北アメリカの人へ第 2 弾を送れば、ほとんどの人が朝に読めます。

### Ikiform は登録がどの国から来たかわかりますか？

たいていはわかります。各送信データには、可能な場合は訪問者の接続元の国が記録され、API と Webhook では meta.country として表示されます。空のこともあるので、目安として扱ってください。

### Ikiform は無料ですか？

いいえ、無料プランはありません。テストは無料で、支払う前に localhost からテスト送信を月 50 件まで送れます。本番運用には、500 件で月 $6 からの Pro か、買い切りで 10,000 件 $49、または 50,000 件 $149 を選べます。クレジットに有効期限はありません。

## その他のガイド

- [新しい SaaS のウェイトリスト](https://ikiform.com/ja/guides/waitlist.md): 自分のランディングページにローンチ前のウェイトリストを作ります。フォーム、スパム対策、重複、確認メール、ローンチ日のきれいなエクスポートまで扱います。
- [選考付きのベータ登録](https://ikiform.com/ja/guides/waitlist/beta-signup.md): サーバーが必須を強制する選考質問付きのベータ応募フォームと、応募者を採点してリストから各コホートを選ぶスクリプトを紹介します。
- [プレーンな HTML のウェイトリスト](https://ikiform.com/ja/guides/waitlist/html.md): ビルド不要でプレーンな HTML だけのウェイトリストページ。JavaScript がオフでも動き、読み込めばその場でお礼を表示し、必要なときはフォールバックします。
- [Framer のウェイトリスト](https://ikiform.com/ja/guides/waitlist/framer.md): Framer でウェイトリストの登録を集める 2 つの方法。Ikiform への Webhook を使う Framer のフォームか、訪問者ごとの制限とスパムチェックが残るコードコンポーネントです。
- [モバイルアプリのウェイトリスト](https://ikiform.com/ja/guides/waitlist/mobile-app.md): 使っているスマホを尋ね、iPhone のテスターを TestFlight に送り、Play のクローズドテストを埋める、iOS・Android アプリ向けの公開前ウェイトリストです。
- [Next.js のウェイトリスト](https://ikiform.com/ja/guides/waitlist/nextjs.md): Next.js App Router のウェイトリスト。シークレットキーで登録を転送するサーバーアクション、useActionState、楽観的なサンクス表示、訪問者ごとの制限を扱います。
