Event registration form template
Attendee details, how they will attend, and the two questions organisers always forget to ask.
Reviewed by Ritu Fadadu · Last reviewed
Preview and code
Preview
Code — replace YOUR_ENDPOINT_ID with your form's ID
<style>
.fb-form { display: grid; gap: 1rem; max-width: 36rem; }
.fb-field { display: flex; flex-direction: column; gap: 0.375rem; }
.fb-fieldset { margin: 0; padding: 0; border: 0; min-width: 0; }
.fb-label { font-weight: 600; }
.fb-optional { font-weight: 400; color: #6b7280; }
.fb-help { margin: 0; font-size: 0.875rem; color: #6b7280; }
.fb-input { box-sizing: border-box; width: 100%; padding: 0.625rem 0.75rem; border: 1px solid #d1d5db; border-radius: 0.5rem; background: #fff; color: #111827; font: inherit; }
.fb-input:focus { border-color: #2563eb; outline: 2px solid #2563eb; outline-offset: 1px; }
.fb-options { display: flex; flex-direction: column; gap: 0.5rem; }
.fb-option { display: flex; align-items: center; gap: 0.5rem; }
.fb-check { width: 1.125rem; height: 1.125rem; margin: 0; accent-color: #2563eb; }
.fb-button { justify-self: start; min-height: 44px; padding: 0.625rem 1.25rem; border: 0; border-radius: 0.5rem; background: #2563eb; color: #fff; font: inherit; font-weight: 600; cursor: pointer; }
.fb-button:hover { background: #1d4ed8; }
.fb-button:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }
.fb-button:disabled { opacity: 0.6; cursor: wait; }
.fb-status { margin: 0; min-height: 1.5em; }
@media (min-width: 640px) {
.fb-form { grid-template-columns: 1fr 1fr; }
.fb-field, .fb-button, .fb-status { grid-column: 1 / -1; }
.fb-field--half { grid-column: auto; }
}
</style>
<form id="fb-form" class="fb-form" action="https://formboost.app/f/YOUR_ENDPOINT_ID" method="POST">
<div class="fb-field fb-field--half">
<label for="fb-name" class="fb-label">Full name</label>
<input type="text" id="fb-name" name="name" class="fb-input" required autocomplete="name">
</div>
<div class="fb-field">
<label for="fb-email" class="fb-label">Email</label>
<input type="email" id="fb-email" name="email" class="fb-input" required autocomplete="email">
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">How will you attend?</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="attendance" value="in-person" class="fb-check" required>
<span>In person</span>
</label>
<label class="fb-option">
<input type="radio" name="attendance" value="online" class="fb-check" required>
<span>Online</span>
</label>
</div>
</fieldset>
<div class="fb-field fb-field--half">
<label for="fb-company" class="fb-label">
Company or organisation
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-company" name="company" class="fb-input" autocomplete="organization">
</div>
<div class="fb-field fb-field--half">
<label for="fb-dietary" class="fb-label">
Dietary requirements
<span class="fb-optional">(optional)</span>
</label>
<select id="fb-dietary" name="dietary" class="fb-input">
<option value="">Choose…</option>
<option value="none">None</option>
<option value="vegetarian">Vegetarian</option>
<option value="vegan">Vegan</option>
<option value="gluten-free">Gluten-free</option>
<option value="other-tell-us-below">Other (tell us below)</option>
</select>
</div>
<div class="fb-field">
<label for="fb-access" class="fb-label">
Accessibility or other requirements
<span class="fb-optional">(optional)</span>
</label>
<textarea id="fb-access" name="access" class="fb-input" rows="3"></textarea>
</div>
<div class="fb-field">
<label class="fb-option">
<input type="checkbox" id="fb-updates" name="updates" value="yes" class="fb-check">
<span>Email me updates about this event <span class="fb-optional">(optional)</span></span>
</label>
</div>
<input type="hidden" name="event" value="launch-meetup-2026">
<!-- Honeypot: keep it hidden. People never see it; bots fill it in and get flagged as spam. -->
<div
aria-hidden="true"
style="position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden"
>
<label for="fb-honey">Leave this field empty</label>
<input type="text" id="fb-honey" name="_honey" tabindex="-1" autocomplete="off">
</div>
<input type="hidden" name="_subject" value="New event registration">
<button type="submit" class="fb-button">Register</button>
</form>
<style>
.fb-form { display: grid; gap: 1rem; max-width: 36rem; }
.fb-field { display: flex; flex-direction: column; gap: 0.375rem; }
.fb-fieldset { margin: 0; padding: 0; border: 0; min-width: 0; }
.fb-label { font-weight: 600; }
.fb-optional { font-weight: 400; color: #6b7280; }
.fb-help { margin: 0; font-size: 0.875rem; color: #6b7280; }
.fb-input { box-sizing: border-box; width: 100%; padding: 0.625rem 0.75rem; border: 1px solid #d1d5db; border-radius: 0.5rem; background: #fff; color: #111827; font: inherit; }
.fb-input:focus { border-color: #2563eb; outline: 2px solid #2563eb; outline-offset: 1px; }
.fb-options { display: flex; flex-direction: column; gap: 0.5rem; }
.fb-option { display: flex; align-items: center; gap: 0.5rem; }
.fb-check { width: 1.125rem; height: 1.125rem; margin: 0; accent-color: #2563eb; }
.fb-button { justify-self: start; min-height: 44px; padding: 0.625rem 1.25rem; border: 0; border-radius: 0.5rem; background: #2563eb; color: #fff; font: inherit; font-weight: 600; cursor: pointer; }
.fb-button:hover { background: #1d4ed8; }
.fb-button:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }
.fb-button:disabled { opacity: 0.6; cursor: wait; }
.fb-status { margin: 0; min-height: 1.5em; }
@media (min-width: 640px) {
.fb-form { grid-template-columns: 1fr 1fr; }
.fb-field, .fb-button, .fb-status { grid-column: 1 / -1; }
.fb-field--half { grid-column: auto; }
}
</style>
<form id="fb-form" class="fb-form" action="https://formboost.app/f/YOUR_ENDPOINT_ID" method="POST">
<div class="fb-field fb-field--half">
<label for="fb-name" class="fb-label">Full name</label>
<input type="text" id="fb-name" name="name" class="fb-input" required autocomplete="name">
</div>
<div class="fb-field">
<label for="fb-email" class="fb-label">Email</label>
<input type="email" id="fb-email" name="email" class="fb-input" required autocomplete="email">
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">How will you attend?</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="attendance" value="in-person" class="fb-check" required>
<span>In person</span>
</label>
<label class="fb-option">
<input type="radio" name="attendance" value="online" class="fb-check" required>
<span>Online</span>
</label>
</div>
</fieldset>
<div class="fb-field fb-field--half">
<label for="fb-company" class="fb-label">
Company or organisation
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-company" name="company" class="fb-input" autocomplete="organization">
</div>
<div class="fb-field fb-field--half">
<label for="fb-dietary" class="fb-label">
Dietary requirements
<span class="fb-optional">(optional)</span>
</label>
<select id="fb-dietary" name="dietary" class="fb-input">
<option value="">Choose…</option>
<option value="none">None</option>
<option value="vegetarian">Vegetarian</option>
<option value="vegan">Vegan</option>
<option value="gluten-free">Gluten-free</option>
<option value="other-tell-us-below">Other (tell us below)</option>
</select>
</div>
<div class="fb-field">
<label for="fb-access" class="fb-label">
Accessibility or other requirements
<span class="fb-optional">(optional)</span>
</label>
<textarea id="fb-access" name="access" class="fb-input" rows="3"></textarea>
</div>
<div class="fb-field">
<label class="fb-option">
<input type="checkbox" id="fb-updates" name="updates" value="yes" class="fb-check">
<span>Email me updates about this event <span class="fb-optional">(optional)</span></span>
</label>
</div>
<input type="hidden" name="event" value="launch-meetup-2026">
<!-- Honeypot: keep it hidden. People never see it; bots fill it in and get flagged as spam. -->
<div
aria-hidden="true"
style="position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden"
>
<label for="fb-honey">Leave this field empty</label>
<input type="text" id="fb-honey" name="_honey" tabindex="-1" autocomplete="off">
</div>
<input type="hidden" name="_subject" value="New event registration">
<button type="submit" class="fb-button">Register</button>
<p class="fb-status" role="status" aria-live="polite" data-fb-status></p>
</form>
<script>
document.getElementById("fb-form").addEventListener("submit", async (event) => {
event.preventDefault();
const form = event.currentTarget;
const status = form.querySelector("[data-fb-status]");
const button = form.querySelector('button[type="submit"]');
const fields = new FormData(form);
// Formboost accepts JSON or url-encoded bodies, not multipart, so send JSON.
const data = Object.fromEntries(fields);
// Makes the notification email replyable; the address still shows in the field table.
if (data.email) data._replyto = data.email;
button.disabled = true;
status.textContent = "Sending…";
try {
const response = await fetch(form.action, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(data),
});
if (response.ok) {
form.reset();
status.textContent = "You're registered — see you there.";
} else if (response.status === 429) {
status.textContent = "Too many attempts. Please wait a minute and try again.";
} else {
status.textContent = "Something went wrong. Please try again.";
}
} catch {
status.textContent = "Could not send. Check your connection and try again.";
} finally {
button.disabled = false;
}
});
</script>
import { useState } from "react";
// Your form's endpoint, from the Formboost dashboard.
const ENDPOINT = "https://formboost.app/f/YOUR_ENDPOINT_ID";
export default function EventRegistrationForm() {
const [sending, setSending] = useState(false);
const [message, setMessage] = useState("");
async function handleSubmit(event) {
event.preventDefault();
const form = event.currentTarget;
const fields = new FormData(form);
// Formboost accepts JSON or url-encoded bodies, not multipart, so send JSON.
const data = Object.fromEntries(fields);
// Makes the notification email replyable; the address still shows in the field table.
if (data.email) data._replyto = data.email;
setSending(true);
setMessage("Sending…");
try {
const response = await fetch(ENDPOINT, {
method: "POST",
headers: { "Content-Type": "application/json", Accept: "application/json" },
body: JSON.stringify(data),
});
if (response.ok) {
form.reset();
setMessage("You're registered — see you there.");
} else if (response.status === 429) {
setMessage("Too many attempts. Please wait a minute and try again.");
} else {
setMessage("Something went wrong. Please try again.");
}
} catch {
setMessage("Could not send. Check your connection and try again.");
} finally {
setSending(false);
}
}
return (
<form
className="grid max-w-xl gap-4 sm:grid-cols-2"
action={ENDPOINT}
method="POST"
onSubmit={handleSubmit}
>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-name" className="text-sm font-semibold text-gray-900">Full name</label>
<input
type="text"
id="fb-name"
name="name"
className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
required
autoComplete="name"
/>
</div>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-email" className="text-sm font-semibold text-gray-900">Email</label>
<input
type="email"
id="fb-email"
name="email"
className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
required
autoComplete="email"
/>
</div>
<fieldset className="flex flex-col gap-1.5 sm:col-span-2 m-0 min-w-0 border-0 p-0">
<legend className="text-sm font-semibold text-gray-900">How will you attend?</legend>
<div className="flex flex-col gap-2">
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="attendance"
value="in-person"
className="h-4 w-4 accent-blue-600"
required
/>
<span>In person</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="attendance"
value="online"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Online</span>
</label>
</div>
</fieldset>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-company" className="text-sm font-semibold text-gray-900">
Company or organisation
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-company"
name="company"
className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
autoComplete="organization"
/>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-dietary" className="text-sm font-semibold text-gray-900">
Dietary requirements
<span className="font-normal text-gray-500">(optional)</span>
</label>
<select
id="fb-dietary"
name="dietary"
className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
>
<option value="">Choose…</option>
<option value="none">None</option>
<option value="vegetarian">Vegetarian</option>
<option value="vegan">Vegan</option>
<option value="gluten-free">Gluten-free</option>
<option value="other-tell-us-below">Other (tell us below)</option>
</select>
</div>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-access" className="text-sm font-semibold text-gray-900">
Accessibility or other requirements
<span className="font-normal text-gray-500">(optional)</span>
</label>
<textarea
id="fb-access"
name="access"
className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
rows={3}
></textarea>
</div>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label className="flex items-center gap-2 text-gray-800">
<input
type="checkbox"
id="fb-updates"
name="updates"
value="yes"
className="h-4 w-4 accent-blue-600"
/>
<span>
Email me updates about this event
<span className="font-normal text-gray-500">(optional)</span>
</span>
</label>
</div>
<input type="hidden" name="event" defaultValue="launch-meetup-2026" />
{/* Honeypot: keep it hidden. People never see it; bots fill it in and get flagged as spam. */}
<div
aria-hidden="true"
style={{ position: "absolute", left: "-9999px", width: "1px", height: "1px", overflow: "hidden" }}
>
<label htmlFor="fb-honey">Leave this field empty</label>
<input type="text" id="fb-honey" name="_honey" tabIndex={-1} autoComplete="off" />
</div>
<input type="hidden" name="_subject" defaultValue="New event registration" />
<button
type="submit"
className="min-h-11 justify-self-start rounded-lg bg-blue-600 px-5 py-2.5 font-semibold text-white hover:bg-blue-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 disabled:opacity-60 sm:col-span-2"
disabled={sending}
>
Register
</button>
<p className="min-h-6 text-sm text-gray-700 sm:col-span-2" role="status" aria-live="polite">
{message}
</p>
</form>
);
}
<form
id="fb-form"
class="grid max-w-xl gap-4 sm:grid-cols-2"
action="https://formboost.app/f/YOUR_ENDPOINT_ID"
method="POST"
>
<div class="flex flex-col gap-1.5">
<label for="fb-name" class="text-sm font-semibold text-gray-900">Full name</label>
<input
type="text"
id="fb-name"
name="name"
class="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
required
autocomplete="name"
>
</div>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-email" class="text-sm font-semibold text-gray-900">Email</label>
<input
type="email"
id="fb-email"
name="email"
class="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
required
autocomplete="email"
>
</div>
<fieldset class="flex flex-col gap-1.5 sm:col-span-2 m-0 min-w-0 border-0 p-0">
<legend class="text-sm font-semibold text-gray-900">How will you attend?</legend>
<div class="flex flex-col gap-2">
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="attendance"
value="in-person"
class="h-4 w-4 accent-blue-600"
required
>
<span>In person</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="attendance"
value="online"
class="h-4 w-4 accent-blue-600"
required
>
<span>Online</span>
</label>
</div>
</fieldset>
<div class="flex flex-col gap-1.5">
<label for="fb-company" class="text-sm font-semibold text-gray-900">
Company or organisation
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-company"
name="company"
class="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
autocomplete="organization"
>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-dietary" class="text-sm font-semibold text-gray-900">
Dietary requirements
<span class="font-normal text-gray-500">(optional)</span>
</label>
<select
id="fb-dietary"
name="dietary"
class="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
>
<option value="">Choose…</option>
<option value="none">None</option>
<option value="vegetarian">Vegetarian</option>
<option value="vegan">Vegan</option>
<option value="gluten-free">Gluten-free</option>
<option value="other-tell-us-below">Other (tell us below)</option>
</select>
</div>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-access" class="text-sm font-semibold text-gray-900">
Accessibility or other requirements
<span class="font-normal text-gray-500">(optional)</span>
</label>
<textarea
id="fb-access"
name="access"
class="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
rows="3"
></textarea>
</div>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label class="flex items-center gap-2 text-gray-800">
<input
type="checkbox"
id="fb-updates"
name="updates"
value="yes"
class="h-4 w-4 accent-blue-600"
>
<span>
Email me updates about this event
<span class="font-normal text-gray-500">(optional)</span>
</span>
</label>
</div>
<input type="hidden" name="event" value="launch-meetup-2026">
<!-- Honeypot: keep it hidden. People never see it; bots fill it in and get flagged as spam. -->
<div
aria-hidden="true"
style="position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden"
>
<label for="fb-honey">Leave this field empty</label>
<input type="text" id="fb-honey" name="_honey" tabindex="-1" autocomplete="off">
</div>
<input type="hidden" name="_subject" value="New event registration">
<button
type="submit"
class="min-h-11 justify-self-start rounded-lg bg-blue-600 px-5 py-2.5 font-semibold text-white hover:bg-blue-700 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 disabled:opacity-60 sm:col-span-2"
>
Register
</button>
</form>
About this template
A registration form has one job: tell you who is coming and what they need. This template collects the attendee, whether they will be there in person or online, dietary needs and access requirements — the last two are the questions organisers most often have to chase by email afterwards.
A hidden event field names the event. Reuse the same form for every meetup or webinar, change that one value, and each registration arrives labelled. That is also what lets you filter a single event's list in the CSV export.
This is a registration form, not a ticketing system: it does not take payment or cap the number of places. For a free event or a waitlist that is all you need, and you confirm places from your inbox.
Fields in this template
| Field | Name | Type | Required | Why it is there |
|---|---|---|---|---|
| Full name | name | Short text | Yes | Required, with autocomplete="name" so phones fill it in. |
email | Yes | Required. Named email, so Auto Reply can send a confirmation on Starter and above. | ||
| How will you attend? | attendance | Single choice | Yes | Required. Splits the list for catering and for sending the joining link. |
| Company or organisation | company | Short text | No | Optional. Useful for name badges and for sponsors. |
| Dietary requirements | dietary | Dropdown | No | Optional dropdown; “Other” points people to the free-text box. |
| Accessibility or other requirements | access | Long text | No | Optional free text for anything else you need to plan for. |
| Email me updates about this event | updates | Checkbox | No | An unticked-by-default checkbox, so consent to further email is a deliberate choice. |
| (hidden) | event | Hidden value | No | Hidden. One form, many events. |
Each name becomes a column in your dashboard and a row in the notification email. The hidden _honey field is the honeypot; _subject sets the email's subject line. Both are reserved fields and never appear in the field table.
Make it yours
- Change
eventper event, or set it from the page with a line of JavaScript. - Add a
sessionsingle-choice question if the event has parallel tracks. - Point a custom redirect at a page with the venue, the calendar link and what to bring.
Where the submissions go
- Each registration is stored and emailed to the organiser; export the list to CSV for check-in on any plan.
- On Starter and above, Auto Reply confirms the registration to the attendee straight away; on Pro the reply can greet them by name with a
{{name}}variable. - Send registrations to Google Sheets (Starter and above) to share a live attendee list with co-organisers.
Event Registration: plans, destinations and a worked setup →
Before you publish it
- Create a form in the Formboost dashboard and replace
YOUR_ENDPOINT_IDwith its ID. - Pick one variant: HTML posts and reloads, HTML + JS and React send JSON with
fetch()and stay on the page. - For the plain HTML version, add a hidden
_redirectwith anhttps://thank-you page on the same site as the form — anything else falls back to Formboost's page. - Submit it once from the live page and check the submission in your dashboard. Every request is acknowledged, so the dashboard is the real test. Troubleshooting covers the rest.
More form templates
Appointment request form template
A preferred date and time, a second choice and the reason for the visit — a request you confirm, not a calendar.
Survey form template
Four question types — a 0–10 score, single choice, multiple choice and an open answer — in one page.
Newsletter signup form template
Email, first name, the topics they want, and consent that is a real choice.
All form templates
Every template, in HTML, React and Tailwind.
Put the event registration form live
Free forever: 500 submissions a month across 10 forms, no card.