Order form template
Product, quantity, delivery or collection — an order request you confirm and invoice.
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">Name</label>
<input type="text" id="fb-name" name="name" class="fb-input" required autocomplete="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-product" class="fb-label">Product</label>
<select id="fb-product" name="product" class="fb-input" required>
<option value="">Choose…</option>
<option value="celebration-cake">Celebration cake</option>
<option value="box-of-12-pastries">Box of 12 pastries</option>
<option value="bread-subscription">Bread subscription</option>
<option value="something-custom">Something custom</option>
</select>
</div>
<div class="fb-field fb-field--half">
<label for="fb-quantity" class="fb-label">Quantity</label>
<input
type="number"
id="fb-quantity"
name="quantity"
class="fb-input"
required
min="1"
max="100"
>
</div>
<div class="fb-field fb-field--half">
<label for="fb-needed_by" class="fb-label">
Needed by
<span class="fb-optional">(optional)</span>
</label>
<input type="date" id="fb-needed_by" name="needed_by" class="fb-input">
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">Delivery or collection?</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="fulfilment" value="delivery" class="fb-check" required>
<span>Delivery</span>
</label>
<label class="fb-option">
<input type="radio" name="fulfilment" value="collection" class="fb-check" required>
<span>Collection</span>
</label>
</div>
</fieldset>
<div class="fb-field">
<label for="fb-address" class="fb-label">
Delivery address
<span class="fb-optional">(optional)</span>
</label>
<textarea
id="fb-address"
name="address"
class="fb-input"
autocomplete="street-address"
aria-describedby="fb-address-help"
rows="3"
></textarea>
<p id="fb-address-help" class="fb-help">Only needed for delivery.</p>
</div>
<div class="fb-field">
<label for="fb-notes" class="fb-label">
Anything else?
<span class="fb-optional">(optional)</span>
</label>
<textarea id="fb-notes" name="notes" class="fb-input" aria-describedby="fb-notes-help" rows="3"></textarea>
<p id="fb-notes-help" class="fb-help">Messages, allergies, sizes or colours.</p>
</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 order request">
<button type="submit" class="fb-button">Send order request</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">Name</label>
<input type="text" id="fb-name" name="name" class="fb-input" required autocomplete="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-product" class="fb-label">Product</label>
<select id="fb-product" name="product" class="fb-input" required>
<option value="">Choose…</option>
<option value="celebration-cake">Celebration cake</option>
<option value="box-of-12-pastries">Box of 12 pastries</option>
<option value="bread-subscription">Bread subscription</option>
<option value="something-custom">Something custom</option>
</select>
</div>
<div class="fb-field fb-field--half">
<label for="fb-quantity" class="fb-label">Quantity</label>
<input
type="number"
id="fb-quantity"
name="quantity"
class="fb-input"
required
min="1"
max="100"
>
</div>
<div class="fb-field fb-field--half">
<label for="fb-needed_by" class="fb-label">
Needed by
<span class="fb-optional">(optional)</span>
</label>
<input type="date" id="fb-needed_by" name="needed_by" class="fb-input">
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">Delivery or collection?</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="fulfilment" value="delivery" class="fb-check" required>
<span>Delivery</span>
</label>
<label class="fb-option">
<input type="radio" name="fulfilment" value="collection" class="fb-check" required>
<span>Collection</span>
</label>
</div>
</fieldset>
<div class="fb-field">
<label for="fb-address" class="fb-label">
Delivery address
<span class="fb-optional">(optional)</span>
</label>
<textarea
id="fb-address"
name="address"
class="fb-input"
autocomplete="street-address"
aria-describedby="fb-address-help"
rows="3"
></textarea>
<p id="fb-address-help" class="fb-help">Only needed for delivery.</p>
</div>
<div class="fb-field">
<label for="fb-notes" class="fb-label">
Anything else?
<span class="fb-optional">(optional)</span>
</label>
<textarea id="fb-notes" name="notes" class="fb-input" aria-describedby="fb-notes-help" rows="3"></textarea>
<p id="fb-notes-help" class="fb-help">Messages, allergies, sizes or colours.</p>
</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 order request">
<button type="submit" class="fb-button">Send order request</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 = "Thanks — we'll confirm your order and send an invoice.";
} 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 OrderForm() {
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("Thanks — we'll confirm your order and send an invoice.");
} 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">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">
<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-product" className="text-sm font-semibold text-gray-900">Product</label>
<select
id="fb-product"
name="product"
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="celebration-cake">Celebration cake</option>
<option value="box-of-12-pastries">Box of 12 pastries</option>
<option value="bread-subscription">Bread subscription</option>
<option value="something-custom">Something custom</option>
</select>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-quantity" className="text-sm font-semibold text-gray-900">
Quantity
</label>
<input
type="number"
id="fb-quantity"
name="quantity"
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
min="1"
max="100"
/>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-needed_by" className="text-sm font-semibold text-gray-900">
Needed by
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="date"
id="fb-needed_by"
name="needed_by"
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"
/>
</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">Delivery or collection?</legend>
<div className="flex flex-col gap-2">
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="fulfilment"
value="delivery"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Delivery</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="fulfilment"
value="collection"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Collection</span>
</label>
</div>
</fieldset>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-address" className="text-sm font-semibold text-gray-900">
Delivery address
<span className="font-normal text-gray-500">(optional)</span>
</label>
<textarea
id="fb-address"
name="address"
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"
aria-describedby="fb-address-help"
rows={3}
></textarea>
<p id="fb-address-help" className="text-sm text-gray-500">Only needed for delivery.</p>
</div>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-notes" className="text-sm font-semibold text-gray-900">
Anything else?
<span className="font-normal text-gray-500">(optional)</span>
</label>
<textarea
id="fb-notes"
name="notes"
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"
aria-describedby="fb-notes-help"
rows={3}
></textarea>
<p id="fb-notes-help" className="text-sm text-gray-500">
Messages, allergies, sizes or colours.
</p>
</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 order request" />
<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}
>
Send order request
</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">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">
<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-product" class="text-sm font-semibold text-gray-900">Product</label>
<select
id="fb-product"
name="product"
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="celebration-cake">Celebration cake</option>
<option value="box-of-12-pastries">Box of 12 pastries</option>
<option value="bread-subscription">Bread subscription</option>
<option value="something-custom">Something custom</option>
</select>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-quantity" class="text-sm font-semibold text-gray-900">Quantity</label>
<input
type="number"
id="fb-quantity"
name="quantity"
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
min="1"
max="100"
>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-needed_by" class="text-sm font-semibold text-gray-900">
Needed by
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="date"
id="fb-needed_by"
name="needed_by"
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"
>
</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">Delivery or collection?</legend>
<div class="flex flex-col gap-2">
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="fulfilment"
value="delivery"
class="h-4 w-4 accent-blue-600"
required
>
<span>Delivery</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="fulfilment"
value="collection"
class="h-4 w-4 accent-blue-600"
required
>
<span>Collection</span>
</label>
</div>
</fieldset>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-address" class="text-sm font-semibold text-gray-900">
Delivery address
<span class="font-normal text-gray-500">(optional)</span>
</label>
<textarea
id="fb-address"
name="address"
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"
aria-describedby="fb-address-help"
rows="3"
></textarea>
<p id="fb-address-help" class="text-sm text-gray-500">Only needed for delivery.</p>
</div>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-notes" class="text-sm font-semibold text-gray-900">
Anything else?
<span class="font-normal text-gray-500">(optional)</span>
</label>
<textarea
id="fb-notes"
name="notes"
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"
aria-describedby="fb-notes-help"
rows="3"
></textarea>
<p id="fb-notes-help" class="text-sm text-gray-500">Messages, allergies, sizes or colours.</p>
</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 order request">
<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"
>
Send order request
</button>
</form>
About this template
This is an order request, not a checkout. It takes no payment and holds no stock; it tells you what someone wants, how many and how they want to receive it, and you reply with a confirmation and an invoice. For a bakery, a print shop, a caterer or anyone selling made-to-order, that is often exactly the right amount of e-commerce.
Quantity is a number field with a minimum of one, so phones show a number pad and nobody orders zero. Delivery or collection is a required choice; the address box is optional and its help text says it is only needed for delivery, so collection customers are not asked for an address they do not need to give.
Never add card details to a form like this. Payments belong with a payment provider; take them by invoice or a payment link once the order is confirmed.
Fields in this template
| Field | Name | Type | Required | Why it is there |
|---|---|---|---|---|
| Name | name | Short text | Yes | Required. |
email | Yes | Required: it is where the confirmation and invoice go. | ||
| Phone | phone | Phone | No | Optional, for delivery questions. |
| Product | product | Dropdown | Yes | Required dropdown of what you sell. |
| Quantity | quantity | Number | Yes | Required number, 1 to 100. |
| Needed by | needed_by | Date | No | Optional date, so you can say no early if it is too soon. |
| Delivery or collection? | fulfilment | Single choice | Yes | Required: delivery or collection. |
| Delivery address | address | Long text | No | Optional, and only asked for delivery. |
| Anything else? | notes | Long text | No | Optional details for made-to-order items. |
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
- Replace the product list with your own; keep option values stable so old orders stay comparable.
- Add a second product row as
product_2andquantity_2if people often order two things. - Set the date's
minto two days from today with a line of JavaScript if you need lead time.
Where the submissions go
- Each order request is stored and emailed to you; export the day's orders to CSV on every plan.
- Send orders to Google Sheets on Starter and above for a live order book the whole team can see.
- A Telegram message per order on your phone helps you confirm fast, on any plan.
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
Quote request form template
Service, budget range, timeline and the brief — enough to reply with a real number.
Booking form template
Date, time, how many people and the occasion — a reservation request for a table, a room or a venue.
Enquiry form template
What they are asking about, how they would like an answer, and the question itself.
All form templates
Every template, in HTML, React and Tailwind.
Put the order form live
Free forever: 500 submissions a month across 10 forms, no card.