Pendaftaran acara6 menit baca
Pendaftaran acara tanpa Eventbrite, untuk acara komunitas gratis
Jalankan pendaftaran acara komunitas gratis di situs Anda sendiri: pilihan sesi, email konfirmasi dari alat Anda sendiri, hitungan per ruangan, dan daftar check-in.
Untuk acara gratis, formulir pendaftaran di situs Anda sendiri bisa menggantikan pendaftaran Eventbrite: formulir mengirim ke Ikiform, yang menyimpan setiap pendaftaran dan mengirim email ke tim Anda. Tambahkan webhook yang mengirim email konfirmasi dari penyedia email Anda sendiri, dan hitung kursi per sesi dari pendaftaran terbaru per email. Tetap pakai Eventbrite, atau platform tiket lain, untuk tiket berbayar, batas kapasitas yang ketat, dan pemindaian check-in.
Apa yang berbeda tanpa platform tiket
Eventbrite mengerjakan lima tugas sekaligus, dan mudah lupa mana saja yang sekarang harus Anda kerjakan sendiri. Untuk hari komunitas gratis, seri meetup, atau workshop, sebagian besar tugas itu kecil. Berikut pembagiannya, apa adanya:
- Halaman acara pindah dari halaman Eventbrite ke situs Anda sendiri, dengan desain Anda.
- Pendaftaran pindah dari checkout Eventbrite ke formulir Anda, yang mengirim ke Ikiform.
- Email konfirmasi tidak lagi dikirimkan untuk Anda. Webhook mengirimnya dari penyedia email Anda sendiri.
- Kapasitas tidak lagi berupa batas keras. Anda menghitung pendaftaran per sesi dan menjeda formulir saat penuh.
- Check-in tidak lagi berupa aplikasi dengan pemindaian QR. Anda mencetak daftar dari ekspor CSV.
Harga Eventbrite bisa berubah, jadi cek halaman harganya sendiri sebelum membandingkan biaya. Untuk acara gratis, alasan untuk pindah biasanya bukan biaya: daftar peserta ada di platform orang lain, halamannya terlihat seperti milik mereka, dan pendaftar menyerahkan data mereka ke perusahaan lain dengan pengaturan akun dan email sendiri. Untuk acara berbayar, tetaplah di sana. Ikiform tidak punya pembayaran.
Formulir pendaftaran dengan pilihan sesi
Hari komunitas sering punya sesi paralel, dan ukuran ruangan berbeda-beda. Tanyakan sesi mana yang ingin dihadiri orang, agar Anda bisa memindahkan workshop populer ke ruangan lebih besar sebelum hari H. Definisi ini membatasi pilihan maksimal tiga dari empat, karena dua di antaranya berjalan bersamaan:
Pratinjau
Menjalankan validator Ikiform di browser Anda. Tidak ada yang dikirim.
sessions adalah multi_select, disimpan sebagai array. Di HTML, beri nama checkbox sessions[] agar satu pilihan pun tetap disimpan sebagai daftar.- Label
nameditujukan untuk badge, sehingga Anda mendapat nama yang ingin dipakai orang untuk dipanggil. lunchadalahradiodengan opsiNo lunch, jadi Anda memesan untuk orang yang memang akan makan.updatesadalah checkbox yang tidak dicentang, disimpan sebagaitrueataufalsepada kiriman yang menyimpancreated_at-nya sendiri. Tambahkan orang ke newsletter Anda hanya jika nilainyatrue.- Pakai formulir RSVP dari panduan utama untuk markup di stack Anda, dengan field-field ini sebagai gantinya.
Kirim konfirmasi dari alat email Anda sendiri
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. Untuk acara, tetap kirim konfirmasi: orang meneruskannya ke atasan mereka dan mencarinya di pagi hari acara. Route handler ini menerima webhook bertanda tangan dari Ikiform dan mengirim email lewat API Resend. Penyedia mana pun yang punya endpoint pengiriman bekerja dengan cara yang sama.
import { verifyWebhook, WebhookVerificationError } from "@ikiform/sdk/webhooks";
const TITLES: Record<string, string> = {
keynote: "Opening talk, 10:00",
workshop_a: "Workshop A, 11:30",
workshop_b: "Workshop B, 11:30",
panel: "Closing panel, 15:00",
};
function escape(text: string) {
return text.replace(/[&<>"']/g, (char) => `&#${char.charCodeAt(0)};`);
}
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 email = String(fields.email ?? "");
const chosen = (Array.isArray(fields.sessions) ? fields.sessions : []).map((id) => TITLES[String(id)] ?? String(id));
const response = await fetch("https://api.resend.com/emails", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.RESEND_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": request.headers.get("webhook-id") ?? event.data.submission_id,
},
body: JSON.stringify({
from: "Community Day <hello@community.example>",
to: email,
reply_to: "hello@community.example",
subject: "You're registered for Community Day, 14 March",
html: [
`<p>Hi ${escape(String(fields.name ?? ""))},</p>`,
"<p>You're on the list for Community Day on 14 March at The Old Library. Doors open at 9:30.</p>",
`<p>Your sessions: ${chosen.map(escape).join(", ")}.</p>`,
'<p><a href="https://community.example/day.ics">Add it to your calendar</a>. Can\'t come after all? Reply to this email.</p>',
].join(""),
}),
});
if (!response.ok) return new Response(`Email API answered ${response.status}`, { status: 502 });
return new Response(null, { status: 204 });
} catch (error) {
if (error instanceof WebhookVerificationError) return new Response(error.reason, { status: 400 });
throw error;
}
}verifyWebhookmemeriksa tanda tangan, sehingga tidak ada orang lain yang bisa membuat domain Anda mengirim email.Idempotency-Keymemakaiwebhook-idmilik pengiriman, yang tetap sama di setiap percobaan ulang otomatis dan pada Retry manual untuk pengiriman yang gagal, sehingga pengiriman yang jawabannya hilang tidak mengirim email kedua.- Nama dan judul sesi di-escape sebelum masuk ke HTML. Perlakukan nilai field sebagai input yang tidak tepercaya.
502membuat Ikiform mencoba ulang, sehingga gangguan singkat di penyedia email tidak menghilangkan konfirmasi. Spam tidak pernah memicu webhook, jadi bot tidak membuat Anda mengirim email ke orang asing.
Tambahkan route di Webhooks pada dashboard dan salin secret-nya ke IKIFORM_WEBHOOK_SECRET. Ikiform mencoba ulang pengiriman yang gagal selama sekitar 3 hari, dan log pengiriman menampilkan setiap percobaan. Tanpa kode, alat otomasi seperti Zapier atau Make bisa mengirim email yang sama.
Kursi per sesi
Ikiform tidak akan menghentikan pendaftaran untuk satu sesi saat ruangannya penuh, dan tidak bisa menyembunyikan opsi yang penuh. Sebagai gantinya, hitung memakai pendaftaran terbaru tiap orang, dan jalankan kapan pun Anda butuh angkanya:
import { createClient } from "@ikiform/sdk";
const ikiform = createClient({ apiKey: process.env.IKIFORM_SECRET_KEY! });
const ROOMS: Record<string, number> = { keynote: 200, workshop_a: 30, workshop_b: 30, panel: 200 };
const latest = new Map<string, string[]>();
for await (const submission of ikiform.submissions.iterate({ formId: process.argv[2], status: "received", limit: 100 })) {
const email = String(submission.fields.email ?? "").trim().toLowerCase();
const chosen = Array.isArray(submission.fields.sessions) ? submission.fields.sessions.map(String) : [];
if (email && !latest.has(email)) latest.set(email, chosen);
}
for (const [session, seats] of Object.entries(ROOMS)) {
const taken = [...latest.values()].filter((chosen) => chosen.includes(session)).length;
console.log(`${session.padEnd(12)} ${String(taken).padStart(4)} of ${seats}${taken >= seats ? " FULL" : ""}`);
}Saat workshop penuh, edit halaman untuk menandainya penuh dan hapus opsinya dari formulir dan definisi field, agar kiriman baru tidak bisa memilihnya. Saat seluruh acara penuh, pilih Pause form: kiriman mendapat 403 form_paused, dan halaman sebaiknya menyatakan pendaftaran sudah ditutup.
| Situasi | Yang harus dilakukan |
|---|---|
| Satu workshop penuh | Hapus opsinya dari formulir dan definisi field, lalu umumkan di halaman |
| Seluruh acara penuh | Pause form lalu ganti formulir dengan alamat email untuk daftar tunggu |
| Seseorang membatalkan | Mereka membalas email konfirmasi. Hapus kirimannya agar hitungan membebaskan kursi itu |
| Ada yang diperkirakan tidak datang | Acara gratis sering kali punya sebagian pendaftar yang tidak datang. Catat persentase Anda sendiri dan terima pendaftaran sedikit lebih banyak lain kali |
Di pintu masuk
- Malam sebelumnya, ekspor Submissions sebagai CSV dan hapus email duplikat, simpan yang terbaru.
- Urutkan berdasarkan nama, pertahankan
name,organisation, danlunch, lalu cetak dua salinan untuk meja registrasi. - Cetak badge dari sheet yang sama dengan mail merge, memakai kolom
name. - Tulis tangan peserta yang datang tanpa mendaftar. Setelah acara, tambahkan mereka ke daftar Anda hanya jika mereka setuju.
Cek sebelum mengumumkan
- Di Allowed domains formulir, tambahkan domain situs Anda, ditambah
localhostselama pengembangan. Biarkan kosong untuk menerima kiriman dari mana saja. - Daftar dengan email Anda sendiri, pilih dua sesi.
- Email konfirmasi datang dari domain Anda, mencantumkan kedua sesi.
- Jika Anda menambahkan webhook, buka endpoint-nya di Webhooks. Pengiriman menampilkan
succeededdengan jawaban dari server Anda. - Jalankan hitungan kursi. Masing-masing dari dua sesi Anda menampilkan satu kursi terisi.
- Tidak ada yang masuk? Ubah filter status di dashboard ke Spam. Spam mendapat jawaban sukses yang sama dengan kiriman asli.
Hal yang sering menjebak
| Masalah | Yang harus dilakukan |
|---|---|
422 yang meminta memilih maksimal 3 opsi | Seseorang memilih keempat sesi. Itu tandanya aturan max_items bekerja; tampilkan pesan Ikiform di samping checkbox. |
| Hanya satu sesi tersimpan saat seseorang memilih satu | Beri nama checkbox sessions[]. Dengan field didefinisikan sebagai multi_select, satu nilai pun tetap disimpan sebagai daftar. |
| Tidak ada email konfirmasi, tetapi pendaftaran ada di Ikiform | Buka pengiriman itu di log endpoint. 502 dengan status dari penyedia berarti penyedia menolak email tersebut, sering kali karena domain pengirim belum diverifikasi. |
| Kiriman ada di dashboard tetapi tidak ada email atau webhook yang datang | Kiriman itu disimpan sebagai spam. Spam tidak mengirim apa pun. Buka di filter Spam untuk melihat alasannya, dan tandai sebagai bukan spam untuk mengirim email dan webhook-nya. |
429 rate_limited | Satu pengunjung mengirim melebihi rate limit formulir. Standard mengizinkan 5 per menit per pengunjung. Tunggu sesuai Retry-After, atau pilih Relaxed atau Custom untuk formulir yang mengirim dari satu IP bersama. |
Pertanyaan
Untuk acara gratis di mana Anda bisa menghitung kursi dan mencetak daftar, ya. Untuk tiket berbayar, batas kapasitas ketat, daftar tunggu, atau check-in QR, platform tiket menyediakannya dan Ikiform tidak.
Kirim sendiri. Tambahkan webhook Ikiform yang memanggil API penyedia email Anda, atau terhubung lewat alat otomasi, lalu kirim konfirmasi dari domain Anda sendiri.
Tidak secara otomatis. Hitung pendaftaran per sesi dengan skrip pendek atau sheet, dan hapus opsi workshop yang penuh dari formulir saat sudah terisi.
Tidak. Setiap kiriman yang diterima disimpan. Kiriman identik yang berulang dalam 24 jam menambah skor spam tetapi tidak otomatis dianggap spam, jadi lakukan deduplikasi berdasarkan email di daftar, database, atau ekspor CSV Anda.
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.
Mentok di salah satu langkah, atau ingin panduan untuk situasi Anda? Email hello@ikiform.com.