Enquiry form template
What they are asking about, how they would like an answer, and the question itself.
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-company" class="fb-label">
Company
<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">
<label for="fb-enquiry_type" class="fb-label">Type of enquiry</label>
<select id="fb-enquiry_type" name="enquiry_type" class="fb-input" required>
<option value="">Choose…</option>
<option value="product-information">Product information</option>
<option value="pricing">Pricing</option>
<option value="availability">Availability</option>
<option value="partnership">Partnership</option>
<option value="other">Other</option>
</select>
</div>
<div class="fb-field">
<label for="fb-interest" class="fb-label">
Product or service you are asking about
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-interest" name="interest" class="fb-input">
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">How should we get back to you?</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="contact_method" value="email" class="fb-check" required>
<span>Email</span>
</label>
<label class="fb-option">
<input type="radio" name="contact_method" value="phone" class="fb-check" required>
<span>Phone</span>
</label>
</div>
</fieldset>
<div class="fb-field">
<label for="fb-message" class="fb-label">Your enquiry</label>
<textarea id="fb-message" name="message" class="fb-input" required rows="5"></textarea>
</div>
<input type="hidden" name="page" value="/pricing">
<!-- 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 enquiry">
<button type="submit" class="fb-button">Send enquiry</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-company" class="fb-label">
Company
<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">
<label for="fb-enquiry_type" class="fb-label">Type of enquiry</label>
<select id="fb-enquiry_type" name="enquiry_type" class="fb-input" required>
<option value="">Choose…</option>
<option value="product-information">Product information</option>
<option value="pricing">Pricing</option>
<option value="availability">Availability</option>
<option value="partnership">Partnership</option>
<option value="other">Other</option>
</select>
</div>
<div class="fb-field">
<label for="fb-interest" class="fb-label">
Product or service you are asking about
<span class="fb-optional">(optional)</span>
</label>
<input type="text" id="fb-interest" name="interest" class="fb-input">
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">How should we get back to you?</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="contact_method" value="email" class="fb-check" required>
<span>Email</span>
</label>
<label class="fb-option">
<input type="radio" name="contact_method" value="phone" class="fb-check" required>
<span>Phone</span>
</label>
</div>
</fieldset>
<div class="fb-field">
<label for="fb-message" class="fb-label">Your enquiry</label>
<textarea id="fb-message" name="message" class="fb-input" required rows="5"></textarea>
</div>
<input type="hidden" name="page" value="/pricing">
<!-- 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 enquiry">
<button type="submit" class="fb-button">Send enquiry</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 get back to you shortly.";
} 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 EnquiryForm() {
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 get back to you shortly.");
} 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-company" className="text-sm font-semibold text-gray-900">
Company
<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 sm:col-span-2">
<label htmlFor="fb-enquiry_type" className="text-sm font-semibold text-gray-900">
Type of enquiry
</label>
<select
id="fb-enquiry_type"
name="enquiry_type"
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="product-information">Product information</option>
<option value="pricing">Pricing</option>
<option value="availability">Availability</option>
<option value="partnership">Partnership</option>
<option value="other">Other</option>
</select>
</div>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-interest" className="text-sm font-semibold text-gray-900">
Product or service you are asking about
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-interest"
name="interest"
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">
How should we get back to you?
</legend>
<div className="flex flex-col gap-2">
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="contact_method"
value="email"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Email</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="contact_method"
value="phone"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Phone</span>
</label>
</div>
</fieldset>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-message" className="text-sm font-semibold text-gray-900">
Your enquiry
</label>
<textarea
id="fb-message"
name="message"
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
rows={5}
></textarea>
</div>
<input type="hidden" name="page" defaultValue="/pricing" />
{/* 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 enquiry" />
<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 enquiry
</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-company" class="text-sm font-semibold text-gray-900">
Company
<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 sm:col-span-2">
<label for="fb-enquiry_type" class="text-sm font-semibold text-gray-900">Type of enquiry</label>
<select
id="fb-enquiry_type"
name="enquiry_type"
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="product-information">Product information</option>
<option value="pricing">Pricing</option>
<option value="availability">Availability</option>
<option value="partnership">Partnership</option>
<option value="other">Other</option>
</select>
</div>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-interest" class="text-sm font-semibold text-gray-900">
Product or service you are asking about
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-interest"
name="interest"
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">How should we get back to you?</legend>
<div class="flex flex-col gap-2">
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="contact_method"
value="email"
class="h-4 w-4 accent-blue-600"
required
>
<span>Email</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="contact_method"
value="phone"
class="h-4 w-4 accent-blue-600"
required
>
<span>Phone</span>
</label>
</div>
</fieldset>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-message" class="text-sm font-semibold text-gray-900">Your enquiry</label>
<textarea
id="fb-message"
name="message"
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
rows="5"
></textarea>
</div>
<input type="hidden" name="page" value="/pricing">
<!-- 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 enquiry">
<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 enquiry
</button>
</form>
About this template
An enquiry is a contact message from someone who is closer to buying. This template asks what kind of enquiry it is and which product or service it concerns, so the person who picks it up can answer properly the first time instead of writing back to ask.
It also asks how the enquirer would like to hear back. Some people want a phone call, most want an email; asking takes one tap, and the phone field is optional so nobody is forced to give a number they did not want to share.
Use it on product, pricing and service pages, where questions are specific. A hidden page field records which page the enquiry came from, so you can see which pages generate the most interest — and which leave people with questions.
Fields in this template
| Field | Name | Type | Required | Why it is there |
|---|---|---|---|---|
| Name | name | Short text | Yes | Required. |
email | Yes | Required, named email for Auto Reply and the reply-to. | ||
| Phone | phone | Phone | No | Optional — needed only if they choose a call back. |
| Company | company | Short text | No | Optional context for business enquiries. |
| Type of enquiry | enquiry_type | Dropdown | Yes | Required dropdown, the first thing you triage on. |
| Product or service you are asking about | interest | Short text | No | Optional free text, so the enquiry names the exact product or service. |
| How should we get back to you? | contact_method | Single choice | Yes | Required. Tells you whether to email or call. |
| Your enquiry | message | Long text | Yes | Required. The question itself. |
| (hidden) | page | Hidden value | No | Hidden. Set it per page to see where enquiries come from. |
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
- Turn the product field into a dropdown if your catalogue is short — answers then group cleanly in the CSV export.
- Fill
pagefrom JavaScript withlocation.pathnameif the form sits in a shared layout. - Make the phone field required only if you genuinely call every enquiry back.
Where the submissions go
- Each enquiry is stored and emailed to you, with its type and page in the field table.
- A Slack or Telegram message per enquiry gets it in front of whoever answers fastest, on any plan.
- On Starter and above, send enquiries into a CRM with a webhook or Zapier, and acknowledge each one with Auto Reply.
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
Contact form template
Name, email, a topic and the message — the contact form most sites need, done properly.
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.
All form templates
Every template, in HTML, React and Tailwind.
Put the enquiry form live
Free forever: 500 submissions a month across 10 forms, no card.