Testimonial form template
The testimonial, a rating, and clear permission for how you may credit it.
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">
<label for="fb-testimonial" class="fb-label">What would you tell someone considering us?</label>
<textarea id="fb-testimonial" name="testimonial" class="fb-input" required rows="5"></textarea>
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">Overall rating <span class="fb-optional">(optional)</span></legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="rating" value="5-excellent" class="fb-check">
<span>5 — Excellent</span>
</label>
<label class="fb-option">
<input type="radio" name="rating" value="4-good" class="fb-check">
<span>4 — Good</span>
</label>
<label class="fb-option">
<input type="radio" name="rating" value="3-ok" class="fb-check">
<span>3 — OK</span>
</label>
<label class="fb-option">
<input type="radio" name="rating" value="2-poor" class="fb-check">
<span>2 — Poor</span>
</label>
<label class="fb-option">
<input type="radio" name="rating" value="1-very-poor" class="fb-check">
<span>1 — Very poor</span>
</label>
</div>
</fieldset>
<div class="fb-field fb-field--half">
<label for="fb-name" class="fb-label">Your 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"
aria-describedby="fb-email-help"
>
<p id="fb-email-help" class="fb-help">Not published. Only so we can check before publishing.</p>
</div>
<div class="fb-field fb-field--half">
<label for="fb-role" class="fb-label">Role <span class="fb-optional">(optional)</span></label>
<input type="text" id="fb-role" name="role" class="fb-input" autocomplete="organization-title">
</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>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">How may we credit you?</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="credit" value="name-role-and-company" class="fb-check" required>
<span>Name, role and company</span>
</label>
<label class="fb-option">
<input type="radio" name="credit" value="first-name-only" class="fb-check" required>
<span>First name only</span>
</label>
<label class="fb-option">
<input type="radio" name="credit" value="anonymously" class="fb-check" required>
<span>Anonymously</span>
</label>
</div>
</fieldset>
<!-- 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 testimonial">
<button type="submit" class="fb-button">Send testimonial</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">
<label for="fb-testimonial" class="fb-label">What would you tell someone considering us?</label>
<textarea id="fb-testimonial" name="testimonial" class="fb-input" required rows="5"></textarea>
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">Overall rating <span class="fb-optional">(optional)</span></legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="rating" value="5-excellent" class="fb-check">
<span>5 — Excellent</span>
</label>
<label class="fb-option">
<input type="radio" name="rating" value="4-good" class="fb-check">
<span>4 — Good</span>
</label>
<label class="fb-option">
<input type="radio" name="rating" value="3-ok" class="fb-check">
<span>3 — OK</span>
</label>
<label class="fb-option">
<input type="radio" name="rating" value="2-poor" class="fb-check">
<span>2 — Poor</span>
</label>
<label class="fb-option">
<input type="radio" name="rating" value="1-very-poor" class="fb-check">
<span>1 — Very poor</span>
</label>
</div>
</fieldset>
<div class="fb-field fb-field--half">
<label for="fb-name" class="fb-label">Your 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"
aria-describedby="fb-email-help"
>
<p id="fb-email-help" class="fb-help">Not published. Only so we can check before publishing.</p>
</div>
<div class="fb-field fb-field--half">
<label for="fb-role" class="fb-label">Role <span class="fb-optional">(optional)</span></label>
<input type="text" id="fb-role" name="role" class="fb-input" autocomplete="organization-title">
</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>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">How may we credit you?</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="credit" value="name-role-and-company" class="fb-check" required>
<span>Name, role and company</span>
</label>
<label class="fb-option">
<input type="radio" name="credit" value="first-name-only" class="fb-check" required>
<span>First name only</span>
</label>
<label class="fb-option">
<input type="radio" name="credit" value="anonymously" class="fb-check" required>
<span>Anonymously</span>
</label>
</div>
</fieldset>
<!-- 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 testimonial">
<button type="submit" class="fb-button">Send testimonial</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 = "Thank you — that means a lot.";
} 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 TestimonialForm() {
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("Thank you — that means a lot.");
} 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 sm:col-span-2">
<label htmlFor="fb-testimonial" className="text-sm font-semibold text-gray-900">
What would you tell someone considering us?
</label>
<textarea
id="fb-testimonial"
name="testimonial"
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>
<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">
Overall rating
<span className="font-normal text-gray-500">(optional)</span>
</legend>
<div className="flex flex-col gap-2">
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="rating"
value="5-excellent"
className="h-4 w-4 accent-blue-600"
/>
<span>5 — Excellent</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input type="radio" name="rating" value="4-good" className="h-4 w-4 accent-blue-600" />
<span>4 — Good</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input type="radio" name="rating" value="3-ok" className="h-4 w-4 accent-blue-600" />
<span>3 — OK</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input type="radio" name="rating" value="2-poor" className="h-4 w-4 accent-blue-600" />
<span>2 — Poor</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="rating"
value="1-very-poor"
className="h-4 w-4 accent-blue-600"
/>
<span>1 — Very poor</span>
</label>
</div>
</fieldset>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-name" className="text-sm font-semibold text-gray-900">Your 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"
aria-describedby="fb-email-help"
/>
<p id="fb-email-help" className="text-sm text-gray-500">
Not published. Only so we can check before publishing.
</p>
</div>
<div className="flex flex-col gap-1.5">
<label htmlFor="fb-role" className="text-sm font-semibold text-gray-900">
Role
<span className="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-role"
name="role"
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-title"
/>
</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>
<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 may we credit you?</legend>
<div className="flex flex-col gap-2">
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="credit"
value="name-role-and-company"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Name, role and company</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="credit"
value="first-name-only"
className="h-4 w-4 accent-blue-600"
required
/>
<span>First name only</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="credit"
value="anonymously"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Anonymously</span>
</label>
</div>
</fieldset>
{/* 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 testimonial" />
<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 testimonial
</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 sm:col-span-2">
<label for="fb-testimonial" class="text-sm font-semibold text-gray-900">
What would you tell someone considering us?
</label>
<textarea
id="fb-testimonial"
name="testimonial"
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>
<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">
Overall rating
<span class="font-normal text-gray-500">(optional)</span>
</legend>
<div class="flex flex-col gap-2">
<label class="flex items-center gap-2 text-gray-800">
<input type="radio" name="rating" value="5-excellent" class="h-4 w-4 accent-blue-600">
<span>5 — Excellent</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input type="radio" name="rating" value="4-good" class="h-4 w-4 accent-blue-600">
<span>4 — Good</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input type="radio" name="rating" value="3-ok" class="h-4 w-4 accent-blue-600">
<span>3 — OK</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input type="radio" name="rating" value="2-poor" class="h-4 w-4 accent-blue-600">
<span>2 — Poor</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input type="radio" name="rating" value="1-very-poor" class="h-4 w-4 accent-blue-600">
<span>1 — Very poor</span>
</label>
</div>
</fieldset>
<div class="flex flex-col gap-1.5">
<label for="fb-name" class="text-sm font-semibold text-gray-900">Your 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"
aria-describedby="fb-email-help"
>
<p id="fb-email-help" class="text-sm text-gray-500">
Not published. Only so we can check before publishing.
</p>
</div>
<div class="flex flex-col gap-1.5">
<label for="fb-role" class="text-sm font-semibold text-gray-900">
Role
<span class="font-normal text-gray-500">(optional)</span>
</label>
<input
type="text"
id="fb-role"
name="role"
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-title"
>
</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>
<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 may we credit you?</legend>
<div class="flex flex-col gap-2">
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="credit"
value="name-role-and-company"
class="h-4 w-4 accent-blue-600"
required
>
<span>Name, role and company</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="credit"
value="first-name-only"
class="h-4 w-4 accent-blue-600"
required
>
<span>First name only</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="credit"
value="anonymously"
class="h-4 w-4 accent-blue-600"
required
>
<span>Anonymously</span>
</label>
</div>
</fieldset>
<!-- 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 testimonial">
<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 testimonial
</button>
</form>
About this template
The point of a testimonial form is the permission, not the praise. This template asks how the customer is happy to be credited — full name and company, first name only, or anonymously — as a required choice, so every quote you collect arrives with a recorded answer to “can we publish this, and how?”
The testimonial box comes first and is required; the rating is optional, because some happy customers do not think in stars. Role and company are optional too, and only used if the customer picks the credit option that includes them.
Send the form to customers after a good moment — a delivered project, a closed ticket, a renewal. Pair it with a short email that links here; people write better testimonials when they are asked directly than when they stumble on a form.
Fields in this template
| Field | Name | Type | Required | Why it is there |
|---|---|---|---|---|
| What would you tell someone considering us? | testimonial | Long text | Yes | Required, and first. The question is phrased to invite a specific answer. |
| Overall rating | rating | Single choice | No | Optional — not everyone thinks in stars. |
| Your name | name | Short text | Yes | Required, even when publishing anonymously, so you know who said it. |
email | Yes | Required but never published; for confirming before you publish. | ||
| Role | role | Short text | No | Optional, used only with the full credit option. |
| Company | company | Short text | No | Optional, used only with the full credit option. |
| How may we credit you? | credit | Single choice | Yes | Required. The recorded permission that makes the quote usable. |
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
- Ask a more specific question in the label (“What changed after you switched?”) for more useful quotes.
- Add a
websitelink field for B2B testimonials that link back to the customer. - Record the date you published each quote next to the CSV export, so you can refresh old ones.
Where the submissions go
- Testimonials are stored and emailed to you; export them all to CSV on every plan.
- Post new testimonials to a team Slack channel — good news is worth sharing, on any plan.
- On Starter and above, collect them in Google Sheets as a library your marketing team can pick from.
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
Feedback form template
A rating, two open questions and the page it came from — short enough that people finish it.
Survey form template
Four question types — a 0–10 score, single choice, multiple choice and an open answer — in one page.
Complaint form template
What happened, when, the reference to look it up, and what would put it right.
All form templates
Every template, in HTML, React and Tailwind.
Put the testimonial form live
Free forever: 500 submissions a month across 10 forms, no card.