# Formulaire d'inscription des bénévoles avec créneaux, pour événements et festivals

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

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

Laissez les bénévoles cocher sur un seul formulaire tous les créneaux qu'ils peuvent assurer, avec un numéro de téléphone, une taille de T-shirt et un contact d'urgence, et envoyez-le à Ikiform. Ikiform stocke chaque inscription et prévient les coordinateurs par e-mail, mais ne remplit ni ne ferme les créneaux : lancez donc un petit script qui compte les bénévoles par créneau par rapport à vos besoins et écrit un planning. Comblez les créneaux en manque en sollicitant directement les bénévoles disponibles.

## Ce qui change avec des bénévoles

Un RSVP pose une seule question : venez-vous ? Une inscription de bénévole demande quand, et la réponse n'a de sens que face aux besoins de chaque créneau. Le montage à 7 h demande six personnes et en obtient deux ; l'après-midi ensoleillé en demande dix et en obtient dix-neuf. Il ne s'agit pas de compter des têtes, mais de couvrir les créneaux.

- **Des disponibilités, pas un choix unique.** Les gens peuvent assurer plusieurs créneaux. Demandez tous ceux qu'ils pourraient faire et affectez à partir de là, au lieu de leur faire deviner où sont les besoins.
- **Un contact pour le jour J.** L'e-mail sert à l'organisation. Le jour même, il vous faut un numéro de portable, et un contact d'urgence pour chaque bénévole.
- **Ce qu'il faut commander.** T-shirts, tours de cou et déjeuners, par taille et par nombre.
- **L'âge.** Beaucoup d'événements exigent que chaque bénévole soit majeur, ou ait l'accord d'un responsable légal. Demandez à votre organisation ce qui s'applique ; une case à cocher enregistre la réponse mais n'est pas une vérification légale.

Les plateformes de bénévolat comme SignUpGenius gèrent des inscriptions par créneau qui ferment un créneau une fois plein. Si des limites strictes par créneau sont ce qu'il vous faut, utilisez-en une. Ikiform convient aux organisateurs qui veulent le formulaire sur leur propre site et sont prêts à affecter les créneaux à la main à partir d'une liste propre.

Schéma : Transformer les disponibilités des bénévoles en planning, avec les manques visibles

1. Les bénévoles cochent sur le formulaire d'inscription tous les créneaux qu'ils pourraient assurer, et le formulaire envoie à Ikiform.
2. Ikiform stocke chaque inscription et prévient les coordinateurs par e-mail.
3. Un script lit les inscriptions via l'API et compte les bénévoles par créneau par rapport aux besoins de chacun.
4. Il écrit rota.csv avec les noms et numéros de téléphone de chaque créneau.
5. Les créneaux en manque apparaissent tout de suite, comme le montage à 2 sur 6, pour que vous puissiez solliciter des bénévoles disponibles ailleurs.

Ikiform conserve les disponibilités. Le script les transforme en couverture, et un coordinateur prend les décisions finales.

## Le formulaire

Regroupez les créneaux par jour pour qu'on les parcoure facilement. Les cases à cocher s'appellent `shifts[]`, donc même une seule case cochée est stockée comme une liste. Cela fonctionne en HTML simple sur n'importe quel site ou créateur de sites qui accepte une intégration :

`volunteer.html`:

```html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label>Name <input name="name" autocomplete="name" required></label>
  <label>Email <input name="email" type="email" autocomplete="email" required></label>
  <label>Mobile number for the day <input name="phone" type="tel" autocomplete="tel" placeholder="+44 7700 900123" required></label>

  <fieldset>
    <legend>Shifts you can do</legend>
    <p>Saturday</p>
    <label><input type="checkbox" name="shifts[]" value="sat_setup"> 7:00 to 10:00, setup</label>
    <label><input type="checkbox" name="shifts[]" value="sat_day"> 10:00 to 14:00</label>
    <label><input type="checkbox" name="shifts[]" value="sat_late"> 14:00 to 18:00</label>
    <p>Sunday</p>
    <label><input type="checkbox" name="shifts[]" value="sun_day"> 10:00 to 14:00</label>
    <label><input type="checkbox" name="shifts[]" value="sun_pack"> 14:00 to 17:00, pack-down</label>
  </fieldset>

  <label>Where you'd like to help
    <select name="role">
      <option value="anywhere">Anywhere</option>
      <option value="welcome">Welcome desk</option>
      <option value="food">Food stall</option>
      <option value="stewarding">Stewarding</option>
    </select>
  </label>
  <label>T-shirt size
    <select name="tshirt" required>
      <option value="s">S</option><option value="m" selected>M</option><option value="l">L</option>
      <option value="xl">XL</option><option value="xxl">XXL</option>
    </select>
  </label>
  <label>Emergency contact name and number <input name="emergency_contact" required maxlength="160"></label>
  <label><input type="checkbox" name="adult" required> I'm 18 or over, or a parent or guardian is filling this in with me</label>

  <input type="hidden" name="_redirect" value="https://fair.example/volunteers/thanks">
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>
  <button type="submit">Sign me up</button>
</form>
```

Collez cette définition dans l'onglet **Fields** du formulaire. Le serveur refuse alors une inscription sans créneau, avec un numéro de téléphone invalide ou une case d'âge non cochée, quelle que soit la page d'origine :

Formulaire : Volunteer signup

- **Nom** (`name`, text, obligatoire)
- **E-mail** (`email`, email, obligatoire)
- **Numéro de portable pour le jour J** (`phone`, phone, obligatoire)
- **Créneaux possibles** (`shifts`, multi_select, obligatoire)
- **Où aimeriez-vous aider** (`role`, select)
- **Taille de T-shirt** (`tshirt`, select, obligatoire)
- **Nom et numéro du contact d'urgence** (`emergency_contact`, text, obligatoire)
- **J'ai 18 ans ou plus, ou un parent ou responsable légal remplit ceci avec moi** (`adult`, checkbox, obligatoire)

`shifts` est un `multi_select` avec `min_items: 1`. `phone` est un champ `phone`, qui vérifie la forme du numéro. `adult` doit être coché.

| Champ | Pourquoi ce champ |
| --- | --- |
| `phone` | Envoyer les changements de créneau par SMS et joindre les gens le jour J |
| `shifts` | Les disponibilités à partir desquelles vous affectez |
| `role` | Les préférences, pour que l'accueil ait les personnes qui l'ont demandé |
| `tshirt` | La commande à passer deux semaines avant |
| `emergency_contact` | Pour l'équipe de secours, pas pour le marketing |
| `adult` | La règle d'âge de votre organisation, enregistrée dans une soumission qui garde son propre `created_at` |

> Les numéros de téléphone et les contacts d'urgence sont des données personnelles sur des personnes qui ne s'inscrivent pas elles-mêmes. Gardez l'export dans un endroit privé, ne partagez le planning qu'avec les responsables de créneau, et supprimez les soumissions après l'événement.

## Construire le planning et voir les manques

Lancez ceci avec Node et une clé d'API secrète dès que vous voulez une vue d'ensemble. Le script prend l'inscription la plus récente de chaque bénévole, affiche chaque créneau comme complet, en manque ou en surplus, et écrit `rota.csv` avec les noms et numéros de chaque créneau :

`rota.ts`:

```ts
import { writeFileSync } from "node:fs";
import { createClient } from "@ikiform/sdk";

const NEEDED: Record<string, number> = { sat_setup: 6, sat_day: 10, sat_late: 10, sun_day: 8, sun_pack: 6 };
const ikiform = createClient({ apiKey: process.env.IKIFORM_SECRET_KEY! });
const people = new Map<string, Record<string, unknown>>();

for await (const submission of ikiform.submissions.iterate({ formId: "frm_xxxxxxxxxxxxxxxx", status: "received", limit: 100 })) {
  const email = String(submission.fields.email ?? "").trim().toLowerCase();
  if (email && !people.has(email)) people.set(email, submission.fields);
}

const cell = (value: unknown) => `"${String(value ?? "").replaceAll('"', '""')}"`;
const rows = [["shift", "name", "phone", "role", "tshirt"].join(",")];

for (const [shift, needed] of Object.entries(NEEDED)) {
  const team = [...people.values()].filter((fields) => (fields.shifts as string[] | undefined)?.includes(shift));
  const state = team.length < needed ? `SHORT ${needed - team.length}` : team.length > needed ? "spare" : "ok";
  console.log(`${shift.padEnd(10)} ${team.length}/${needed} ${state}`);
  for (const fields of team) {
    rows.push([shift, fields.name, fields.phone, fields.role, fields.tshirt].map(cell).join(","));
  }
}

writeFileSync("rota.csv", `${rows.join("\n")}\n`);
```

- Les listes arrivent de la plus récente à la plus ancienne : un bénévole qui se réinscrit avec d'autres disponibilités est donc compté selon sa dernière réponse.
- Une personne apparaît sous chaque créneau qu'elle a coché. Ce sont des disponibilités. Réduisez-les à des affectations dans le CSV, et annoncez à chacun ses créneaux définitifs.
- Les virgules et guillemets dans les noms sont échappés, le CSV s'ouvre donc proprement dans n'importe quel tableur.

Pour un coup d'œil rapide sans code, exportez le CSV depuis **Submissions** et filtrez la colonne `shifts` sur la valeur d'un créneau, comme `sat_setup`. Dans l'export, les valeurs à choix multiples sont regroupées dans une seule cellule.

## Des disponibilités aux affectations

1. Deux semaines avant, lancez le planning et commandez les T-shirts d'après les totaux de `tshirt`.
2. Pour chaque créneau en manque, écrivez aux bénévoles disponibles qui ont aussi coché ce créneau. Ils ont déjà dit qu'ils pouvaient.
3. Envoyez à chaque bénévole ses créneaux définitifs depuis votre outil d'e-mail ou de messagerie. Le bouton **Reply** de l'e-mail de notification leur répond directement.
4. La veille, imprimez le planning pour les responsables de créneau, avec les numéros de téléphone.

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). Les bénévoles oublient pour quoi ils se sont inscrits : envoyez donc le planning définitif personnellement une semaine avant, puis la veille au soir.

Pour être prévenu de chaque inscription là où votre équipe discute déjà, envoyez le webhook vers [Slack](https://ikiform.com/blog/form-submissions-to-slack.md) ou [Discord](https://ikiform.com/blog/form-submissions-to-discord.md). Les coordinateurs voient alors un créneau en manque se remplir en temps réel.

## Vérifiez avant de recruter

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 en cochant un seul créneau. Dans le tableau de bord, `shifts` est une liste avec une seule valeur.
3. Essayez de vous inscrire sans créneau, ou sans cocher la case d'âge. Le navigateur vous en empêche, et un envoi forgé reçoit `422`.
4. Vérifiez la boîte de réception de chaque destinataire des notifications. Chacun reçoit un e-mail avec les champs, et **Reply** répond à l'expéditeur quand le formulaire a un champ `email`.
5. Lancez le script de planning. Votre test apparaît sous son créneau, et tous les autres créneaux apparaissent en manque.
6. Ouvrez `rota.csv` dans un tableur et vérifiez la colonne des numéros de téléphone.

## Pièges

| Problème | Que faire |
| --- | --- |
| Un créneau unique est stocké comme texte, pas comme liste | Les cases à cocher s'appellent `shifts` sans `[]`, et aucun champ n'est défini. Renommez-les en `shifts[]`, ou définissez `shifts` comme `multi_select`. |
| `422` sur `phone` | Le numéro ne ressemble pas à un numéro de téléphone. Demandez l'indicatif pays dans le texte d'aide, comme le fait la définition. |
| Un bénévole apparaît deux fois dans le planning | Il s'est inscrit avec deux e-mails différents. Fusionnez à la main ; le script se base sur l'e-mail. |
| `422 validation_failed` | L'envoi ne correspond pas à la définition des champs du formulaire. `error.fields` nomme chaque champ et la raison. Faites correspondre le `name` de l'input à l'id du champ. |
| `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

### Ikiform peut-il fermer un créneau quand il est complet ?

Non. Ikiform n'a pas de limite par option. Demandez les disponibilités, comptez les bénévoles par créneau avec un script ou un tableur, et affectez les gens vous-même. Utilisez un outil d'inscription par créneau si des limites strictes comptent davantage.

### Comment recueillir plusieurs créneaux pour un même bénévole ?

Utilisez des cases à cocher nommées shifts[] et définissez shifts comme un champ multi_select. Chaque créneau coché est stocké dans une seule liste, et min_items : 1 en rend au moins un obligatoire.

### Les bénévoles peuvent-ils changer de créneaux ?

Demandez-leur de se réinscrire avec le même e-mail. Le script de planning utilise l'inscription la plus récente de chaque bénévole, la nouvelle disponibilité remplace donc l'ancienne.

### Ikiform peut-il envoyer un e-mail à la personne qui a rempli le formulaire ?

Non. Ikiform envoie des e-mails à vous et à votre équipe, pas à l'expéditeur : il n'y a donc ni réponse automatique ni e-mail de confirmation. Envoyez un webhook à votre outil d'e-mailing et envoyez la confirmation depuis celui-ci.

### 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.
- [Sans Eventbrite](https://ikiform.com/fr/guides/event-registration/without-eventbrite.md): 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.
- [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.
