新しい SaaS のウェイトリスト

新しい SaaS のウェイトリスト2 分で読めます

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

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

Preet SutharIkiform 創業者

ローンチの 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 ローンチリスト事前ローンチ日(太平洋時間)6〜4週間前ページ公開、チャネルごとのref1 週間前エクスポート、重複除去、2回に分割前日フォーム全体の制限を引き上げ12:01a.m.ローンチ公開1 回目ヨーロッパ、アフリカ、アジア、オセアニア6 a.m.2 回目:南北アメリカ翌日お礼、refを比較毎週共有数分最初の登録から翌日までの Product Hunt ローンチリスト事前ローンチ日(太平洋時間)6〜4 週間前ページ公開、チャネルごとの ref1 週間前エクスポート、重複除去、2 回に分割前日フォーム全体の制限を引き上げ12:01 a.m.ローンチ公開1 回目ヨーロッパ、アフリカ、アジア、オセアニア6 a.m.2 回目: 南北アメリカ翌日お礼、ref を比較毎週共有数分
  1. 4〜6 週間前に、フォームを載せたページを公開し、共有するチャネルごとに独自の ref 値を割り当てます。
  2. 1 週間前に、リストをエクスポートして重複を取り除き、オプトインした人を国ごとに 2 つのグループに分けます。
  3. 前日に、フォーム全体の制限を引き上げて、ローンチのトラフィックを取りこぼさないようにします。
  4. 太平洋時間の午前 0 時 1 分にローンチが公開されます。
  5. 数分後、朝か午後を迎えている南北アメリカ以外の全員に 1 回目を送ります。
  6. 太平洋時間の午前 6 時ごろ、南北アメリカに 2 回目を送ります。
  7. 翌日、リストにお礼を伝え、登録して定着した人をどの ref 値が連れてきたかを比べます。
Ikiform は各登録の国を記録するので、フォームに質問を追加しなくても分けられます。国が不明な人は 2 回目に入れます。

フォーム

メインのガイドのメールアドレスだけのフォームから始めて、2 つ追加します。ローンチ日のメールを希望するかを尋ねるチェックボックスと、訪問者が来たリンクから埋める非表示の ref です。

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

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

フィールド
{
  "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=xx
LinkedInexample.com/?ref=linkedinlinkedin
Indie Hackers などのコミュニティ投稿example.com/?ref=ihih
自分のニュースレターやブログexample.com/?utm_source=newsletternewsletter
自分の Product Hunt のローンチページProduct Hunt が付与producthunt

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

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

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

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

ローンチの 1 週間前に REST API でリストを読み取り、分割します。このスクリプトは、メールアドレスごとに最新の登録だけを残し、チェックボックスにチェックしなかった人を除外して、Ikiform が記録した国ごとに 2 つの CSV ファイルを書き出します。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`);
}
  • 登録は新しい順に届くので、2 回登録した人は最新の回答で判断されます。2 回目にチェックを外していれば、その人は対象外になります。
  • 両方のファイルを別々のセグメントとしてメールツールにインポートし、送信を予約します。第 1 弾は太平洋時間の午前 0 時 1 分の数分後、第 2 弾は太平洋時間の午前 6 時ごろです。
  • ローンチ前夜にもう一度実行して、最後の 1 週間の登録を取り込みます。

ローンチ当日のメール

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

ローンチ当日のメール
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 をきっかけにメールツールから送ってください。登録した瞬間にウェルカムメールを送りたい場合は、登録を Webhook でメールツールに転送します。中継の方法はメインのガイドにあります。

ローンチの翌日

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_limited1 人の訪問者が、フォームのレート制限を超えて送信しました。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 が送られます。

よくある質問

手順で詰まったときや、あなたの状況に合うガイドがほしいときはメールでどうぞ: hello@ikiform.com