# Inscriptions à un événement sans Eventbrite, pour les événements associatifs gratuits

> Gérez les inscriptions d'un événement associatif gratuit sur votre site : choix de sessions, e-mail de confirmation par votre outil, effectifs par salle et liste d'accueil.

Publié le 2026-10-25 · https://ikiform.com/fr/guides/event-registration/without-eventbrite

Pour un événement gratuit, un formulaire d'inscription sur votre propre site peut remplacer l'inscription Eventbrite : il envoie à Ikiform, qui stocke chaque inscription et prévient votre équipe par e-mail. Ajoutez un webhook qui envoie l'e-mail de confirmation depuis votre propre fournisseur d'e-mail, et comptez les places par session à partir de la dernière inscription de chaque e-mail. Gardez Eventbrite, ou une autre plateforme de billetterie, pour les billets payants, les plafonds de places stricts et le scan à l'accueil.

## Ce qui change sans plateforme de billetterie

Eventbrite fait cinq choses à la fois, et on oublie facilement celles que vous ferez désormais vous-même. Pour une journée associative gratuite, une série de meetups ou un atelier, la plupart sont mineures. Voici la répartition, honnêtement :

Schéma : Les tâches qui passent d'Eventbrite à votre propre installation, et qui s'en charge

1. La page de l'événement passe de la page Eventbrite à votre propre site, avec votre design.
2. L'inscription passe du checkout d'Eventbrite à votre formulaire, qui envoie à Ikiform.
3. L'e-mail de confirmation n'est plus envoyé pour vous. Un webhook l'envoie depuis votre propre fournisseur d'e-mail.
4. La capacité n'est plus un plafond strict. Vous comptez les inscriptions par session et mettez le formulaire en pause quand c'est complet.
5. L'accueil n'est plus une appli avec scan de QR codes. Vous imprimez une liste depuis l'export CSV.

Les trois premières sont mieux sur votre propre site. Les deux dernières sont moins bien, et pour un événement important ou payant, c'est la raison de rester sur une plateforme de billetterie.

Les tarifs d'Eventbrite évoluent : consultez sa propre page de tarifs avant de comparer les coûts. Pour les événements gratuits, les raisons de partir ne sont généralement pas les frais : la liste des participants est sur la plateforme de quelqu'un d'autre, la page ressemble à la sienne, et les inscrits confient leurs données à une autre entreprise, avec ses propres réglages de compte et d'e-mail. Pour les événements payants, restez-y. Ikiform n'a pas de paiements.

## Un formulaire d'inscription avec choix de sessions

Une journée associative a souvent des sessions en parallèle, et les salles n'ont pas la même taille. Demandez à quelles sessions les gens comptent assister, pour pouvoir déplacer un atelier populaire dans une salle plus grande avant le jour J. Cette définition limite les choix à trois sur quatre, puisque deux ont lieu en même temps :

Formulaire : Community day registration

- **Nom pour votre badge** (`name`, text, obligatoire)
- **E-mail** (`email`, email, obligatoire)
- **Sessions auxquelles vous assisterez** (`sessions`, multi_select, obligatoire)
- **Entreprise ou groupe** (`organisation`, text)
- **Déjeuner** (`lunch`, radio, obligatoire)
- **Écrivez-moi au sujet des prochaines journées** (`updates`, checkbox)

`sessions` est un `multi_select`, stocké sous forme de tableau. En HTML, nommez les cases à cocher `sessions[]` pour qu'un choix unique soit quand même stocké comme une liste.

- `name` est libellé pour le badge, ce qui vous donne le nom sous lequel les gens veulent être appelés.
- `lunch` est un `radio` avec une option `No lunch`, pour commander pour ceux qui mangeront.
- `updates` est une case non cochée, stockée comme `true` ou `false` dans une soumission qui garde son propre `created_at`. N'ajoutez les gens à votre newsletter que lorsqu'elle vaut `true`.
- Utilisez le [formulaire de RSVP du guide principal](https://ikiform.com/fr/guides/event-registration.md#form) pour le markup dans votre stack, en y mettant ces champs.

> Si un formulaire d'inscription propose aussi des nouvelles à venir, laissez cette case décochée par défaut et dites exactement ce que vous enverrez. La case est votre preuve de consentement ; l'e-mail de confirmation ci-dessous n'est pas du marketing et n'en a pas besoin.

## Envoyer la confirmation depuis votre propre outil d'e-mailing

Ikiform n'envoie pas d'e-mail à la personne qui remplit le formulaire. Les e-mails de notification vont uniquement à vous et à votre équipe : il n'y a donc ni réponse automatique, ni e-mail de confirmation, ni double opt-in. Envoyez-les depuis votre outil d'e-mailing, déclenché par un [webhook](https://ikiform.com/fr/docs/webhooks.md). Pour un événement, envoyez-en un quand même : les gens transfèrent la confirmation à leur responsable et la recherchent le matin de l'événement. Ce route handler reçoit le webhook signé d'Ikiform et envoie l'e-mail via l'API de Resend. Tout fournisseur doté d'un endpoint d'envoi fonctionne de la même façon.

`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` vérifie la signature, pour que personne d'autre ne puisse faire envoyer des e-mails à votre domaine.
- `Idempotency-Key` utilise le `webhook-id` de la livraison, qui reste identique à chaque nouvelle tentative automatique et lors d'un **Retry** manuel d'une livraison échouée : une livraison dont la réponse s'est perdue n'envoie donc pas un second e-mail.
- Le nom et les titres des sessions sont échappés avant d'aller dans le HTML. Traitez les valeurs des champs comme des entrées non fiables.
- Un `502` fait réessayer Ikiform, donc une courte panne chez le fournisseur d'e-mail ne fait pas perdre de confirmation. Le spam ne déclenche jamais le webhook : les bots ne vous font pas écrire à des inconnus.

Ajoutez la route sous **Webhooks** dans le tableau de bord et copiez son secret dans `IKIFORM_WEBHOOK_SECRET`. Ikiform réessaie une livraison échouée pendant environ 3 jours, et le journal des livraisons affiche chaque tentative. Sans code, un outil d'automatisation comme [Zapier](https://ikiform.com/blog/form-submissions-to-zapier.md) ou [Make](https://ikiform.com/blog/form-submissions-to-make.md) peut envoyer le même e-mail.

## Places par session

Ikiform n'arrête pas les inscriptions à une session quand sa salle est pleine, et ne peut pas masquer une option complète. Comptez plutôt, à partir de l'inscription la plus récente de chaque personne, et lancez ce calcul dès que vous voulez un chiffre :

`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" : ""}`);
}
```

Quand un atelier est complet, modifiez la page pour l'indiquer et retirez son option du formulaire et de la définition des champs, pour que les nouveaux envois ne puissent plus le choisir. Quand toute la journée est complète, choisissez **Pause form** : les envois reçoivent `403 form_paused`, et la page doit indiquer que les inscriptions sont closes.

| Situation | Que faire |
| --- | --- |
| Un atelier complet | Retirez son option du formulaire et de la définition des champs, et indiquez-le sur la page |
| Toute la journée complète | **Pause form** et remplacez le formulaire par une adresse e-mail de liste d'attente |
| Quelqu'un annule | La personne répond à l'e-mail de confirmation. Supprimez sa soumission pour que le décompte libère la place |
| Absences prévisibles | Les événements gratuits ont souvent une part d'absents. Mesurez votre propre taux et acceptez un peu plus d'inscriptions la prochaine fois |

## Sur place

1. La veille au soir, exportez **Submissions** en CSV et supprimez les e-mails en double, en gardant le plus récent.
2. Triez par nom, gardez `name`, `organisation` et `lunch`, et imprimez deux exemplaires pour l'accueil.
3. Imprimez les badges depuis le même tableur avec un publipostage, à partir de la colonne `name`.
4. Notez à la main les personnes venues sans inscription. Après l'événement, ajoutez-les à votre liste seulement si elles sont d'accord.

## Vérifiez avant d'annoncer

1. Dans **Allowed domains** du formulaire, ajoutez le domaine de votre site, plus `localhost` pendant le développement. Laissez vide pour accepter les envois de partout.
2. Inscrivez-vous avec votre propre e-mail, en choisissant deux sessions.
3. L'e-mail de confirmation arrive depuis votre domaine et liste les deux sessions.
4. Si vous avez ajouté un webhook, ouvrez l'endpoint dans **Webhooks**. La livraison affiche `succeeded` avec la réponse de votre serveur.
5. Lancez le décompte des places. Chacune de vos deux sessions affiche une place prise.
6. Rien n'est arrivé ? Passez le filtre de statut du tableau de bord sur **Spam**. Le spam reçoit la même réponse de succès qu'une vraie soumission.

## Pièges

| Problème | Que faire |
| --- | --- |
| `422` demandant de choisir au plus 3 options | Quelqu'un a choisi les quatre sessions. C'est la règle `max_items` qui fonctionne ; affichez le message d'Ikiform à côté des cases à cocher. |
| Une seule session est stockée quand quelqu'un en choisit une | Nommez les cases à cocher `sessions[]`. Avec un champ défini en `multi_select`, une valeur unique est quand même stockée comme une liste. |
| Pas d'e-mail de confirmation, mais l'inscription est dans Ikiform | Ouvrez la livraison dans le journal de l'endpoint. Un `502` avec le statut du fournisseur signifie qu'il a refusé l'e-mail, souvent à cause d'un domaine d'envoi non vérifié. |
| La soumission est dans le tableau de bord mais aucun e-mail ni webhook n'est arrivé | Elle a été stockée comme spam. Le spam n'envoie rien. Ouvrez-la sous le filtre **Spam** pour voir les raisons, et marquez-la comme non-spam pour envoyer son e-mail et ses webhooks. |
| `429 rate_limited` | Un visiteur a envoyé plus que ce que permet la limite de débit du formulaire. Standard autorise 5 envois par minute et par visiteur. Attendez la durée de `Retry-After`, ou choisissez Relaxed ou Custom pour les formulaires qui envoient depuis une seule IP partagée. |

## Questions

### Un formulaire d'inscription suffit-il à remplacer Eventbrite ?

Pour un événement gratuit où vous pouvez compter les places et imprimer une liste, oui. Pour les billets payants, les plafonds de places stricts, les listes d'attente ou l'accueil par QR code, une plateforme de billetterie s'en charge et Ikiform non.

### Comment les inscrits reçoivent-ils un e-mail de confirmation ?

Envoyez-le vous-même. Ajoutez un webhook Ikiform qui appelle l'API de votre fournisseur d'e-mail, ou passez par un outil d'automatisation, et envoyez la confirmation depuis votre propre domaine.

### Puis-je limiter les places de chaque atelier ?

Pas automatiquement. Comptez les inscriptions par session avec un petit script ou un tableur, et retirez l'option d'un atelier du formulaire quand il est complet.

### Ikiform supprime-t-il les soumissions en double ?

Non. Chaque envoi accepté est stocké. Une répétition identique dans les 24 heures augmente le score de spam mais n'est pas du spam en soi : dédoublonnez donc par e-mail dans votre liste, votre base de données ou votre export CSV.

### Ikiform est-il gratuit ?

Non, il n'y a pas d'offre gratuite. Les tests sont gratuits : vous pouvez envoyer 50 soumissions de test par mois depuis localhost avant de payer. Pour passer en production, Pro commence à 6 $/mois pour 500 soumissions, ou vous pouvez payer une seule fois 10 000 soumissions pour 49 $ ou 50 000 soumissions pour 149 $, avec des crédits qui n'expirent jamais.

## Autres guides

- [Inscription à un événement](https://ikiform.com/fr/guides/event-registration.md): Recevez les RSVP sur votre page d'événement : formulaire, limite d'invités, décompte fiable, clôture quand c'est complet et liste d'accueil, sans billetterie.
- [Inscription des bénévoles](https://ikiform.com/fr/guides/event-registration/volunteer-signup.md): Un formulaire d'inscription de bénévoles avec choix de créneaux et téléphone pour le jour J, et un script qui repère les créneaux en manque et bâtit le planning.
- [RSVP de mariage](https://ikiform.com/fr/guides/event-registration/wedding-rsvp.md): Un formulaire de RSVP pour un site de mariage fait maison : une réponse par invitation, un repas par invité nommé, une date limite et la liste de qui n'a pas répondu.
