# Formulir RSVP pernikahan di website pernikahan Anda sendiri

> Formulir RSVP untuk website pernikahan yang Anda buat sendiri: satu balasan per undangan, satu menu per tamu yang disebut namanya, tenggat, dan daftar siapa yang belum membalas.

Terbit 2026-10-25 · https://ikiform.com/id/guides/event-registration/wedding-rsvp

Beri setiap undangan link RSVP sendiri yang membawa kode undangan dan nama tamunya, lalu biarkan formulir menampilkan satu nama dan pilihan menu per tamu. Setiap balasan dikirim ke Ikiform, jadi Anda mendapat email untuk masing-masing dan CSV untuk diserahkan ke katering. Cocokkan balasan dengan daftar tamu di spreadsheet untuk melihat siapa yang belum menjawab, lalu jeda formulir setelah tenggat.

## Apa yang berbeda dari pernikahan

Meetup menghitung orang asing. Pernikahan menghitung daftar tamu yang sudah Anda punya, undangan demi undangan. Empat hal mengikuti dari situ:

- **Satu balasan per undangan, bukan per orang.** Pasangan atau keluarga menjawab bersama.
- **Tamu bernama, bukan jumlah tamu.** Anda mengundang Ada dan Sam, bukan `2`. Plus-one tercantum di undangan atau tidak sama sekali.
- **Satu menu per orang.** Katering butuh total ikan, daging sapi, dan vegetarian, ditambah porsi anak.
- **Tenggat tegas dan daftar untuk ditagih.** Venue meminta angka sebelum tanggal tertentu, dan daftar yang berguna adalah siapa yang belum membalas.

Layanan website pernikahan seperti Zola, The Knot, dan Joy punya alat RSVP yang dibangun di sekitar daftar tamu, dengan pencarian berdasarkan nama. Jika Anda memakai salah satunya untuk situs Anda, pakai RSVP-nya. Halaman ini untuk situs pernikahan yang Anda buat sendiri, di Squarespace, Carrd, Framer, atau HTML biasa, tempat Anda ingin RSVP ada di halaman Anda sendiri.

Ikiform tidak punya pencarian daftar tamu maupun grup berulang, jadi formulir tidak bisa tahu sendiri siapa saja yang ada di satu undangan. Triknya adalah menaruh informasi itu di link.

Diagram: Dari daftar tamu ke angka untuk katering, dengan link RSVP personal

1. Sheet daftar tamu Anda punya satu baris per undangan: kode pendek, nama keluarga, dan nama-nama tamu.
2. Sebuah rumus mengubah tiap baris menjadi link RSVP personal yang membawa kode dan nama-nama itu.
3. Anda mencetak link sebagai kode QR di undangan, atau mengirimnya lewat pesan.
4. Halaman RSVP membaca link dan menampilkan satu nama dan satu pilihan menu per tamu, lalu mengirim ke Ikiform.
5. Anda mengekspor balasan sebagai CSV dan mengimpornya di samping daftar tamu.
6. Mencocokkan kode menunjukkan undangan mana yang belum membalas, jadi Anda tahu siapa yang perlu ditagih.
7. Menghitung tiap menu di seluruh balasan memberi total untuk katering.

Daftar tamu tetap di sheet Anda. Link hanya membawa secukupnya agar formulir terasa personal.

## Buat link untuk setiap undangan

Di sheet daftar tamu, isi kode pendek di kolom A, seperti `okafor` atau `nguyen-family`, nama keluarga di B, dan nama depan tamu di C, dipisahkan koma. Rumus ini di D membuat link-nya:

`Daftar tamu, kolom D`:

```text
="https://ada-and-sam.example/rsvp?party=" & A2 & "&names=" & ENCODEURL(C2)
```

Cetak setiap link sebagai kode QR di undangan, atau tempel ke pesan. Buat kode dengan huruf kecil dan tanda hubung; pattern field menolak yang lain, sehingga kode yang salah ketik ketahuan sejak awal.

## Formulirnya

Tempel ini ke halaman pernikahan Anda, atau ke blok embed di pembuat situs. Kode ini membaca `party` dan `names` dari link, menambahkan satu baris nama dan menu per tamu, hingga empat, dan menyembunyikan diri setelah tenggat. Tanpa nama di link, formulir menampilkan satu baris untuk diisi.

`rsvp.html`:

```html
<form id="rsvp" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <input type="hidden" name="party" id="party">
  <div id="guests"></div>
  <label>Email for updates <input name="email" type="email" autocomplete="email" required></label>
  <label>A song that gets you dancing <input name="song" maxlength="120"></label>
  <label>Anything we should know? <textarea name="note" rows="3" maxlength="1000"></textarea></label>
  <input type="hidden" name="_redirect" value="https://ada-and-sam.example/thank-you">
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>
  <button type="submit">Send our RSVP</button>
</form>
<p id="closed" hidden>RSVPs closed on 1 May. Message us if your plans have changed.</p>

<template id="guest-row">
  <fieldset>
    <legend></legend>
    <label>Name <input data-part="name" maxlength="80" autocomplete="off"></label>
    <label>Meal
      <select data-part="meal">
        <option value="beef">Beef</option>
        <option value="fish">Fish</option>
        <option value="vegetarian">Vegetarian</option>
        <option value="child">Child's menu</option>
        <option value="not_coming">Can't come</option>
      </select>
    </label>
  </fieldset>
</template>

<script>
  const DEADLINE = new Date("2027-05-01T23:59:00+01:00");
  const params = new URLSearchParams(location.search);
  const party = (params.get("party") ?? "").toLowerCase();
  const names = (params.get("names") ?? "").split(",").map((name) => name.trim()).filter(Boolean).slice(0, 4);
  const rsvp = document.getElementById("rsvp");

  if (Date.now() > DEADLINE.getTime()) {
    rsvp.hidden = true;
    document.getElementById("closed").hidden = false;
  } else {
    document.getElementById("party").value = party;
    const rows = names.length ? names : [""];
    rows.forEach((name, index) => {
      const n = index + 1;
      const row = document.getElementById("guest-row").content.cloneNode(true);
      row.querySelector("legend").textContent = name || "Your name";
      const input = row.querySelector('[data-part="name"]');
      input.name = `guest_${n}_name`;
      input.value = name;
      input.required = n === 1;
      row.querySelector('[data-part="meal"]').name = `guest_${n}_meal`;
      document.getElementById("guests").append(row);
    });
  }
</script>
```

- Menu setiap tamu menyertakan `Can't come`, sehingga keluarga yang salah satu anggotanya tidak bisa datang tetap mengirim satu balasan.
- Input nama sudah terisi tetapi bisa diedit, jadi tamu bisa memperbaiki ejaan atau menuliskan nama anak.
- Formulir mengirim dengan cara biasa dan mendarat di halaman terima kasih Anda lewat `_redirect`. Taruh tanggal, venue, dan link kalender di sana; Ikiform tidak mengirim email ke tamu Anda.
- Tenggat hanya menyembunyikan formulir di browser. Saat tenggat tiba, pilih juga **Pause form** di Ikiform, agar tab yang tersimpan tidak bisa mengirim. Formulir yang dijeda menjawab `403 form_paused`.

Tempel definisi ini di tab **Fields** formulir. Coba saja: kode undangan dengan huruf kapital atau spasi gagal di pattern, dengan pesan yang Anda atur.

Formulir: Wedding RSVP

- **Kode undangan** (`party`, text, wajib)
- **Email untuk kabar terbaru** (`email`, email, wajib)
- **Nama tamu 1** (`guest_1_name`, text, wajib)
- **Menu tamu 1** (`guest_1_meal`, select, wajib)
- **Nama tamu 2** (`guest_2_name`, text)
- **Menu tamu 2** (`guest_2_meal`, select)
- **Nama tamu 3** (`guest_3_name`, text)
- **Menu tamu 3** (`guest_3_meal`, select)
- **Nama tamu 4** (`guest_4_name`, text)
- **Menu tamu 4** (`guest_4_meal`, select)
- **Lagu yang bikin Anda ingin berdansa** (`song`, text)
- **Ada yang perlu kami ketahui?** (`note`, textarea)

Field disusun sesuai urutan undangan, jadi CSV berisi nama setiap tamu diikuti menunya. Hanya tamu pertama yang wajib.

## Siapa yang belum membalas, dan apa yang perlu dipesan

1. Ekspor RSVP sebagai CSV dari **Submissions** lalu impor ke tab bernama `Replies` di spreadsheet daftar tamu.
2. Jika satu undangan membalas dua kali, simpan baris terbarunya: urutkan berdasarkan `created_at`, terbaru di atas, lalu hapus duplikat pada kolom `party`.
3. Tampilkan undangan yang belum membalas, dengan kode di kolom A daftar tamu dan `party` di kolom E tab Replies:

`Belum membalas`:

```text
=FILTER(A2:C, A2:A <> "", ISNA(MATCH(A2:A, Replies!E2:E, 0)))
```

Lalu hitung tiap menu untuk katering. Nama tidak pernah sama dengan nilai menu, jadi satu range yang mencakup semua kolom tamu sudah cukup:

`Porsi ikan`:

```text
=COUNTIF(Replies!G2:N, "fish")
```

| Angka | Cara |
| --- | --- |
| Orang yang datang | Jumlahkan hitungan untuk `beef`, `fish`, `vegetarian`, dan `child` |
| Tidak bisa datang | `COUNTIF` pada range yang sama untuk `not_coming` |
| Porsi anak | `COUNTIF` untuk `child`, yang biasanya diberi harga terpisah oleh katering |
| Catatan makanan | Baca kolom `note`. Alergi sering tersembunyi di sana |

> Email notifikasi datang dengan email setiap tamu sebagai reply-to, jadi Anda bisa menjawab pertanyaan langsung dari inbox. Ikiform mengirim email ke Anda dan pasangan, bukan ke tamu.

## Sebelum mengirim undangan

- Atur **Allowed domains** ke domain situs pernikahan Anda, dan domain staging pembuat situs selama pengujian.
- Ikiform tidak menggabungkan atau menolak kiriman berulang berdasarkan email. Kiriman identik yang berulang dalam 24 jam hanya menambah skor spam. Lakukan deduplikasi di tempat daftar itu disimpan, atau saat Anda mengekspor. Balasan terbaru per kode adalah jawabannya.
- Siapa pun yang memegang link bisa mengubah kode atau namanya. Itu tidak masalah untuk pernikahan; sheet Anda yang menentukan siapa yang diundang, dan daftar belum membalas akan menunjukkan hal yang janggal.
- Kerabat yang lebih tua mungkin sama sekali tidak memakai formulir. Catat balasan lewat telepon dan kertas di sheet Anda agar hitungannya tetap lengkap.

## Cek sebelum undangan dikirim

1. Buka link undangan Anda sendiri di ponsel. Nama-nama muncul, masing-masing dengan pilihan menu.
2. Pilih `Can't come` untuk satu tamu, kirim, lalu Anda mendarat di halaman terima kasih.
3. Buka **Submissions** di dashboard. Kiriman baru ada di sana dengan setiap field yang Anda kirim.
4. Cek inbox setiap penerima notifikasi. Masing-masing mendapat email berisi field, dan **Reply** terkirim ke pengirim formulir jika formulir punya field `email`.
5. Impor CSV, lalu pastikan daftar belum membalas tidak lagi menampilkan kode Anda.
6. Atur tenggat ke kemarin di salinan uji dan pastikan formulirnya tersembunyi.

## Hal yang sering menjebak

| Masalah | Yang harus dilakukan |
| --- | --- |
| `422` dengan `party: Use the link from your invitation` | Kodenya berisi huruf kapital, spasi, atau karakter lain. Perbaiki kode di sheet, atau minta tamu memakai link mereka. |
| Tamu melihat satu baris kosong, bukan nama-nama | Link kehilangan bagian `names`, sering kali karena aplikasi pesan memendekkannya. Kirim link lengkap atau kode QR-nya. |
| `422 validation_failed` | Kiriman tidak cocok dengan definisi field formulir. `error.fields` menyebutkan setiap field dan alasannya. Samakan `name` input dengan ID field. |
| `403 origin_not_allowed`, atau setiap kiriman masuk ke spam | Domain halaman tidak ada di **Allowed domains** formulir. Tambahkan, ditambah `localhost` untuk uji lokal. Subdomain dari domain yang terdaftar diizinkan. |
| Browser mendarat di halaman terima kasih Ikiform, bukan halaman Anda | `_redirect` diabaikan kecuali domainnya ada di **Allowed domains** dan berupa URL `https:`. Tambahkan domainnya, atau atur **Redirect after submit** di pengaturan formulir sebagai gantinya. |

## Pertanyaan

### Bisakah tamu melihat siapa lagi yang datang?

Tidak. RSVP masuk ke dashboard Ikiform dan inbox Anda. Tidak ada yang ditampilkan kembali di situs.

### Bisakah formulir mengirim email konfirmasi ke tamu?

Tidak dari Ikiform, yang hanya mengirim email ke Anda. Tampilkan detailnya di halaman terima kasih, atau kirim setiap balasan lewat webhook ke alat email dan kirim konfirmasinya dari sana.

### Bagaimana menghentikan RSVP setelah tenggat?

Sembunyikan formulir di halaman setelah tanggalnya, seperti pada contoh, dan pilih Pause form di Ikiform. Formulir yang dijeda menolak kiriman baru dengan 403 form_paused.

### Bagaimana jika tamu membalas dua kali?

Kedua balasan disimpan. Simpan yang terbaru per kode undangan saat menghitung, dengan mengurutkan dari yang terbaru dan menghapus duplikat pada kode.

### 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

- [Pendaftaran acara](https://ikiform.com/id/guides/event-registration.md): Terima RSVP di halaman acara Anda sendiri: formulir, batas tamu, jumlah peserta yang jujur, menutup saat penuh, dan daftar check-in, tanpa aplikasi tiket.
- [Tanpa Eventbrite](https://ikiform.com/id/guides/event-registration/without-eventbrite.md): Jalankan pendaftaran acara komunitas gratis di situs Anda sendiri: pilihan sesi, email konfirmasi dari alat Anda sendiri, hitungan per ruangan, dan daftar check-in.
- [Pendaftaran relawan](https://ikiform.com/id/guides/event-registration/volunteer-signup.md): Formulir pendaftaran relawan tempat orang memilih shift, dengan nomor telepon untuk hari H, dan skrip yang menunjukkan shift mana yang kurang orang dan menyusun jadwalnya.
