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

Veröffentlicht am 2026-10-25 · https://ikiform.com/de/guides/event-registration/without-eventbrite

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:

Diagramm: Welche Aufgaben von Eventbrite in dein eigenes Setup wandern und wer jeweils was macht

1. Die Eventseite wandert von der Seite bei Eventbrite auf deine eigene Site, mit deinem Design.
2. Die Anmeldung wandert vom Checkout bei Eventbrite in dein Formular, das an Ikiform sendet.
3. Die Bestätigungs-E-Mail wird nicht mehr für dich verschickt. Ein Webhook sendet sie über deinen eigenen E-Mail-Anbieter.
4. Die Kapazität ist keine harte Grenze mehr. Du zählst die Anmeldungen pro Session und pausierst das Formular, wenn du voll bist.
5. Der Check-in ist keine App mit QR-Scan mehr. Du druckst eine Liste aus dem CSV-Export.

Die ersten drei sind auf deiner eigenen Site besser. Die letzten zwei sind schlechter, und bei einem großen oder kostenpflichtigen Event sind sie der Grund, bei einer Ticketing-Plattform zu bleiben.

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:

Formular: Community day registration

- **Name für dein Namensschild** (`name`, text, Pflichtfeld)
- **E-Mail** (`email`, email, Pflichtfeld)
- **Sessions, die du besuchst** (`sessions`, multi_select, Pflichtfeld)
- **Firma oder Gruppe** (`organisation`, text)
- **Mittagessen** (`lunch`, radio, Pflichtfeld)
- **Schickt mir E-Mails zu künftigen Community-Tagen** (`updates`, checkbox)

`sessions` ist ein `multi_select`, gespeichert als Array. Benenne die Checkboxen in HTML `sessions[]`, damit auch eine einzelne Auswahl als Liste gespeichert wird.

- `name` ist für das Namensschild beschriftet, so bekommst du den Namen, mit dem die Leute angesprochen werden wollen.
- `lunch` ist ein `radio` mit einer Option `No lunch`, damit du für die Leute bestellst, die auch essen.
- `updates` ist eine nicht angehakte Checkbox, gespeichert als `true` oder `false` in einer Einsendung, die ihr eigenes `created_at` behält. Nimm Leute nur in deinen Newsletter auf, wenn der Wert `true` ist.
- Nutze das [RSVP-Formular aus der Hauptanleitung](https://ikiform.com/de/guides/event-registration.md#form) für das Markup in deinem Stack und setze diese Felder ein.

> Wenn ein Anmeldeformular auch künftige Neuigkeiten anbietet, lass diese Checkbox standardmäßig leer und sag genau, was du schicken wirst. Die Checkbox ist dein Nachweis der Einwilligung; die Bestätigungs-E-Mail unten ist kein Marketing und braucht sie nicht.

## 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](https://ikiform.com/de/docs/webhooks.md). 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.

`app/api/registered/route.ts`:

```ts
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;
  }
}
```

- `verifyWebhook` prüft die Signatur, damit niemand sonst deine Domain E-Mails verschicken lassen kann.
- `Idempotency-Key` verwendet die `webhook-id` der 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 `502` bringt 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](https://ikiform.com/blog/form-submissions-to-zapier.md) oder [Make](https://ikiform.com/blog/form-submissions-to-make.md) 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:

`seats.ts`:

```ts
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

1. Exportiere am Vorabend **Submissions** als CSV und entferne doppelte E-Mail-Adressen, wobei du die neueste behältst.
2. Sortiere nach Name, behalte `name`, `organisation` und `lunch` und druck zwei Exemplare für den Empfang aus.
3. Druck Namensschilder aus derselben Tabelle per Serienbrief, mit der Spalte `name`.
4. 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

1. 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.
2. Melde dich mit deiner eigenen E-Mail-Adresse an und wähle zwei Sessions.
3. Die Bestätigungs-E-Mail kommt von deiner Domain und listet beide Sessions auf.
4. Wenn du einen Webhook hinzugefügt hast, öffne den Endpunkt unter **Webhooks**. Die Zustellung zeigt `succeeded` mit der Antwort deines Servers.
5. Führe die Platzzählung aus. Jede deiner zwei Sessions zeigt einen belegten Platz.
6. 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

### Reicht ein Anmeldeformular statt Eventbrite?

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.

### Wie bekommen Angemeldete eine Bestätigungs-E-Mail?

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.

### Kann ich die Plätze in jedem Workshop begrenzen?

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.

### Entfernt Ikiform doppelte Einsendungen?

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.

### Ist Ikiform kostenlos?

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.

## Weitere Anleitungen

- [Eventanmeldung](https://ikiform.com/de/guides/event-registration.md): Nimm Zusagen auf deiner eigenen Eventseite entgegen: Formular, Begleitpersonen-Limit, ehrliche Teilnehmerzahl, Schließen bei voller Kapazität und Check-in-Liste, ohne Ticketing-App.
- [Helferanmeldung](https://ikiform.com/de/guides/event-registration/volunteer-signup.md): Ein Anmeldeformular für Helfer, in dem man Schichten wählt, mit Telefonnummer für den Tag, und ein Skript, das unterbesetzte Schichten zeigt und den Dienstplan erstellt.
- [Hochzeits-RSVP](https://ikiform.com/de/guides/event-registration/wedding-rsvp.md): Ein RSVP-Formular für eine selbst gebaute Hochzeitswebsite: eine Antwort pro Einladung, ein Menü pro Gast, eine Frist und eine Liste, wer noch nicht geantwortet hat.
