# Product Hunt 출시를 위한 사전 이메일 리스트 만드는 방법

> Product Hunt 몇 주 전부터 출시 리스트를 모으고, 가입마다 채널 태그를 달고, 태평양 시간 리셋에 맞춰 출시일 이메일을 두 번에 나눠 보냅니다.

2026-10-25 게시 · https://ikiform.com/ko/guides/waitlist/product-hunt

출시 4~6주 전부터 내 페이지에서 이메일을 모으고, 숨겨진 유입 경로 필드를 둬서 가입이 어느 채널에서 왔는지 알 수 있게 하세요. 출시일 이메일 수신에 동의를 받고, 출시 일주일 전에 목록을 내보내 두 번에 나눠 보내세요. 한 번은 태평양 시간 오전 12시 1분에 Product Hunt의 하루가 시작된 직후, 한 번은 미주 지역의 아침에 보냅니다.

Product Hunt 출시는 날짜가 정해져 있고 24시간 안에 끝납니다. 제품을 써 보고 성의 있는 댓글을 남길 가능성이 가장 높은 사람은 여러분의 소식을 받겠다고 한 사람들이므로, 출시 게시물보다 목록이 더 중요합니다. 이 페이지는 그 하루를 위해 목록을 만들 때 달라지는 점을 다룹니다.

## Product Hunt 리스트가 다른 점

- **마감일이 정해져 있습니다.** 일반 대기자 명단은 제품이 준비될 때까지 기다릴 수 있습니다. 여기서는 몇 주 전에 정한 날짜 전에 목록을 내보내고, 정리하고, 이메일 도구에 넣어야 합니다.
- **하루는 태평양 시간 기준입니다.** 출시는 PT 오전 12시 1분에 공개되어 그날의 순위를 다툽니다. 목록에는 모든 시간대의 사람이 있으므로, 한 시각에 한 번 보내면 절반은 자고 있을 때 받게 됩니다.
- **부탁할 것은 투표가 아니라 피드백입니다.** Product Hunt 규칙은 업보트 요청을 금지하며, 요청하면 출시가 실격될 수 있습니다. 목록의 사람들에게 제품을 써 보고 무엇을 바꾸고 싶은지 댓글로 남겨 달라고 하세요. 규칙 안에 있고, 어차피 숫자보다 댓글이 더 좋아 보입니다.
- **출시일에는 트래픽이 급증합니다.** Product Hunt 방문자가 사이트에 들어와 몇 분 간격으로 가입합니다. 몇 주 동안 문제가 없던 폼 한도가 몇 시간 동안은 문제가 될 수 있습니다.

다이어그램: 첫 가입부터 출시 다음 날까지의 Product Hunt 출시 리스트

1. 4~6주 전에 폼이 있는 페이지를 공개하고, 공유하는 채널마다 고유한 ref 값을 줍니다.
2. 일주일 전에 목록을 내보내고, 중복을 지우고, 동의한 사람들을 국가별로 두 차례로 나눕니다.
3. 전날 폼 전체 한도를 올려 출시 트래픽이 거부되지 않게 합니다.
4. 태평양 시간 오전 12시 1분에 출시가 공개됩니다.
5. 몇 분 뒤, 아침이나 오후 시간대인 미주 외 지역 모두에게 1차 발송을 합니다.
6. 태평양 시간 오전 6시쯤 미주 지역에 2차 발송을 합니다.
7. 다음 날 목록에 감사 인사를 보내고, 가입 후 계속 사용한 사람들을 데려온 ref 값을 비교합니다.

Ikiform은 가입마다 국가를 기록하므로, 나누는 데 폼에 질문을 추가할 필요가 없습니다. 국가를 알 수 없는 사람은 2차 발송에 넣습니다.

## 폼

[메인 가이드](https://ikiform.com/ko/guides/waitlist.md#form)의 이메일 전용 폼에서 시작해 두 가지를 추가하세요. 출시일 이메일 수신을 묻는 체크박스와, 사람들이 들어온 링크에서 값을 채우는 숨겨진 `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이 이메일이 없는 POST를 거부하고, 체크박스를 실제 `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 } }
  ]
}
```

### 채널마다 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` |

## 출시 트래픽에 대비해 폼 준비하기

기본 한도는 조용한 출시 전 페이지에 맞춰져 있습니다. 출시일은 조용하지 않습니다. 방문자마다 분당 5회 POST할 수 있어 충분하지만, 폼 전체는 분당 300회로 제한됩니다. 첫 페이지에 오른 출시는 바쁜 1분 동안 그보다 많은 가입을 보낼 수 있습니다.

- 전날 폼 설정을 열고 폼 한도를 더 높인 Custom [레이트 리밋](https://ikiform.com/ko/docs/rate-limits.md)을 고르세요. 출시 주가 지나면 되돌리세요.
- 밋업이나 코워킹 스페이스에서 데모를 한다면 모두가 IP 하나를 공유합니다. 그날은 Relaxed를 고르세요.
- 거부된 POST는 `429 rate_limited`와 `Retry-After` 헤더를 받습니다. 일반 HTML 폼에서는 돌아가기 링크가 있는 Ikiform 오류 페이지가 표시됩니다.
- 출시일에 봇이 몰리면 **Spam check**에서 사람 확인을 켜세요. 일반 폼은 바꿀 필요가 없습니다. [스팸 방지](https://ikiform.com/ko/docs/spam.md#human-check)를 참고하세요.

## 출시 이메일을 두 차례로 나누기

출시 일주일 전에 [REST API](https://ikiform.com/ko/docs/api.md#list-submissions)로 목록을 읽어 나누세요. 이 스크립트는 이메일마다 가장 최근 가입만 남기고, 체크박스를 선택하지 않은 사람은 빼고, Ikiform이 기록한 국가별로 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`);
}
```

- 가입은 최신순으로 오므로, 두 번 가입한 사람은 마지막 답변을 기준으로 판단합니다. 두 번째에 체크를 해제했다면 제외됩니다.
- 두 파일을 이메일 도구에 별도 세그먼트로 가져와 예약하세요. 1차는 태평양 시간 오전 12시 1분 몇 분 뒤, 2차는 태평양 시간 오전 6시쯤입니다.
- 출시 전날 밤에 한 번 더 실행해 마지막 주의 가입을 반영하세요.

### 출시일 이메일

수신 거부와 반송이 처리되도록 이메일 도구에서 보내세요. 제품을 먼저 소개하고, 출시 페이지 링크는 그다음에 두고, 투표가 아니라 댓글을 부탁하세요.

`출시일 이메일`:

```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은 폼을 작성한 사람에게 이메일을 보내지 않습니다. 알림 이메일은 여러분과 팀에게만 가므로 자동 응답, 확인 이메일, 더블 옵트인이 없습니다. 이런 이메일은 [웹훅](https://ikiform.com/ko/docs/webhooks.md)을 트리거로 이메일 도구에서 보내세요. 가입하는 즉시 환영 이메일을 보내고 싶다면 가입을 웹훅으로 이메일 도구에 전달하세요. [메인 가이드](https://ikiform.com/ko/guides/waitlist.md#confirm)에 릴레이가 나와 있습니다.

## 출시 다음 날

**Export CSV**로 최근 7일만 필터링해 목록을 다시 내보내고, `ref`별로 가입 수를 세세요. 나중에 실제로 로그인한 사람들을 데려온 채널이 다음 출시 게시물을 올릴 곳입니다. 출시일에 가입한 사람들에게는 이메일 도구로 짧은 감사 인사를 보내세요. Product Hunt를 통해 여러분을 알게 되었고 아직 여러분에게서 아무 소식도 받지 못했습니다.

## 작동 확인하기

출시 당일 밤이 아니라 일주일 전에 하세요.

1. 폼의 **Allowed domains**에 사이트 도메인을 추가하고, 개발 중에는 `localhost`도 추가하세요. 비워 두면 어디서 온 POST든 받습니다.
2. `?ref=x`로 페이지를 열고 제출하세요. 제출에 `ref`는 `x`로, `launch_reminder`는 `false`로 표시됩니다.
3. 체크박스를 선택하고 쿼리 문자열 없이 다시 제출하세요. `ref`는 `direct`, `launch_reminder`는 `true`가 됩니다.
4. 대시보드에서 **Submissions**를 여세요. 보낸 모든 필드가 담긴 새 제출이 있습니다.
5. 발송 분할 스크립트를 실행하고 각 테스트 주소가 국가에 맞는 파일에 들어 있는지 확인하세요.
6. 아무것도 안 왔나요? 대시보드의 상태 필터를 **Spam**으로 바꿔 보세요. 스팸도 실제 제출과 같은 성공 응답을 받습니다.

## 주의할 점

| 문제 | 해결 방법 |
| --- | --- |
| `429 rate_limited` | 한 방문자가 폼의 레이트 리밋보다 많이 보냈습니다. Standard는 방문자당 분당 5회를 허용합니다. `Retry-After`만큼 기다리거나, 공유 IP 하나에서 POST하는 폼이라면 Relaxed나 Custom을 고르세요. |
| `utm_source`나 다른 매개변수에 대해 Unknown field와 함께 `422` | `ref`만 정의되어 있습니다. 스크립트는 `utm_source`를 따로 보내지 않고 `ref`로 읽어 들이므로, 다른 숨겨진 입력을 추가하지 않았는지 확인하세요. |
| 모든 가입의 `ref`가 `direct`로 설정됨 | 스크립트가 폼보다 먼저 실행되거나 폼의 `id`가 다릅니다. 스크립트를 폼 뒤에 두고 `id="launch-list"`를 유지하세요. |
| 내보낸 파일에 국가가 비어 있음 | Ikiform이 방문자의 위치를 알 수 없었습니다. 스크립트는 국가가 빈 사람을 아침 발송에 넣으므로, 미주 지역은 깨어 있을 때, 다른 지역은 하루 중 늦은 시간에 받습니다. |
| 제출은 대시보드에 있는데 이메일이나 웹훅이 오지 않음 | 스팸으로 저장된 것입니다. 스팸은 아무것도 보내지 않습니다. **Spam** 필터에서 열어 이유를 확인하고, 스팸 아님으로 표시하면 이메일과 웹훅이 전송됩니다. |

## 질문

### Product Hunt 출시 전 대기자 명단은 얼마나 일찍 시작해야 하나요?

4~6주면 몇 군데에 페이지를 공유하고 어디가 효과적인지 알아볼 시간이 있습니다. 아직 청중이 없다면 더 일찍 시작하세요. 처음에는 목록이 천천히 늘어납니다.

### 대기자 명단에 Product Hunt 업보트를 부탁해도 되나요?

아니요. Product Hunt 규칙은 업보트 요청을 금지하며, 요청하면 출시가 실격될 수 있습니다. 제품을 써 보고 무엇을 바꾸고 싶은지 댓글을 남겨 달라고 하세요. 규칙을 지키면서 쓸모 있는 피드백도 얻을 수 있습니다.

### 출시 이메일은 몇 시에 보내야 하나요?

출시는 태평양 시간 오전 12시 1분에 공개됩니다. 몇 분 뒤 미주 외 지역 사람들에게 1차로 보내고, 태평양 시간 오전 6시쯤 미주 지역에 2차로 보내면 대부분이 아침에 읽게 됩니다.

### Ikiform은 가입이 어느 국가에서 왔는지 알 수 있나요?

대개는 그렇습니다. 각 제출은 가능한 경우 방문자 연결의 국가를 기록하며, API와 웹훅에 meta.country로 나타납니다. 비어 있을 수 있으니 참고용으로만 쓰세요.

### Ikiform은 무료인가요?

아니요, 무료 플랜은 없습니다. 테스트는 무료입니다. 결제 전에 localhost에서 매달 테스트 제출 50건을 보낼 수 있습니다. 실제 운영하려면 제출 500건에 월 $6부터인 Pro를 쓰거나, 한 번 결제로 제출 10,000건에 $49 또는 50,000건에 $149를 낼 수 있으며, 크레딧은 만료되지 않습니다.

## 가이드 더 보기

- [새 SaaS용 대기자 명단](https://ikiform.com/ko/guides/waitlist.md): 내 랜딩 페이지에 출시 전 대기자 명단을 만듭니다. 폼, 스팸 방지, 중복 처리, 확인 이메일, 출시일의 깔끔한 내보내기까지 다룹니다.
- [선별 기능이 있는 베타 신청](https://ikiform.com/ko/guides/waitlist/beta-signup.md): 서버가 강제하는 선별 질문이 있는 베타 신청 폼과, 지원자에게 점수를 매겨 목록에서 기수별 참가자를 고르는 스크립트입니다.
- [일반 HTML 대기자 명단](https://ikiform.com/ko/guides/waitlist/html.md): 빌드 없이 일반 HTML로 만든 완전한 대기자 명단 페이지로, JavaScript가 꺼져도 작동하고, 스크립트가 로드되면 인라인 감사 문구를 보여 주며, 필요할 때는 기본 방식으로 돌아갑니다.
- [Framer 대기자 명단](https://ikiform.com/ko/guides/waitlist/framer.md): Framer에서 대기자 명단 가입을 받는 두 가지 방법: 웹훅으로 Ikiform에 보내는 Framer 폼, 또는 방문자별 한도와 스팸 검사를 유지하는 코드 컴포넌트입니다.
- [모바일 앱 대기자 명단](https://ikiform.com/ko/guides/waitlist/mobile-app.md): iOS나 Android 앱의 출시 전 대기자 명단으로, 사용하는 휴대폰을 묻고 iPhone 테스터는 TestFlight로 보내고 Play 비공개 테스트를 채웁니다.
- [Next.js 대기자 명단](https://ikiform.com/ko/guides/waitlist/nextjs.md): Next.js App Router 대기자 명단: 시크릿 키로 가입을 전달하는 서버 액션, useActionState, 낙관적 감사 문구, 방문자별 한도를 다룹니다.
