Registration form template
Personal details, address, the course or programme, and agreement to the terms.
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-first_name" class="fb-label">First name</label>
<input
type="text"
id="fb-first_name"
name="first_name"
class="fb-input"
required
autocomplete="given-name"
>
</div>
<div class="fb-field fb-field--half">
<label for="fb-last_name" class="fb-label">Last name</label>
<input
type="text"
id="fb-last_name"
name="last_name"
class="fb-input"
required
autocomplete="family-name"
>
</div>
<div class="fb-field fb-field--half">
<label for="fb-email" class="fb-label">Email</label>
<input type="email" id="fb-email" name="email" class="fb-input" required autocomplete="email">
</div>
<div class="fb-field fb-field--half">
<label for="fb-phone" class="fb-label">Phone <span class="fb-optional">(optional)</span></label>
<input type="tel" id="fb-phone" name="phone" class="fb-input" autocomplete="tel">
</div>
<div class="fb-field fb-field--half">
<label for="fb-date_of_birth" class="fb-label">
Date of birth
<span class="fb-optional">(optional)</span>
</label>
<input
type="date"
id="fb-date_of_birth"
name="date_of_birth"
class="fb-input"
autocomplete="bday"
>
</div>
<div class="fb-field fb-field--half">
<label for="fb-programme" class="fb-label">Course or programme</label>
<select id="fb-programme" name="programme" class="fb-input" required>
<option value="">Choose…</option>
<option value="beginner-course">Beginner course</option>
<option value="intermediate-course">Intermediate course</option>
<option value="advanced-course">Advanced course</option>
</select>
</div>
<div class="fb-field">
<label for="fb-street" class="fb-label">
Street address
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-street" name="street" class="fb-input" autocomplete="street-address">
</div>
<div class="fb-field fb-field--half">
<label for="fb-city" class="fb-label">
Town or city
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-city" name="city" class="fb-input" autocomplete="address-level2">
</div>
<div class="fb-field fb-field--half">
<label for="fb-postcode" class="fb-label">
Postcode
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-postcode" name="postcode" class="fb-input" autocomplete="postal-code">
</div>
<div class="fb-field">
<label for="fb-heard_from" class="fb-label">
How did you hear about us?
<span class="fb-optional">(optional)</span>
</label>
<select id="fb-heard_from" name="heard_from" class="fb-input">
<option value="">Choose…</option>
<option value="search">Search</option>
<option value="friend-or-colleague">Friend or colleague</option>
<option value="social-media">Social media</option>
<option value="other">Other</option>
</select>
</div>
<div class="fb-field">
<label class="fb-option">
<input type="checkbox" id="fb-terms" name="terms" value="yes" class="fb-check" required>
<span>I agree to the terms and conditions</span>
</label>
</div>
<!-- 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 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-first_name" class="fb-label">First name</label>
<input
type="text"
id="fb-first_name"
name="first_name"
class="fb-input"
required
autocomplete="given-name"
>
</div>
<div class="fb-field fb-field--half">
<label for="fb-last_name" class="fb-label">Last name</label>
<input
type="text"
id="fb-last_name"
name="last_name"
class="fb-input"
required
autocomplete="family-name"
>
</div>
<div class="fb-field fb-field--half">
<label for="fb-email" class="fb-label">Email</label>
<input type="email" id="fb-email" name="email" class="fb-input" required autocomplete="email">
</div>
<div class="fb-field fb-field--half">
<label for="fb-phone" class="fb-label">Phone <span class="fb-optional">(optional)</span></label>
<input type="tel" id="fb-phone" name="phone" class="fb-input" autocomplete="tel">
</div>
<div class="fb-field fb-field--half">
<label for="fb-date_of_birth" class="fb-label">
Date of birth
<span class="fb-optional">(optional)</span>
</label>
<input
type="date"
id="fb-date_of_birth"
name="date_of_birth"
class="fb-input"
autocomplete="bday"
>
</div>
<div class="fb-field fb-field--half">
<label for="fb-programme" class="fb-label">Course or programme</label>
<select id="fb-programme" name="programme" class="fb-input" required>
<option value="">Choose…</option>
<option value="beginner-course">Beginner course</option>
<option value="intermediate-course">Intermediate course</option>
<option value="advanced-course">Advanced course</option>
</select>
</div>
<div class="fb-field">
<label for="fb-street" class="fb-label">
Street address
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-street" name="street" class="fb-input" autocomplete="street-address">
</div>
<div class="fb-field fb-field--half">
<label for="fb-city" class="fb-label">
Town or city
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-city" name="city" class="fb-input" autocomplete="address-level2">
</div>
<div class="fb-field fb-field--half">
<label for="fb-postcode" class="fb-label">
Postcode
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-postcode" name="postcode" class="fb-input" autocomplete="postal-code">
</div>
<div class="fb-field">
<label for="fb-heard_from" class="fb-label">
How did you hear about us?
<span class="fb-optional">(optional)</span>
</label>
<select id="fb-heard_from" name="heard_from" class="fb-input">
<option value="">Choose…</option>
<option value="search">Search</option>
<option value="friend-or-colleague">Friend or colleague</option>
<option value="social-media">Social media</option>
<option value="other">Other</option>
</select>
</div>
<div class="fb-field">
<label class="fb-option">
<input type="checkbox" id="fb-terms" name="terms" value="yes" class="fb-check" required>
<span>I agree to the terms and conditions</span>
</label>
</div>
<!-- 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 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 — we'll email you the details.";
} 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 RegistrationForm() {
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 — we'll email you the details.");
} 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-first_name" className="text-sm font-semibold text-gray-900">
First name
</label>
<input
type="text"
id="fb-first_name"
name="first_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="given-name"
/>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-last_name" className="text-sm font-semibold text-gray-900">
Last name
</label>
<input
type="text"
id="fb-last_name"
name="last_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="family-name"
/>
</div>
<div className="flex flex-col gap-1.5">
<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>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-phone" className="text-sm font-semibold text-gray-900">
Phone
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="tel"
id="fb-phone"
name="phone"
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="tel"
/>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-date_of_birth" className="text-sm font-semibold text-gray-900">
Date of birth
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="date"
id="fb-date_of_birth"
name="date_of_birth"
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="bday"
/>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-programme" className="text-sm font-semibold text-gray-900">
Course or programme
</label>
<select
id="fb-programme"
name="programme"
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
>
<option value="">Choose…</option>
<option value="beginner-course">Beginner course</option>
<option value="intermediate-course">Intermediate course</option>
<option value="advanced-course">Advanced course</option>
</select>
</div>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-street" className="text-sm font-semibold text-gray-900">
Street address
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-street"
name="street"
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="street-address"
/>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-city" className="text-sm font-semibold text-gray-900">
Town or city
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-city"
name="city"
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="address-level2"
/>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-postcode" className="text-sm font-semibold text-gray-900">
Postcode
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-postcode"
name="postcode"
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="postal-code"
/>
</div>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-heard_from" className="text-sm font-semibold text-gray-900">
How did you hear about us?
<span className="font-normal text-gray-500">(optional)</span>
</label>
<select
id="fb-heard_from"
name="heard_from"
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="search">Search</option>
<option value="friend-or-colleague">Friend or colleague</option>
<option value="social-media">Social media</option>
<option value="other">Other</option>
</select>
</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-terms"
name="terms"
value="yes"
className="h-4 w-4 accent-blue-600"
required
/>
<span>I agree to the terms and conditions</span>
</label>
</div>
{/* 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 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-first_name" class="text-sm font-semibold text-gray-900">First name</label>
<input
type="text"
id="fb-first_name"
name="first_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="given-name"
>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-last_name" class="text-sm font-semibold text-gray-900">Last name</label>
<input
type="text"
id="fb-last_name"
name="last_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="family-name"
>
</div>
<div class="flex flex-col gap-1.5">
<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>
<div class="flex flex-col gap-1.5">
<label for="fb-phone" class="text-sm font-semibold text-gray-900">
Phone
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="tel"
id="fb-phone"
name="phone"
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="tel"
>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-date_of_birth" class="text-sm font-semibold text-gray-900">
Date of birth
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="date"
id="fb-date_of_birth"
name="date_of_birth"
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="bday"
>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-programme" class="text-sm font-semibold text-gray-900">
Course or programme
</label>
<select
id="fb-programme"
name="programme"
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
>
<option value="">Choose…</option>
<option value="beginner-course">Beginner course</option>
<option value="intermediate-course">Intermediate course</option>
<option value="advanced-course">Advanced course</option>
</select>
</div>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-street" class="text-sm font-semibold text-gray-900">
Street address
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-street"
name="street"
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="street-address"
>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-city" class="text-sm font-semibold text-gray-900">
Town or city
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-city"
name="city"
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="address-level2"
>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-postcode" class="text-sm font-semibold text-gray-900">
Postcode
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-postcode"
name="postcode"
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="postal-code"
>
</div>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-heard_from" class="text-sm font-semibold text-gray-900">
How did you hear about us?
<span class="font-normal text-gray-500">(optional)</span>
</label>
<select
id="fb-heard_from"
name="heard_from"
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="search">Search</option>
<option value="friend-or-colleague">Friend or colleague</option>
<option value="social-media">Social media</option>
<option value="other">Other</option>
</select>
</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-terms"
name="terms"
value="yes"
class="h-4 w-4 accent-blue-600"
required
>
<span>I agree to the terms and conditions</span>
</label>
</div>
<!-- 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 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
This is the registration form for enrolling in something — a course, a club, a class, a programme: name, contact details, date of birth, address and which option they are signing up for, with a required agreement to your terms.
There is deliberately no password field. A form that creates an account belongs to your application's own sign-up, where the password is hashed and never leaves your system. Sending a password to a form backend would store it as plain text in a submission and an email — exactly where a password should never be.
Name is split into first and last because registration lists are usually sorted by surname. The address is three short fields rather than one box, so it imports cleanly into whatever you use next.
Fields in this template
| Field | Name | Type | Required | Why it is there |
|---|---|---|---|---|
| First name | first_name | Short text | Yes | Required, with the given-name autofill hint. |
| Last name | last_name | Short text | Yes | Required, so lists can be sorted by surname. |
email | Yes | Required. Named email for Auto Reply confirmations. | ||
| Phone | phone | Phone | No | Optional. |
| Date of birth | date_of_birth | Date | No | Optional; keep it only if age matters for the programme. |
| Course or programme | programme | Dropdown | Yes | Required dropdown of what they are enrolling in. |
| Street address | street | Short text | No | Optional address line, autofilled. |
| Town or city | city | Short text | No | Optional, autofilled. |
| Postcode | postcode | Short text | No | Optional, autofilled. |
| How did you hear about us? | heard_from | Dropdown | No | Optional marketing question. |
| I agree to the terms and conditions | terms | Checkbox | Yes | Required agreement. Link the words to your terms page. |
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
- Remove date of birth and address if you do not need them — collect only what the programme requires.
- Wrap “terms and conditions” in a link to your terms page in the copied code.
- Add an
emergency_contactfield for in-person activities with children or physical risk. - If places are limited, say so above the form and confirm each registration by reply rather than promising a place on the thank-you page — the form does not count places.
Where the submissions go
- Registrations are stored and emailed to you; export the class list to CSV on every plan.
- On Starter and above, send each registration to Google Sheets for a roster that updates itself.
- Confirm each registration automatically with Auto Reply on Starter and above.
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
Event registration form template
Attendee details, how they will attend, and the two questions organisers always forget to ask.
RSVP form template
Yes or no, how many are coming, meal choice and a note for the hosts.
Volunteer application form template
When they are free, what they would like to help with, and why they want to volunteer.
All form templates
Every template, in HTML, React and Tailwind.
Put the registration form live
Free forever: 500 submissions a month across 10 forms, no card.