Inscription à un événement

Inscription à un événement8 min de lecture

Formulaire de RSVP de mariage sur votre propre site de mariage

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.

Preet SutharFondateur, Ikiform

Donnez à chaque invitation son propre lien de RSVP, qui porte un code d'invitation et les prénoms des invités, et laissez le formulaire afficher un nom et un choix de repas par invité. Chaque réponse est envoyée à Ikiform : vous recevez un e-mail pour chacune et un CSV à remettre au traiteur. Rapprochez les réponses de votre liste d'invités dans un tableur pour voir qui n'a pas répondu, et mettez le formulaire en pause après votre date limite.

Ce qui change pour un mariage

Un meetup compte des inconnus. Un mariage compte une liste d'invités que vous avez déjà, invitation par invitation. Quatre choses en découlent :

  • Une réponse par invitation, pas par personne. Un couple ou une famille répond ensemble.
  • Des invités nommés, pas un nombre d'invités. Vous avez invité Ada et Sam, pas 2. Un +1 figure sur l'invitation ou n'y figure pas.
  • Un repas par personne. Le traiteur a besoin des totaux poisson, bœuf et végétarien, plus les assiettes enfants.
  • Une date limite ferme et une liste de relances. Le lieu veut des chiffres à une date précise, et la liste utile est celle de qui n'a pas répondu.

Les services de sites de mariage comme Zola, The Knot et Joy ont des outils de RSVP construits autour d'une liste d'invités, avec recherche par nom. Si vous utilisez l'un d'eux pour votre site, utilisez son RSVP. Cette page s'adresse à un site de mariage que vous avez fait vous-même, sur Squarespace, Carrd, Framer ou en HTML simple, où vous voulez le RSVP sur votre propre page.

Ikiform n'a ni recherche dans une liste d'invités ni groupes répétables : le formulaire ne peut donc pas savoir seul qui figure sur une invitation. L'astuce consiste à mettre cette information dans le lien.

De la liste d'invités aux chiffres du traiteur, avec des liens de RSVP personnelstableurd'invitésune ligneparinvitationlienpersonnel?party=okafor&names=Ada,Sampage deRSVPun repaspar nomIkiformstocke,vousécritexportCSVongletréponsesà côtédesinvitéssansréponseàrelancertotauxdesrepaspour letraiteurformuleQR ou messageenvoiimportrapprochementDe la liste d'invités aux chiffres du traiteur, avec des liens de RSVP personnelstableur d'invitésune ligne par invitationlien personnel?party=okafor&names=Ada,Sampage de RSVPun repas par nomIkiformstocke, vous écritexport CSVonglet réponsesà côté des invitéssans réponseà relancertotaux des repaspour le traiteurformuleQR ou messageenvoiimportrapprochement
  1. Votre tableur d'invités a une ligne par invitation : un code court, le nom du foyer et les prénoms des invités.
  2. Une formule transforme chaque ligne en lien de RSVP personnel qui porte le code et les prénoms.
  3. Vous imprimez le lien en QR code sur l'invitation, ou l'envoyez dans un message.
  4. La page de RSVP lit le lien et affiche un nom et un choix de repas par invité, puis envoie à Ikiform.
  5. Vous exportez les réponses en CSV et les importez à côté de la liste d'invités.
  6. En rapprochant les codes, vous voyez quelles invitations n'ont pas répondu, et donc qui relancer.
  7. Compter chaque repas sur l'ensemble des réponses donne les totaux du traiteur.
La liste d'invités reste dans votre tableur. Le lien n'en porte que ce qu'il faut pour personnaliser le formulaire.

Dans votre tableur d'invités, mettez un code court en colonne A, comme okafor ou nguyen-family, le foyer en B, et les prénoms des invités en C, séparés par des virgules. Cette formule en D construit le lien :

Liste d'invités, colonne D
="https://ada-and-sam.example/rsvp?party=" & A2 & "&names=" & ENCODEURL(C2)

Imprimez chaque lien en QR code sur l'invitation, ou collez-le dans un message. Gardez des codes en minuscules avec des tirets ; le pattern du champ refuse tout le reste, ce qui détecte tôt un code mal saisi.

Le formulaire

Collez ceci dans votre page de mariage, ou dans un bloc d'intégration sur un créateur de sites. Il lit party et names dans le lien, ajoute une ligne nom et repas par invité, jusqu'à quatre, et se masque après la date limite. Sans prénoms dans le lien, il affiche une seule ligne à remplir.

rsvp.html
<form id="rsvp" action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <input type="hidden" name="party" id="party">
  <div id="guests"></div>
  <label>Email for updates <input name="email" type="email" autocomplete="email" required></label>
  <label>A song that gets you dancing <input name="song" maxlength="120"></label>
  <label>Anything we should know? <textarea name="note" rows="3" maxlength="1000"></textarea></label>
  <input type="hidden" name="_redirect" value="https://ada-and-sam.example/thank-you">
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden>
  <button type="submit">Send our RSVP</button>
</form>
<p id="closed" hidden>RSVPs closed on 1 May. Message us if your plans have changed.</p>

<template id="guest-row">
  <fieldset>
    <legend></legend>
    <label>Name <input data-part="name" maxlength="80" autocomplete="off"></label>
    <label>Meal
      <select data-part="meal">
        <option value="beef">Beef</option>
        <option value="fish">Fish</option>
        <option value="vegetarian">Vegetarian</option>
        <option value="child">Child's menu</option>
        <option value="not_coming">Can't come</option>
      </select>
    </label>
  </fieldset>
</template>

<script>
  const DEADLINE = new Date("2027-05-01T23:59:00+01:00");
  const params = new URLSearchParams(location.search);
  const party = (params.get("party") ?? "").toLowerCase();
  const names = (params.get("names") ?? "").split(",").map((name) => name.trim()).filter(Boolean).slice(0, 4);
  const rsvp = document.getElementById("rsvp");

  if (Date.now() > DEADLINE.getTime()) {
    rsvp.hidden = true;
    document.getElementById("closed").hidden = false;
  } else {
    document.getElementById("party").value = party;
    const rows = names.length ? names : [""];
    rows.forEach((name, index) => {
      const n = index + 1;
      const row = document.getElementById("guest-row").content.cloneNode(true);
      row.querySelector("legend").textContent = name || "Your name";
      const input = row.querySelector('[data-part="name"]');
      input.name = `guest_${n}_name`;
      input.value = name;
      input.required = n === 1;
      row.querySelector('[data-part="meal"]').name = `guest_${n}_meal`;
      document.getElementById("guests").append(row);
    });
  }
</script>
  • Le repas de chaque invité inclut Can't come, pour qu'un foyer dont une personne ne peut pas venir envoie quand même une seule réponse.
  • Les champs de nom sont pré-remplis mais modifiables, pour qu'un invité puisse corriger une orthographe ou nommer un enfant.
  • Le formulaire envoie de façon classique et arrive sur votre page de remerciement grâce à _redirect. Mettez-y la date, le lieu et un lien de calendrier ; Ikiform n'envoie pas d'e-mail à vos invités.
  • La date limite ne fait que masquer le formulaire dans le navigateur. À la date limite, choisissez aussi Pause form dans Ikiform, pour qu'un onglet resté ouvert ne puisse pas envoyer. Les formulaires en pause répondent 403 form_paused.

Collez cette définition dans l'onglet Fields du formulaire. Essayez : un code d'invitation avec une majuscule ou un espace échoue au pattern, avec le message que vous avez défini.

Aperçu

Exécute le validateur d'Ikiform dans votre navigateur. Rien n'est envoyé.

Les champs suivent l'ordre de l'invitation : le CSV contient donc le nom de chaque invité suivi de son repas. Seul le premier invité est obligatoire.

Qui n'a pas répondu, et quoi commander

  1. Exportez les RSVP en CSV depuis Submissions et importez-les dans un onglet nommé Replies du tableur de la liste d'invités.
  2. Si une invitation a répondu deux fois, gardez sa ligne la plus récente : triez par created_at, du plus récent au plus ancien, et supprimez les doublons sur la colonne party.
  3. Listez les invitations sans réponse, avec les codes en colonne A de la liste d'invités et party en colonne E de Replies :
Sans réponse
=FILTER(A2:C, A2:A <> "", ISNA(MATCH(A2:A, Replies!E2:E, 0)))

Comptez ensuite chaque repas pour le traiteur. Un prénom n'est jamais égal à une valeur de repas, donc une seule plage couvrant toutes les colonnes d'invités suffit :

Assiettes poisson
=COUNTIF(Replies!G2:N, "fish")
ChiffreComment
Personnes présentesAdditionnez les totaux de beef, fish, vegetarian et child
Ne vient pasCOUNTIF sur la même plage pour not_coming
Assiettes enfantsCOUNTIF pour child, que la plupart des traiteurs facturent à part
Remarques alimentairesLisez la colonne note. Les allergies s'y cachent
Les e-mails de notification arrivent avec l'e-mail de chaque invité en adresse de réponse, pour que vous puissiez répondre aux questions directement depuis votre boîte. Ikiform écrit à vous et à votre partenaire, pas à vos invités.

Avant d'envoyer les invitations

  • Réglez Allowed domains sur le domaine de votre site de mariage, et sur le domaine de préproduction du créateur de sites pendant vos tests.
  • Ikiform ne fusionne ni ne rejette les soumissions répétées par e-mail. Une répétition identique dans les 24 heures ne fait qu'augmenter le score de spam. Dédoublonnez là où vit la liste, ou au moment de l'export. La réponse la plus récente par code fait foi.
  • Toute personne ayant un lien peut en changer le code ou les prénoms. Pour un mariage, ce n'est pas grave : votre tableur décide qui a été invité, et la liste des sans-réponse révèle toute bizarrerie.
  • Les proches plus âgés n'utiliseront peut-être pas du tout le formulaire. Notez les réponses par téléphone et sur papier dans votre tableur pour que les totaux restent complets.

Vérifiez avant d'envoyer les invitations

  1. Ouvrez votre propre lien d'invitation sur un téléphone. Les prénoms s'affichent, chacun avec un choix de repas.
  2. Choisissez Can't come pour un invité, envoyez, et vous arrivez sur votre page de remerciement.
  3. Ouvrez Submissions dans le tableau de bord. La nouvelle soumission y est, avec tous les champs envoyés.
  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. Importez le CSV, et vérifiez que la liste des sans-réponse n'affiche plus votre code.
  6. Réglez la date limite sur hier dans une copie de test et vérifiez que le formulaire se masque.

Pièges

ProblèmeQue faire
422 avec party: Use the link from your invitationLe code contient des majuscules, des espaces ou d'autres caractères. Corrigez le code dans le tableur, ou demandez à l'invité d'utiliser son lien.
Un invité voit une ligne vide au lieu des prénomsLe lien a perdu sa partie names, souvent parce qu'une messagerie l'a raccourci. Envoyez le lien complet ou le QR code.
422 validation_failedL'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.
403 origin_not_allowed, ou tous les envois finissent en spamLe domaine de la page n'est pas dans les Allowed domains du formulaire. Ajoutez-le, plus localhost pour les tests en local. Les sous-domaines d'un domaine listé sont autorisés.
Le navigateur arrive sur la page de remerciement d'Ikiform au lieu de la vôtre_redirect est ignoré sauf si son domaine figure dans Allowed domains et qu'il s'agit d'une URL https:. Ajoutez le domaine, ou définissez plutôt Redirect after submit dans les réglages du formulaire.

Questions

Une étape vous bloque, ou vous voulez un guide pour votre cas ? Écrivez à hello@ikiform.com.