Inscription à un événement8 min de lecture
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.
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 :
- La page de l'événement passe de la page Eventbrite à votre propre site, avec votre design.
- L'inscription passe du checkout d'Eventbrite à votre formulaire, qui envoie à Ikiform.
- L'e-mail de confirmation n'est plus envoyé pour vous. Un webhook l'envoie depuis votre propre fournisseur d'e-mail.
- La capacité n'est plus un plafond strict. Vous comptez les inscriptions par session et mettez le formulaire en pause quand c'est complet.
- L'accueil n'est plus une appli avec scan de QR codes. Vous imprimez une liste depuis l'export CSV.
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 :
Aperçu
Exécute le validateur d'Ikiform dans votre navigateur. Rien n'est envoyé.
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.nameest libellé pour le badge, ce qui vous donne le nom sous lequel les gens veulent être appelés.lunchest unradioavec une optionNo lunch, pour commander pour ceux qui mangeront.updatesest une case non cochée, stockée commetrueoufalsedans une soumission qui garde son proprecreated_at. N'ajoutez les gens à votre newsletter que lorsqu'elle vauttrue.- Utilisez le formulaire de RSVP du guide principal pour le markup dans votre stack, en y mettant ces champs.
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. 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.
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;
}
}verifyWebhookvérifie la signature, pour que personne d'autre ne puisse faire envoyer des e-mails à votre domaine.Idempotency-Keyutilise lewebhook-idde 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
502fait 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 ou Make 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 :
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
- La veille au soir, exportez Submissions en CSV et supprimez les e-mails en double, en gardant le plus récent.
- Triez par nom, gardez
name,organisationetlunch, et imprimez deux exemplaires pour l'accueil. - Imprimez les badges depuis le même tableur avec un publipostage, à partir de la colonne
name. - 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
- Dans Allowed domains du formulaire, ajoutez le domaine de votre site, plus
localhostpendant le développement. Laissez vide pour accepter les envois de partout. - Inscrivez-vous avec votre propre e-mail, en choisissant deux sessions.
- L'e-mail de confirmation arrive depuis votre domaine et liste les deux sessions.
- Si vous avez ajouté un webhook, ouvrez l'endpoint dans Webhooks. La livraison affiche
succeededavec la réponse de votre serveur. - Lancez le décompte des places. Chacune de vos deux sessions affiche une place prise.
- 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
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.
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.
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.
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.
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.
Une étape vous bloque, ou vous voulez un guide pour votre cas ? Écrivez à hello@ikiform.com.