Eventanmeldung7 Min. Lesezeit
Eventanmeldung ohne Eventbrite, für kostenlose Community-Events
Nimm Anmeldungen für ein kostenloses Community-Event auf deiner eigenen Site entgegen: Sessionwahl, Bestätigungsmail aus deinem eigenen Tool, Raumzahlen und Check-in-Liste.
Für ein kostenloses Event kann ein Anmeldeformular auf deiner eigenen Site die Anmeldung über Eventbrite ersetzen: Es sendet an Ikiform, das jede Anmeldung speichert und dein Team per E-Mail informiert. Füge einen Webhook hinzu, der die Bestätigungs-E-Mail über deinen eigenen E-Mail-Anbieter verschickt, und zähle die Plätze pro Session anhand der neuesten Anmeldung pro E-Mail-Adresse. Behalte Eventbrite oder eine andere Ticketing-Plattform für bezahlte Tickets, harte Kapazitätsgrenzen und Check-in per Scan.
Was ohne Ticketing-Plattform anders ist
Eventbrite erledigt fünf Aufgaben auf einmal, und man vergisst leicht die, die du jetzt selbst übernimmst. Für einen kostenlosen Community-Tag, eine Meetup-Reihe oder einen Workshop sind die meisten davon klein. Hier die ehrliche Aufteilung:
- Die Eventseite wandert von der Seite bei Eventbrite auf deine eigene Site, mit deinem Design.
- Die Anmeldung wandert vom Checkout bei Eventbrite in dein Formular, das an Ikiform sendet.
- Die Bestätigungs-E-Mail wird nicht mehr für dich verschickt. Ein Webhook sendet sie über deinen eigenen E-Mail-Anbieter.
- Die Kapazität ist keine harte Grenze mehr. Du zählst die Anmeldungen pro Session und pausierst das Formular, wenn du voll bist.
- Der Check-in ist keine App mit QR-Scan mehr. Du druckst eine Liste aus dem CSV-Export.
Die Preise von Eventbrite ändern sich, also sieh auf der eigenen Preisseite nach, bevor du Kosten vergleichst. Bei kostenlosen Events sind Gebühren meist nicht der Grund zu wechseln: Die Teilnehmerliste liegt auf der Plattform eines anderen, die Seite sieht aus wie deren Seite, und wer sich anmeldet, gibt seine Daten an ein weiteres Unternehmen mit eigenen Konto- und E-Mail-Einstellungen. Bei kostenpflichtigen Events bleib dabei. Ikiform hat keine Zahlungen.
Ein Anmeldeformular mit Sessionwahl
Ein Community-Tag hat oft parallele Sessions, und Räume sind unterschiedlich groß. Frag, welche Sessions die Leute besuchen wollen, damit du einen beliebten Workshop vorher in einen größeren Raum verlegen kannst. Diese Definition begrenzt die Auswahl auf drei von vier, weil zwei gleichzeitig laufen:
Vorschau
Führt den Validator von Ikiform in deinem Browser aus. Es wird nichts gesendet.
sessions ist ein multi_select, gespeichert als Array. Benenne die Checkboxen in HTML sessions[], damit auch eine einzelne Auswahl als Liste gespeichert wird.nameist für das Namensschild beschriftet, so bekommst du den Namen, mit dem die Leute angesprochen werden wollen.lunchist einradiomit einer OptionNo lunch, damit du für die Leute bestellst, die auch essen.updatesist eine nicht angehakte Checkbox, gespeichert alstrueoderfalsein einer Einsendung, die ihr eigenescreated_atbehält. Nimm Leute nur in deinen Newsletter auf, wenn der Werttrueist.- Nutze das RSVP-Formular aus der Hauptanleitung für das Markup in deinem Stack und setze diese Felder ein.
Die Bestätigung aus deinem eigenen E-Mail-Tool senden
Ikiform schickt der Person, die das Formular ausfüllt, keine E-Mail. Benachrichtigungs-E-Mails gehen nur an dich und dein Team, es gibt also keinen Autoresponder, keine Bestätigungs-E-Mail und kein Double-Opt-in. Verschicke sie aus deinem E-Mail-Tool, ausgelöst durch einen Webhook. Bei einem Event solltest du trotzdem eine schicken: Leute leiten die Bestätigung an ihre Vorgesetzten weiter und suchen am Morgen des Events danach. Dieser Route-Handler empfängt den signierten Webhook von Ikiform und verschickt die E-Mail über die API von Resend. Jeder Anbieter mit einem Sende-Endpunkt funktioniert genauso.
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;
}
}verifyWebhookprüft die Signatur, damit niemand sonst deine Domain E-Mails verschicken lassen kann.Idempotency-Keyverwendet diewebhook-idder Zustellung, die bei jedem automatischen Wiederholungsversuch und bei einem manuellen Retry einer fehlgeschlagenen Zustellung gleich bleibt, sodass eine Zustellung, deren Antwort verloren ging, keine zweite E-Mail auslöst.- Name und Session-Titel werden escaped, bevor sie ins HTML kommen. Behandle Feldwerte als nicht vertrauenswürdige Eingaben.
- Ein
502bringt Ikiform dazu, es erneut zu versuchen, sodass ein kurzer Ausfall beim E-Mail-Anbieter keine Bestätigung verliert. Spam löst den Webhook nie aus, Bots bringen dich also nicht dazu, Fremden E-Mails zu schicken.
Füge die Route unter Webhooks im Dashboard hinzu und kopiere ihr Secret in IKIFORM_WEBHOOK_SECRET. Ikiform wiederholt eine fehlgeschlagene Zustellung etwa 3 Tage lang, und das Zustellungsprotokoll zeigt jeden Versuch. Ohne Code kann ein Automatisierungstool wie Zapier oder Make dieselbe E-Mail senden.
Plätze pro Session
Ikiform stoppt die Anmeldungen für eine Session nicht, wenn ihr Raum voll ist, und kann eine volle Option nicht ausblenden. Zähle stattdessen, anhand der neuesten Anmeldung jeder Person, und führe das aus, wann immer du eine Zahl brauchst:
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" : ""}`);
}Wenn ein Workshop voll ist, markiere ihn auf der Seite als voll und entferne seine Option aus dem Formular und der Felddefinition, damit neue Posts ihn nicht wählen können. Wenn der ganze Tag voll ist, wähle Pause form: Posts bekommen 403 form_paused, und die Seite sollte sagen, dass die Anmeldung geschlossen ist.
| Situation | Was zu tun ist |
|---|---|
| Ein Workshop ist voll | Entferne seine Option aus dem Formular und der Felddefinition und schreib es auf die Seite |
| Der ganze Tag ist voll | Pause form und ersetze das Formular durch eine E-Mail-Adresse für die Warteliste |
| Jemand sagt ab | Die Person antwortet auf die Bestätigungs-E-Mail. Lösche ihre Einsendung, damit die Zählung den Platz freigibt |
| Mit No-Shows ist zu rechnen | Bei kostenlosen Events erscheint oft ein Teil der Angemeldeten nicht. Erfasse deine eigene Quote und lass beim nächsten Mal etwas mehr Anmeldungen zu |
Am Einlass
- Exportiere am Vorabend Submissions als CSV und entferne doppelte E-Mail-Adressen, wobei du die neueste behältst.
- Sortiere nach Name, behalte
name,organisationundlunchund druck zwei Exemplare für den Empfang aus. - Druck Namensschilder aus derselben Tabelle per Serienbrief, mit der Spalte
name. - Trag Spontangäste von Hand ein. Nimm sie nach dem Event nur in deine eigene Liste auf, wenn sie zustimmen.
Vor der Ankündigung prüfen
- Füge unter Allowed domains des Formulars die Domain deiner Site hinzu, plus
localhost, während du entwickelst. Lass das Feld leer, um Posts von überall anzunehmen. - Melde dich mit deiner eigenen E-Mail-Adresse an und wähle zwei Sessions.
- Die Bestätigungs-E-Mail kommt von deiner Domain und listet beide Sessions auf.
- Wenn du einen Webhook hinzugefügt hast, öffne den Endpunkt unter Webhooks. Die Zustellung zeigt
succeededmit der Antwort deines Servers. - Führe die Platzzählung aus. Jede deiner zwei Sessions zeigt einen belegten Platz.
- Nichts angekommen? Stell den Statusfilter im Dashboard auf Spam. Spam bekommt dieselbe Erfolgsantwort wie eine echte Einsendung.
Stolperfallen
| Problem | Was zu tun ist |
|---|---|
422 mit dem Hinweis, höchstens 3 Optionen zu wählen | Jemand hat alle vier Sessions gewählt. Das ist die Regel max_items in Aktion; zeig die Meldung von Ikiform neben den Checkboxen an. |
| Wenn jemand eine Session wählt, wird nur ein Wert gespeichert | Benenne die Checkboxen sessions[]. Ist das Feld als multi_select definiert, wird auch ein einzelner Wert als Liste gespeichert. |
| Keine Bestätigungs-E-Mail, aber die Anmeldung ist in Ikiform | Öffne die Zustellung im Protokoll des Endpunkts. Ein 502 mit dem Status des Anbieters bedeutet, dass er die E-Mail abgelehnt hat, oft wegen einer nicht verifizierten Absenderdomain. |
| Die Einsendung ist im Dashboard, aber keine E-Mail und kein Webhook kam an | Sie wurde als Spam gespeichert. Spam löst nichts aus. Öffne sie unter dem Filter Spam, um die Gründe zu sehen, und markiere sie als kein Spam, um ihre E-Mail und Webhooks zu senden. |
429 rate_limited | Ein Besucher hat mehr gesendet, als das Rate-Limit des Formulars erlaubt. Standard erlaubt 5 pro Minute und Besucher. Warte Retry-After ab oder wähle Relaxed oder Custom für Formulare, die von einer gemeinsamen IP aus senden. |
Fragen
Für ein kostenloses Event, bei dem du Plätze zählen und eine Liste drucken kannst, ja. Für bezahlte Tickets, harte Kapazitätsgrenzen, Wartelisten oder QR-Check-in ist eine Ticketing-Plattform zuständig, Ikiform kann das nicht.
Du verschickst sie selbst. Füge einen Ikiform-Webhook hinzu, der die API deines E-Mail-Anbieters aufruft oder sich über ein Automatisierungstool verbindet, und versende die Bestätigung von deiner eigenen Domain.
Nicht automatisch. Zähle die Anmeldungen pro Session mit einem kurzen Skript oder einer Tabelle und entferne die Option eines vollen Workshops aus dem Formular, sobald er voll ist.
Nein. Jeder angenommene Post wird gespeichert. Eine identische Wiederholung innerhalb von 24 Stunden erhöht den Spam-Score, ist für sich allein aber kein Spam, also dedupliziere per E-Mail-Adresse in deiner Liste, deiner Datenbank oder deinem CSV-Export.
Nein, es gibt keinen kostenlosen Tarif. Testen ist kostenlos: Du kannst 50 Testeinsendungen pro Monat von localhost senden, bevor du zahlst. Für den Livebetrieb startet Pro bei $6/Monat für 500 Einsendungen, oder du zahlst einmalig 10.000 Einsendungen für $49 oder 50.000 Einsendungen für $149, mit Guthaben, das nie verfällt.
Hängst du bei einem Schritt fest oder willst eine Anleitung für deinen Fall? Schreib an hello@ikiform.com.