# Kirim satu formulir ke beberapa alamat email

> Kirim email dari satu formulir ke seluruh tim, atau arahkan setiap pesan ke orang yang tepat berdasarkan topik, tanpa membiarkan formulir sendiri memilih siapa yang menerima email.

Terbit 2026-10-25 · https://ikiform.com/id/guides/send-form-to-email/multiple-recipients

Tambahkan setiap orang sebagai penerima formulir di dashboard: anggota workspace dengan mencentangnya, dan orang lain lewat link konfirmasi, hingga 10 alamat. Setiap orang mendapat salinan sendiri dari setiap kiriman. Untuk mengirim pertanyaan penjualan ke satu orang dan dukungan ke orang lain, lakukan perutean berdasarkan field di webhook.

## Apa yang berbeda di sini

Skrip PHP lama dan beberapa layanan formulir membiarkan formulir menentukan penerimanya sendiri, dengan field tersembunyi `to` atau `cc`. Itu praktis, dan begitu pula cara formulir kontak berubah menjadi relay spam: bot mengubah field tersembunyi itu dan server Anda mengirim email ke siapa pun yang diinginkannya, dari domain Anda. Ikiform tidak punya field penerima. Siapa yang menerima email diatur di dashboard, dan siapa pun di luar workspace harus mengonfirmasi terlebih dulu.

Itu menyisakan dua tugas berbeda, dan keduanya diselesaikan di tempat berbeda:

| Yang Anda inginkan | Tempat mengaturnya | Batas |
| --- | --- | --- |
| Semua orang menerima setiap kiriman | Penerima di pengaturan **Notifications** formulir | 10 alamat per formulir |
| Setiap kiriman sampai ke orang yang tepat | Webhook yang membaca field dan mengirim email ke satu tim | 3 endpoint webhook per workspace |

## Kirim setiap kiriman ke seluruh tim

Diagram: Satu kiriman, satu email per penerima

1. Formulir mengirim sekali ke Ikiform.
2. Ikiform menyusun daftar penerima: anggota yang dicentang untuk formulir ini, atau default workspace, ditambah alamat luar yang sudah mengonfirmasi.
3. Duplikat dibuang dan daftarnya berhenti di 10.
4. Setiap penerima mendapat email terpisah, jadi tidak ada yang melihat alamat penerima lain.
5. Alamat yang masih menunggu konfirmasi, dan alamat yang dijeda setelah bounce, dilewati.

Salinan terpisah berarti satu orang yang membalas tidak ikut menyertakan yang lain. Tentukan siapa menjawab apa sebelum Anda menambahkan lima orang.

1. Buka formulir di dashboard, lalu **Settings** dan **Notifications**. Pastikan **Email new submissions** menyala.
2. Centang setiap anggota workspace yang perlu menerima email. Hanya anggota dengan alamat terverifikasi yang tercantum.
3. Untuk siapa pun di luar workspace, masukkan alamatnya di **Add someone outside the workspace** lalu tekan **Send link**. Anda bisa menambahkan 5 per formulir.
4. Minta mereka mengonfirmasi. Sebelum itu, barisnya berstatus **Waiting for confirmation** dan mereka tidak menerima apa pun.

Penerima luar melihat field kiriman dan link berhenti berlangganan; mereka tidak mendapat link dashboard, karena tidak punya akun. Anggota mendapat tombol **View submission**. Jika seseorang keluar, hapus barisnya; jika mereka berhenti berlangganan, barisnya ikut terhapus.

> Butuh lebih dari 10 orang, atau tim yang sering berubah? Tambahkan satu alamat bersama, seperti Google Group atau alias email, sebagai satu-satunya penerima dan atur anggotanya di sana.

### Anggota dan alamat luar

Kedua jenis penerima berperilaku berbeda, yang penting saat Anda memutuskan siapa ditambahkan di mana:

|   | Anggota workspace | Alamat luar |
| --- | --- | --- |
| Ditambahkan dengan | Mencentangnya di formulir | **Send link**, lalu konfirmasi dari mereka |
| Yang terlihat di email | Field dan tombol **View submission** | Field dan link berhenti berlangganan |
| Bisa membuka dashboard | Ya | Tidak |
| Berhenti menerima email saat | Anda menghapus centangnya, atau mereka keluar dari workspace | Anda menghapus barisnya, atau mereka berhenti berlangganan |
| Dihitung terhadap | Batas 10 alamat | Batas 10 alamat dan 5 alamat luar per formulir |

Beri orang yang menjawab pesan kursi di workspace, agar mereka bisa melihat kiriman lama dan spam. Pakai alamat luar untuk orang yang hanya perlu tahu, seperti manajer atau inbox bersama.

## Arahkan setiap kiriman berdasarkan topik

Penerima tidak bisa bergantung pada pilihan pengunjung. Untuk itu, tambahkan field yang menyebut timnya, dan biarkan webhook handler kecil memilih alamatnya. Ini formulirnya:

`contact.html`:

```html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label for="department">Who should read this?</label>
  <select id="department" name="department" required>
    <option value="sales">Sales</option>
    <option value="support">Support</option>
    <option value="billing">Billing</option>
  </select>

  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required />

  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="5" required></textarea>

  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>
```

Definisikan `department` sebagai field `select` di dashboard, agar kiriman hanya bisa membawa `sales`, `support`, atau `billing`. Bot yang mengirim nilai lain mendapat `422 validation_failed` dan tidak pernah sampai ke handler Anda.

Lalu handler-nya. Handler memverifikasi tanda tangan, memilih tim dari `department`, dan mengirim lewat penyedia email Anda sendiri, di sini Resend. Karena Anda yang mengirim email, Anda juga memilih subjeknya:

`app/api/route-message/route.ts`:

```ts
import { Resend } from "resend";
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";

const resend = new Resend(process.env.RESEND_API_KEY);

const TEAMS: Record<string, string[]> = {
  sales: ["sales@example.com"],
  support: ["support@example.com", "oncall@example.com"],
  billing: ["accounts@example.com"],
};

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 fields = event.data.fields;
    const department = String(fields.department ?? "support");
    const { error } = await resend.emails.send(
      {
        from: "Website <forms@example.com>",
        to: TEAMS[department] ?? TEAMS.support,
        replyTo: typeof fields.email === "string" ? fields.email : undefined,
        subject: `[${department}] ${String(fields.name ?? "New message")}`,
        text: Object.entries(fields)
          .map(([key, value]) => `${key}: ${String(value)}`)
          .join("\n"),
      },
      { idempotencyKey: event.id },
    );
    if (error) return new Response(error.message, { status: 502 });
    return new Response(null, { status: 204 });
  } catch (error) {
    if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
    throw error;
  }
}
```

- Alamat-alamat itu ada di kode Anda, bukan di formulir. Pengunjung memilih nama tim, tidak pernah alamat.
- `replyTo` membuat **Reply** tetap mengarah ke pengunjung, sama seperti email milik Ikiform.
- `idempotencyKey: event.id` membuat pengiriman yang dicoba ulang tidak mengirim apa pun yang baru. Ikiform mencoba ulang pengiriman yang tidak mendapat `2xx`, dengan ID yang sama.
- `502` saat penyedia gagal memberi tahu Ikiform untuk mencoba lagi nanti, sehingga gangguan singkat tidak menghilangkan pesan.
- Departemen yang tidak dikenal atau kosong dialihkan ke support, alih-alih membuang pesannya.

Tambahkan URL di **Webhooks** pada dashboard dan salin secret `whsec_`-nya ke `IKIFORM_WEBHOOK_SECRET`. [Dokumentasi webhook](https://ikiform.com/id/docs/webhooks.md) membahas percobaan ulang dan payload. Lebih suka tanpa kode? Alur [Zapier](https://ikiform.com/blog/form-submissions-to-zapier.md) atau [n8n](https://ikiform.com/blog/form-submissions-to-n8n.md) dengan filter per departemen melakukan hal yang sama.

Biarkan email Ikiform tetap menyala untuk satu orang sebagai cadangan, atau matikan **Email new submissions** agar tidak ada yang menerima pesan dua kali.

## Pastikan berfungsi

1. Cek setiap baris penerima di pengaturan **Notifications** formulir. Tidak boleh ada yang berstatus **Waiting for confirmation**.
2. Isi formulir di halaman Anda lalu kirim. Anda mendarat di halaman terima kasih Anda, atau halaman hosted milik Ikiform.
3. Setiap penerima mendapat email sendiri. Minta salah satunya mengecek baris **To**: isinya hanya alamat mereka.
4. Jika Anda melakukan perutean lewat webhook, kirim sekali per departemen dan cek log pengiriman di **Webhooks**. Masing-masing menampilkan `succeeded`.
5. Kirim dengan honeypot terisi, `_gotcha=bot`. Kiriman tetap mendapat jawaban sukses, tetapi disimpan sebagai spam dan tidak memicu email atau webhook.

## Hal yang sering menjebak

- **Tanpa CC atau BCC.** Setiap penerima mendapat pesan terpisah, jadi tidak ada percakapan bersama. Sepakati siapa yang membalas, atau lakukan perutean berdasarkan topik.
- **Batasnya menghitung kiriman, bukan penerima.** Lewat dari 50 kiriman per jam di satu formulir, setiap penerima mendapat ringkasan sebagai gantinya.
- **Perubahan keanggotaan.** Saat seseorang keluar dari workspace, mereka langsung berhenti menerima email. Cek penerima formulir setelah ada perubahan tim, agar formulir tidak berakhir mengirim email ke tidak seorang pun.
- **Alamat yang bounce dijeda.** Barisnya menampilkan **Emails bounced** dengan tanggal, dan email ke alamat itu dilanjutkan setelahnya. Perbaiki alamatnya atau hapus.
- **Tidak ada yang dikirim ke pengunjung.** Ikiform tidak mengirim email ke orang yang mengisi formulir. Email notifikasi hanya dikirim ke Anda dan tim, jadi tidak ada autoresponder, email konfirmasi, atau double opt-in. Kirim semua itu dari alat email Anda, dipicu oleh [webhook](https://ikiform.com/id/docs/webhooks.md).

## Pertanyaan

### Apa yang terjadi jika alamat penerima bounce?

Ikiform menjeda email ke alamat itu untuk sementara dan menandai barisnya Emails bounced di pengaturan formulir. Penerima lain tidak terpengaruh. Perbaiki alamatnya atau hapus.

### Ke berapa alamat email satu formulir bisa mengirim?

Hingga 10. Termasuk anggota workspace yang Anda centang dan hingga 5 alamat luar, yang masing-masing mengonfirmasi lewat link terlebih dulu.

### Bisakah formulir memilih siapa yang menerima email?

Tidak, dan itu disengaja. Field penerima akan membuat siapa pun bisa memakai formulir untuk mengirim email ke alamat mana pun. Lakukan perutean berdasarkan field select di webhook, dengan alamat disimpan di kode Anda sendiri.

### Apakah penerima melihat alamat satu sama lain?

Tidak. Setiap penerima mendapat email terpisah yang hanya ditujukan kepada mereka.

### Bisakah saya mengirim pesan penjualan dan dukungan ke orang berbeda?

Bisa, dengan webhook. Tambahkan select departemen ke formulir, lalu biarkan handler kecil atau alat otomasi memilih alamat dan mengirim emailnya.

## Panduan lainnya

- [Kirim formulir ke email Anda](https://ikiform.com/id/guides/send-form-to-email.md): Terima setiap kiriman formulir di inbox tanpa mail server: mengapa mailto: dan mail() PHP gagal, dan setup yang menyaring spam serta memungkinkan Anda membalas.
- [Balas dari inbox Anda](https://ikiform.com/id/guides/send-form-to-email/reply-to.md): Buat Reply di notifikasi formulir membalas ke orang yang mengisi formulir: nama field yang berfungsi, kapan memakai _replyto, dan mengapa balasan bisa nyasar.
- [Ke Gmail](https://ikiform.com/id/guides/send-form-to-email/gmail.md): Terima kiriman formulir di Gmail tanpa link mailto:, app password, atau Apps Script, lalu beri label, jauhkan dari spam, dan balas dari Gmail.
- [Next.js](https://ikiform.com/id/guides/send-form-to-email/nextjs.md): Dua cara mengirim email dari formulir Next.js dengan Server Action: kirim sendiri dengan Resend atau Nodemailer, atau teruskan ke form backend, dibandingkan secara jujur.
- [Tanpa PHP](https://ikiform.com/id/guides/send-form-to-email/without-php.md): Ganti skrip contact.php yang memanggil mail() dengan formulir yang mengirim ke endpoint hosted, dengan nama field, halaman terima kasih, dan balasan tetap sama.
- [Alternatif EmailJS](https://ikiform.com/id/guides/send-form-to-email/emailjs-alternative.md): Pindahkan formulir kontak dari EmailJS: mengapa key email di sisi browser berisiko, apa yang berubah di kode Anda, dan apa yang Anda lepaskan, seperti balasan otomatis.
