Kirim formulir ke email Anda

Kirim formulir ke email Anda5 menit baca

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.

Preet SutharPendiri, Ikiform

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 inginkanTempat mengaturnyaBatas
Semua orang menerima setiap kirimanPenerima di pengaturan Notifications formulir10 alamat per formulir
Setiap kiriman sampai ke orang yang tepatWebhook yang membaca field dan mengirim email ke satu tim3 endpoint webhook per workspace

Kirim setiap kiriman ke seluruh tim

Satu kiriman, satu email per penerimaformulir Andasatu kirimanIkiformmenentukan penerimaanggota dicentangemail workspaceterverifikasialamat luardikonfirmasi lewat linkbounce atautertundadilewatikirimSatu kiriman, satu email per penerimaformulirAndasatu kirimanIkiformmenentukanpenerimaanggotadicentangemail workspaceterverifikasialamat luardikonfirmasi lewatlinkbounce atautertundadilewatikirim
  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:

ItemAnggota workspaceAlamat luar
Ditambahkan denganMencentangnya di formulirSend link, lalu konfirmasi dari mereka
Yang terlihat di emailField dan tombol View submissionField dan link berhenti berlangganan
Bisa membuka dashboardYaTidak
Berhenti menerima email saatAnda menghapus centangnya, atau mereka keluar dari workspaceAnda menghapus barisnya, atau mereka berhenti berlangganan
Dihitung terhadapBatas 10 alamatBatas 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
<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
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 membahas percobaan ulang dan payload. Lebih suka tanpa kode? Alur Zapier atau n8n 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.

Pertanyaan

Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.