Quote request form template
Service, budget range, timeline and the brief — enough to reply with a real number.
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">Your name</label>
<input type="text" id="fb-name" name="name" class="fb-input" required autocomplete="name">
</div>
<div class="fb-field">
<label for="fb-email" class="fb-label">Email</label>
<input type="email" id="fb-email" name="email" class="fb-input" required autocomplete="email">
</div>
<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 fb-field--half">
<label for="fb-service" class="fb-label">What do you need?</label>
<select id="fb-service" name="service" class="fb-input" required>
<option value="">Choose…</option>
<option value="website">Website</option>
<option value="web-app">Web app</option>
<option value="mobile-app">Mobile app</option>
<option value="branding">Branding</option>
<option value="something-else">Something else</option>
</select>
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">Budget</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="budget" value="under-5-000" class="fb-check" required>
<span>Under $5,000</span>
</label>
<label class="fb-option">
<input type="radio" name="budget" value="5-000-15-000" class="fb-check" required>
<span>$5,000–$15,000</span>
</label>
<label class="fb-option">
<input type="radio" name="budget" value="15-000-50-000" class="fb-check" required>
<span>$15,000–$50,000</span>
</label>
<label class="fb-option">
<input type="radio" name="budget" value="over-50-000" class="fb-check" required>
<span>Over $50,000</span>
</label>
</div>
</fieldset>
<div class="fb-field">
<label for="fb-timeline" class="fb-label">
When do you need it?
<span class="fb-optional">(optional)</span>
</label>
<select id="fb-timeline" name="timeline" class="fb-input">
<option value="">Choose…</option>
<option value="as-soon-as-possible">As soon as possible</option>
<option value="within-3-months">Within 3 months</option>
<option value="3-6-months">3–6 months</option>
<option value="just-exploring">Just exploring</option>
</select>
</div>
<div class="fb-field">
<label for="fb-details" class="fb-label">Tell us about the project</label>
<textarea id="fb-details" name="details" class="fb-input" required rows="5"></textarea>
</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 quote request">
<button type="submit" class="fb-button">Request a quote</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">Your name</label>
<input type="text" id="fb-name" name="name" class="fb-input" required autocomplete="name">
</div>
<div class="fb-field">
<label for="fb-email" class="fb-label">Email</label>
<input type="email" id="fb-email" name="email" class="fb-input" required autocomplete="email">
</div>
<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 fb-field--half">
<label for="fb-service" class="fb-label">What do you need?</label>
<select id="fb-service" name="service" class="fb-input" required>
<option value="">Choose…</option>
<option value="website">Website</option>
<option value="web-app">Web app</option>
<option value="mobile-app">Mobile app</option>
<option value="branding">Branding</option>
<option value="something-else">Something else</option>
</select>
</div>
<fieldset class="fb-field fb-fieldset">
<legend class="fb-label">Budget</legend>
<div class="fb-options">
<label class="fb-option">
<input type="radio" name="budget" value="under-5-000" class="fb-check" required>
<span>Under $5,000</span>
</label>
<label class="fb-option">
<input type="radio" name="budget" value="5-000-15-000" class="fb-check" required>
<span>$5,000–$15,000</span>
</label>
<label class="fb-option">
<input type="radio" name="budget" value="15-000-50-000" class="fb-check" required>
<span>$15,000–$50,000</span>
</label>
<label class="fb-option">
<input type="radio" name="budget" value="over-50-000" class="fb-check" required>
<span>Over $50,000</span>
</label>
</div>
</fieldset>
<div class="fb-field">
<label for="fb-timeline" class="fb-label">
When do you need it?
<span class="fb-optional">(optional)</span>
</label>
<select id="fb-timeline" name="timeline" class="fb-input">
<option value="">Choose…</option>
<option value="as-soon-as-possible">As soon as possible</option>
<option value="within-3-months">Within 3 months</option>
<option value="3-6-months">3–6 months</option>
<option value="just-exploring">Just exploring</option>
</select>
</div>
<div class="fb-field">
<label for="fb-details" class="fb-label">Tell us about the project</label>
<textarea id="fb-details" name="details" class="fb-input" required rows="5"></textarea>
</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 quote request">
<button type="submit" class="fb-button">Request a quote</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 reply with a quote 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 QuoteRequestForm() {
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 reply with a quote 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">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 sm:col-span-2">
<label htmlFor="fb-email" className="text-sm font-semibold text-gray-900">Email</label>
<input
type="email"
id="fb-email"
name="email"
className="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
required
autoComplete="email"
/>
</div>
<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">
<label htmlFor="fb-service" className="text-sm font-semibold text-gray-900">
What do you need?
</label>
<select
id="fb-service"
name="service"
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="website">Website</option>
<option value="web-app">Web app</option>
<option value="mobile-app">Mobile app</option>
<option value="branding">Branding</option>
<option value="something-else">Something else</option>
</select>
</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">Budget</legend>
<div className="flex flex-col gap-2">
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="budget"
value="under-5-000"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Under $5,000</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="budget"
value="5-000-15-000"
className="h-4 w-4 accent-blue-600"
required
/>
<span>$5,000–$15,000</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="budget"
value="15-000-50-000"
className="h-4 w-4 accent-blue-600"
required
/>
<span>$15,000–$50,000</span>
</label>
<label className="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="budget"
value="over-50-000"
className="h-4 w-4 accent-blue-600"
required
/>
<span>Over $50,000</span>
</label>
</div>
</fieldset>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-timeline" className="text-sm font-semibold text-gray-900">
When do you need it?
<span className="font-normal text-gray-500">(optional)</span>
</label>
<select
id="fb-timeline"
name="timeline"
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="as-soon-as-possible">As soon as possible</option>
<option value="within-3-months">Within 3 months</option>
<option value="3-6-months">3–6 months</option>
<option value="just-exploring">Just exploring</option>
</select>
</div>
<div className="flex flex-col gap-1.5 sm:col-span-2">
<label htmlFor="fb-details" className="text-sm font-semibold text-gray-900">
Tell us about the project
</label>
<textarea
id="fb-details"
name="details"
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>
{/* 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 quote 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}
>
Request a quote
</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">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 sm:col-span-2">
<label for="fb-email" class="text-sm font-semibold text-gray-900">Email</label>
<input
type="email"
id="fb-email"
name="email"
class="w-full rounded-lg border border-gray-300 bg-white px-3 py-2.5 text-gray-900 focus:border-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-600/30"
required
autocomplete="email"
>
</div>
<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">
<label for="fb-service" class="text-sm font-semibold text-gray-900">What do you need?</label>
<select
id="fb-service"
name="service"
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="website">Website</option>
<option value="web-app">Web app</option>
<option value="mobile-app">Mobile app</option>
<option value="branding">Branding</option>
<option value="something-else">Something else</option>
</select>
</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">Budget</legend>
<div class="flex flex-col gap-2">
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="budget"
value="under-5-000"
class="h-4 w-4 accent-blue-600"
required
>
<span>Under $5,000</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="budget"
value="5-000-15-000"
class="h-4 w-4 accent-blue-600"
required
>
<span>$5,000–$15,000</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="budget"
value="15-000-50-000"
class="h-4 w-4 accent-blue-600"
required
>
<span>$15,000–$50,000</span>
</label>
<label class="flex items-center gap-2 text-gray-800">
<input
type="radio"
name="budget"
value="over-50-000"
class="h-4 w-4 accent-blue-600"
required
>
<span>Over $50,000</span>
</label>
</div>
</fieldset>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-timeline" class="text-sm font-semibold text-gray-900">
When do you need it?
<span class="font-normal text-gray-500">(optional)</span>
</label>
<select
id="fb-timeline"
name="timeline"
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="as-soon-as-possible">As soon as possible</option>
<option value="within-3-months">Within 3 months</option>
<option value="3-6-months">3–6 months</option>
<option value="just-exploring">Just exploring</option>
</select>
</div>
<div class="flex flex-col gap-1.5 sm:col-span-2">
<label for="fb-details" class="text-sm font-semibold text-gray-900">
Tell us about the project
</label>
<textarea
id="fb-details"
name="details"
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>
<!-- 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 quote 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"
>
Request a quote
</button>
</form>
About this template
A quote request is a lead that has already told you what they want. This template asks the three questions that decide whether you can help — which service, what budget, how soon — before the free-text brief, so the most useful information is at the top of every notification.
The budget is a set of ranges, not an open number box. People answer ranges more readily, and every submission lands in one of four buckets you can sort by in the export.
Because the lead's address is named email, you can reply straight from the notification in plain HTML too, by switching the reply-to option in the generator; the HTML + JS and React versions set the reply-to for you.
Fields in this template
| Field | Name | Type | Required | Why it is there |
|---|---|---|---|---|
| Your name | name | Short text | Yes | Required. |
email | Yes | Required, named email for Auto Reply and the reply-to. | ||
| Company | company | Short text | No | Optional; useful context for B2B work. |
| What do you need? | service | Dropdown | Yes | Required dropdown — the first thing you triage on. |
| Budget | budget | Single choice | Yes | Required ranges, so every lead sorts into a bucket. |
| When do you need it? | timeline | Dropdown | No | Optional; separates urgent work from early research. |
| Tell us about the project | details | Long text | Yes | Required. The brief itself. |
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
- Edit the budget ranges to match your pricing; keep four or five so each bucket means something.
- Add a hidden
sourcefield per landing page to see which page brings the leads that convert. - Remove the timeline question if every project you take is urgent — shorter forms convert better.
- Add a phone field only if you actually call leads back. Every extra required field is one more reason to leave the form half-finished, and the email address is already enough to reply with a quote.
Where the submissions go
- Each request is stored and emailed to you. With the HTML + JS or React version, hitting reply in your inbox answers the lead directly.
- Get leads in front of the team instantly in Slack or Telegram, on any plan.
- On Starter and above, push each lead into a CRM through a webhook or Zapier, and acknowledge it 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
Appointment request form template
A preferred date and time, a second choice and the reason for the visit — a request you confirm, not a calendar.
Support ticket form template
Category, urgency, where it happened and how to reproduce it — the details a first reply usually has to ask for.
Job application form template
The role, a link to the résumé, portfolio and LinkedIn, and consent to keep the application on file.
All form templates
Every template, in HTML, React and Tailwind.
Put the quote request form live
Free forever: 500 submissions a month across 10 forms, no card.