# Cara membuat halaman daftar tunggu untuk aplikasi mobile sebelum rilis di App Store

> Daftar tunggu pra-peluncuran untuk aplikasi iOS atau Android yang menanyakan ponsel yang dipakai, mengirim penguji iPhone ke TestFlight, dan mengisi closed test Play.

Terbit 2026-10-25 · https://ikiform.com/id/guides/waitlist/mobile-app

Pasang formulir daftar tunggu di landing page aplikasi Anda yang menanyakan ponsel apa yang dipakai dan apakah mereka ingin menguji lebih awal. Kirim penguji iPhone ke grup TestFlight dengan webhook dan App Store Connect API, lalu muat penguji Android ke closed test Google Play dari hasil ekspor. Di hari peluncuran, kirim email ke setiap kelompok berisi link ke store masing-masing.

Sebelum aplikasi ada di store, belum ada tombol instal untuk orang-orang. Daftar tunggu di landing page Anda sendiri menjaga minat mereka sampai tombol itu ada, dan menjalankan tugas kedua yang tidak dilakukan store: menemukan penguji yang Anda butuhkan sebelum peluncuran.

## Apa bedanya untuk aplikasi mobile

- **Dua store, dua daftar.** Email peluncuran mengarah ke App Store atau Google Play, dan undangan pengujian lewat TestFlight atau closed test Play. Anda perlu tahu platform setiap orang untuk mengirim yang tepat.
- **Penguji harus cocok dengan akun store.** TestFlight mengirim undangan lewat email ke alamat mana pun. Closed test Play hanya mengizinkan akun Google yang ada di daftarnya, jadi penguji Android yang mendaftar dengan alamat kantor tidak bisa menginstal build-nya.
- **Google Play mungkin mewajibkan penguji sebelum peluncuran.** Akun developer pribadi yang dibuat setelah 13 November 2023 harus menjalankan closed test dengan minimal 12 penguji yang tetap ikut selama 14 hari berturut-turut sebelum bisa merilis ke production. Daftar tunggu adalah sumber 12 orang itu.
- **Store punya tool pra-peluncuran sendiri.** Tool itu layak dipakai bersama daftar tunggu, bukan sebagai penggantinya. Lihat perbandingan di bawah.

|   | Pre-order App Store atau pra-registrasi Play | Daftar tunggu Anda sendiri |
| --- | --- | --- |
| Butuh listing di store | Ya, disetujui dan siap | Tidak. Berfungsi sejak hari pertama landing page |
| Yang Anda dapat | Jumlah, serta notifikasi store atau unduhan otomatis saat rilis | Email, platform, dan jawaban setiap orang |
| Bisa mengundang penguji | Tidak | Ya, lewat email ke TestFlight atau closed test Play |
| Batasan | Pra-registrasi Play tetap nonaktif untuk akun pribadi baru sampai syarat pengujian terpenuhi | Anda mengirim email peluncuran sendiri |

## Field untuk daftar tunggu aplikasi

Tanyakan platform lebih dulu, karena itu mengubah arti field email. Model ponsel opsional dan memberi tahu Anda perangkat mana yang perlu diuji. Kotak beta memisahkan orang yang ingin menguji dari orang yang hanya ingin email peluncuran.

Formulir: App waitlist

- **Email** (`email`, email, wajib)
- **Nama depan** (`first_name`, text)
- **Ponsel apa yang Anda pakai?** (`platform`, radio, wajib)
- **Model ponsel** (`device`, text)
- **Undang saya untuk menguji aplikasi sebelum rilis** (`beta`, checkbox)

Radio `platform` wajib diisi, jadi setiap pendaftaran masuk ke daftar yang bisa Anda tindak lanjuti. Tempel definisinya di tab **Fields** formulir.

## Formulirnya

Formulir berfungsi sebagai HTML biasa di landing page mana pun. Skripnya melakukan dua hal kecil: memilih platform lebih dulu berdasarkan browser pengunjung, dan menampilkan petunjuk akun Google hanya untuk pengguna Android.

`index.html`:

```html
<form id="app-waitlist" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <fieldset>
    <legend>Which phone do you use?</legend>
    <label><input type="radio" name="platform" value="iphone" required> iPhone</label>
    <label><input type="radio" name="platform" value="android"> Android</label>
  </fieldset>

  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" inputmode="email" required>
  <p id="email-hint" hidden>Use the Google account you sign in to Google Play with.</p>

  <label for="first_name">First name</label>
  <input id="first_name" name="first_name" autocomplete="given-name" maxlength="60">

  <label for="device">Phone model</label>
  <input id="device" name="device" maxlength="80" placeholder="iPhone 15, Pixel 8">

  <label><input type="checkbox" name="beta" value="true"> Invite me to test the app before launch</label>
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>
  <button>Join the waitlist</button>
</form>

<script>
  const form = document.getElementById("app-waitlist");
  const agent = navigator.userAgent;
  const guess = /iPhone|iPad/.test(agent) ? "iphone" : /Android/.test(agent) ? "android" : null;
  if (guess) form.querySelector(`[name="platform"][value="${guess}"]`).checked = true;
  const hint = () => {
    document.getElementById("email-hint").hidden = form.platform.value !== "android";
  };
  form.addEventListener("change", hint);
  hint();
</script>
```

- Tebakan ini hanya memilih radio lebih dulu. Orang bisa mengubahnya, dan tanpa skrip tidak ada yang terpilih, jadi `required` memaksa mereka memilih.
- `inputmode="email"` dan `autocomplete="email"` lebih penting di sini daripada di mana pun: kebanyakan pengunjung landing page aplikasi memakai ponsel.
- Atur **Redirect after submit** ke halaman terima kasih yang menjelaskan langkah berikutnya untuk setiap platform. Untuk versi framework dari formulir ini, lihat [panduan utama](https://ikiform.com/id/guides/waitlist.md#form) dan tambahkan field-field ini.

## Arahkan penguji ke setiap store

Diagram: Bagaimana penguji iPhone dan Android sampai ke beta di setiap store

1. Pengguna iPhone yang mencentang kotak beta memicu webhook bertanda tangan.
2. Relay Anda memverifikasinya dan memanggil App Store Connect API untuk menambahkan alamatnya ke grup TestFlight.
3. Apple mengirim undangan TestFlight lewat email begitu grup punya build yang tersedia.
4. Penguji Android dikumpulkan dengan cara yang sama, lalu diekspor sebagai CSV dan difilter berdasarkan platform.
5. Anda menempelkan akun Google ke daftar email closed test di Play Console.
6. Anda mengirimi mereka link opt-in pengujian dari tool email Anda.

Apple punya API untuk penguji; closed test Google Play dikelola di Play Console atau lewat Google Groups, jadi sisi Android berupa ekspor mingguan.

### iPhone: tambahkan penguji ke TestFlight

Di App Store Connect, buat grup pengujian eksternal dan API key di **Users and Access** › **Integrations**, dengan peran App Manager atau Admin. Lalu tambahkan relay yang mendengarkan webhook `submission.created` dari Ikiform. Contoh ini adalah route handler Next.js dan memakai `jose` untuk menandatangani token Apple; relay ini berjalan di server mana pun yang punya `fetch`.

`app/api/testflight/route.ts`:

```ts
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";
import { importPKCS8, SignJWT } from "jose";

async function appStoreToken() {
  const key = await importPKCS8(process.env.ASC_PRIVATE_KEY!, "ES256");
  return new SignJWT({})
    .setProtectedHeader({ alg: "ES256", kid: process.env.ASC_KEY_ID!, typ: "JWT" })
    .setIssuer(process.env.ASC_ISSUER_ID!)
    .setAudience("appstoreconnect-v1")
    .setIssuedAt()
    .setExpirationTime("15m")
    .sign(key);
}

export async function POST(request: Request) {
  const payload = await request.text();
  try {
    const event = await verifyWebhook({ payload, headers: request.headers, secret: process.env.IKIFORM_WEBHOOK_SECRET! });
    if (event.type !== "submission.created") return new Response(null, { status: 204 });
    const { email, first_name, platform, beta } = event.data.fields;
    if (platform !== "iphone" || beta !== true) return new Response(null, { status: 204 });

    const response = await fetch("https://api.appstoreconnect.apple.com/v1/betaTesters", {
      method: "POST",
      headers: { authorization: `Bearer ${await appStoreToken()}`, "content-type": "application/json" },
      body: JSON.stringify({
        data: {
          type: "betaTesters",
          attributes: { email: String(email), firstName: first_name ? String(first_name) : undefined },
          relationships: { betaGroups: { data: [{ type: "betaGroups", id: process.env.ASC_BETA_GROUP_ID! }] } },
        },
      }),
    });
    if (response.ok || response.status === 409) return new Response(null, { status: 204 });
    return new Response(`App Store Connect answered ${response.status}`, { status: 502 });
  } catch (error) {
    if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
    throw error;
  }
}
```

- `ASC_PRIVATE_KEY` adalah isi file `.p8` yang diberikan Apple, termasuk baris barunya. `ASC_KEY_ID` dan `ASC_ISSUER_ID` ada di halaman yang sama.
- Token Apple berlaku paling lama 20 menit, jadi relay menandatangani token baru untuk setiap pengiriman.
- `409` berarti Apple menolak perubahan karena konflik, sering kali karena alamat itu sudah menjadi penguji. Relay menganggapnya selesai, jadi jika seorang penguji tidak pernah mendapat undangan, periksa grupnya di App Store Connect. Kegagalan lain dijawab `502`, sehingga Ikiform mencoba ulang pengirimannya.
- TestFlight mengizinkan hingga 10.000 penguji eksternal per aplikasi. Build pertama yang Anda berikan ke grup eksternal melewati Beta App Review, dan setiap build kedaluwarsa setelah 90 hari.

Tambahkan URL relay di **Webhooks** di Ikiform dan salin secret `whsec_` ke `IKIFORM_WEBHOOK_SECRET`. Satu workspace bisa punya 3 endpoint, jadi relay ini bisa berjalan berdampingan dengan relay yang mengisi tool email Anda.

### Android: isi closed test

API publikasi Google Play mengelola penguji closed test lewat Google Groups, bukan alamat satu per satu, jadi sisi ini berupa ekspor mingguan. Ekspor daftar dengan **Export CSV**, filter di spreadsheet ke `platform` = `android` dan `beta` = `true`, lalu tambahkan email-emailnya ke daftar email closed test di **Test and release** › **Testing** › **Closed testing** › **Manage track** › **Testers** di Play Console. Lalu kirimi orang-orang itu link opt-in pengujian dari tool email Anda.

Jika Anda sedang memenuhi syarat 12 penguji, undang lebih dari 12. Orang yang keluar atau tidak pernah ikut tidak dihitung, dan 14 hari itu membutuhkan 12 penguji yang ikut sepanjang waktu.

> Ikiform tidak mengirim email ke orang yang mengisi formulir. Email notifikasi hanya dikirim ke Anda dan tim Anda, jadi tidak ada autoresponder, email konfirmasi, atau double opt-in. Kirim semua itu dari tool email Anda, dipicu oleh [webhook](https://ikiform.com/id/docs/webhooks.md). TestFlight mengirim undangannya sendiri, jadi penguji iPhone mendapat kabar dari Apple. Penguji Android hanya mendapat kabar dari Anda.

## Hari peluncuran

Ekspor seluruh daftar dan bagi berdasarkan `platform`. Kirimi setiap bagian satu email dengan satu link store. Orang yang memilih iPhone tidak butuh link Play, dan satu email dengan dua badge mengurangi ketukan di layar kecil. Jika Anda mengumpulkan `device`, cocokkan laporan crash Anda dengan model yang disebutkan orang sebelum mengirim.

## Pastikan berfungsi

1. Di **Allowed domains** formulir, tambahkan domain situs Anda, ditambah `localhost` selama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja.
2. Buka halaman di ponsel. Platform yang tepat sudah terpilih, dan di Android petunjuk akun Google muncul.
3. Kirim sebagai penguji iPhone. Kiriman menampilkan `platform` sebagai `iphone` dan `beta` sebagai `true`.
4. Buka endpoint relay di **Webhooks**. Pengirimannya menampilkan `succeeded`, dan alamatnya tercantum di grup TestFlight Anda.
5. Kirim sebagai penguji Android, ekspor CSV, dan pastikan barisnya tersaring dengan `platform` bernilai `android`.
6. Kirim dengan honeypot terisi, `_gotcha=bot`. Kiriman tetap mendapat jawaban sukses, tetapi disimpan sebagai spam dan tidak memicu email atau webhook.

## Jebakan

| Masalah | Yang harus dilakukan |
| --- | --- |
| Pengiriman relay gagal dengan `502` dan Apple menjawab `401` | Token-nya salah: periksa key id, issuer id, dan pastikan private key tetap mempertahankan baris barunya di environment variable. |
| Penguji sudah ditambahkan tetapi tidak menerima email TestFlight | Grup belum punya build, atau build pertama masih dalam Beta App Review. Undangan dikirim begitu build tersedia untuk grup. |
| Penguji Android tidak bisa membuka link opt-in | Alamat di daftar bukan akun Google yang dipakai masuk di ponselnya. Minta mereka mendaftar lagi dengan akun tersebut. |
| `422 validation_failed` | Kiriman tidak cocok dengan definisi field formulir. `error.fields` menyebutkan setiap field dan alasannya. Samakan `name` input dengan ID field. |
| Kiriman ada di dashboard tetapi tidak ada email atau webhook yang datang | Kiriman itu disimpan sebagai spam. Spam tidak memicu apa pun. Buka di filter **Spam** untuk melihat alasannya, dan tandai sebagai bukan spam untuk mengirim email dan webhook-nya. |

## Pertanyaan

### Apakah saya butuh daftar tunggu jika App Store punya pre-order?

Keduanya punya fungsi berbeda. Pre-order dan pra-registrasi Play butuh listing store yang sudah disetujui dan hanya memberi Anda jumlah, bukan kontak. Daftar tunggu berfungsi sejak hari pertama, memberi Anda email dan platform setiap orang, dan memungkinkan Anda mengundang penguji.

### Bagaimana cara menemukan 12 penguji untuk syarat closed testing Google Play?

Mintalah di daftar tunggu Anda. Checkbox beta dan pertanyaan platform menunjukkan siapa yang punya ponsel Android dan ingin menguji. Masukkan akun Google mereka ke daftar email closed test dan kirimi mereka link opt-in.

### Bisakah Ikiform menambahkan penguji ke TestFlight secara otomatis?

Tidak secara langsung. Ikiform mengirim webhook bertanda tangan untuk setiap pendaftaran, dan relay singkat yang Anda deploy menambahkan alamatnya ke grup TestFlight lewat App Store Connect API, seperti di atas.

### Bisakah Ikiform mengirim email ke orang yang mengirim formulir?

Tidak. Ikiform mengirim email ke Anda dan tim Anda, bukan ke pengirim, jadi tidak ada autoresponder atau email konfirmasi. Kirim webhook ke tool email Anda dan kirim konfirmasinya dari sana.

### Apakah Ikiform gratis?

Tidak, tidak ada paket gratis. Pengujian gratis: Anda bisa mengirim 50 kiriman uji per bulan dari localhost sebelum membayar. Untuk go live, Pro mulai $6/bln untuk 500 kiriman, atau Anda bisa bayar sekali untuk 10.000 kiriman seharga $49 atau 50.000 kiriman seharga $149, dengan kredit yang tidak pernah kedaluwarsa.

## Panduan lainnya

- [Daftar tunggu untuk SaaS baru](https://ikiform.com/id/guides/waitlist.md): Bangun daftar tunggu pra-peluncuran di landing page Anda sendiri: formulir, perlindungan spam, duplikat, email konfirmasi, dan ekspor rapi di hari peluncuran.
- [Pendaftaran beta dengan penyaringan](https://ikiform.com/id/guides/waitlist/beta-signup.md): Formulir lamaran beta dengan pertanyaan penyaringan yang ditegakkan server, dan skrip yang menilai pelamar serta memilih setiap kohort dari daftar.
- [Daftar peluncuran Product Hunt](https://ikiform.com/id/guides/waitlist/product-hunt.md): Kumpulkan daftar peluncuran berminggu-minggu sebelum Product Hunt, tandai setiap pendaftaran per channel, dan kirim email hari-H dalam dua gelombang mengikuti reset waktu Pasifik.
- [Daftar tunggu dengan HTML biasa](https://ikiform.com/id/guides/waitlist/html.md): Halaman daftar tunggu lengkap tanpa build dengan HTML biasa yang tetap berfungsi saat JavaScript mati, menampilkan ucapan terima kasih inline saat skrip dimuat, dan punya fallback bila perlu.
- [Daftar tunggu Next.js](https://ikiform.com/id/guides/waitlist/nextjs.md): Daftar tunggu Next.js App Router: server action yang meneruskan pendaftaran dengan secret key, useActionState, terima kasih optimistis, dan batas per pengunjung.
- [Daftar tunggu di Framer](https://ikiform.com/id/guides/waitlist/framer.md): Dua cara mengumpulkan pendaftaran daftar tunggu di Framer: formulir Framer dengan webhook ke Ikiform, atau code component yang mempertahankan batas per pengunjung dan pemeriksaan spam.
