How to build a quote request form for your website
An inquiry form with service, budget and deadline that lands in your inbox as a tidy email – and sends the customer an automatic confirmation. No backend, plain HTML.
Updated:
A quote request form tells you more than a contact form: what the customer needs, the budget and the deadline. You’ll build one in plain HTML, get every request as a clearly laid-out email and send the customer an automatic “we’ve got it” reply.
You need: a free Frontmail account and about fifteen minutes.
1. Connect your mailbox
In Email services → Add service, connect Gmail, Outlook, an SMTP server or a transactional provider, tick Make default and click Verify & save.
2. Create the quote request template
- Open Templates → From gallery and pick Quote request (category Business).
- Click Use template. The request goes to your address; Reply-To is the customer.
The template has these parameters:
| Parameter | Type | Required | Notes |
|---|---|---|---|
name |
string | yes | |
email |
yes | ||
phone |
string | no | |
company |
string | no | |
service |
enum | yes | one of the values listed on the Parameters tab |
budget |
enum | no | one of the values listed on the Parameters tab |
deadline |
date | no | YYYY-MM-DD, exactly what <input type="date"> sends |
details |
text | yes | at least 10 characters |
service and budget accept only their listed values. The gallery template in English offers
Website, E-shop, Mobile app, Consulting, Other and Under $5k, $5k–20k, $20k–50k, Over $50k –
change them on the Parameters tab to match what you sell, and use the same values in your form.
3. Add an automatic confirmation
- Templates → From gallery → Auto-reply: thanks for your message → Use template.
- On its Parameters tab set default values for
company_name(your company) andresponse_time(for example within one business day). Save. - Open the quote request template → Settings → Delivery and choose the new template as Auto-reply template. Save.
Now one submission sends two emails: the request to you and the confirmation to the customer. The auto-reply can only ever be triggered by your own form, so nobody can abuse it to email strangers.
4. Allow your website
In Security, add your domain under Allowed websites and Save. Then protect the form against bots: create a free Cloudflare Turnstile widget, paste its keys into Security → Bot protection and turn on the CAPTCHA for all templates.
5. Add the form
Use your public key and the template ID from the Snippets tab:
<form id="quote">
<label>Name <input name="name" required /></label>
<label>Email <input name="email" type="email" required /></label>
<label>Company <input name="company" /></label>
<label>What do you need?
<select name="service" required>
<option>Website</option>
<option>E-shop</option>
<option>Mobile app</option>
<option>Consulting</option>
<option>Other</option>
</select>
</label>
<label>Budget
<select name="budget">
<option value="">Not sure yet</option>
<option>Under $5k</option>
<option>$5k–20k</option>
<option>$20k–50k</option>
<option>Over $50k</option>
</select>
</label>
<label>Deadline <input name="deadline" type="date" /></label>
<label>Project details <textarea name="details" required minlength="10"></textarea></label>
<div class="cf-turnstile" data-sitekey="YOUR_TURNSTILE_SITE_KEY"></div>
<button type="submit">Request a quote</button>
<p id="quote-status" role="status"></p>
</form>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<script
src="https://cdn.jsdelivr.net/npm/@frontmail/browser@0.1.0/dist/frontmail.umd.js"
integrity="sha384-g2Rxznkz2yb/YYSdVTkXLxZFZ2Nh2+XdhPStxh0stydXFF3gYjDuyHimWIZLJDCc"
crossorigin="anonymous"></script>
<script>
frontmail.init({ publicKey: 'pk_…' });
const form = document.getElementById('quote');
const status = document.getElementById('quote-status');
form.addEventListener('submit', async (event) => {
event.preventDefault();
status.textContent = 'Sending…';
try {
await frontmail.sendForm(null, 'tpl_…', form);
status.textContent = 'Thanks! Check your inbox – we’ve sent you a confirmation.';
form.reset();
} catch (err) {
status.textContent = 'Sorry, that didn’t work: ' + err.message;
} finally {
window.turnstile?.reset();
}
});
</script>
Empty optional fields (an unselected budget, no deadline) simply disappear from the email.
6. Test it
Send a test request with your own address in the Email field. You should receive the request and, a moment later, the confirmation. Both appear in History, each with its own timeline.
Every email uses one credit, so a request with an auto-reply costs two. If your credits run out in a busy season, requests wait in the hold queue and go out as soon as you top up – none is lost.
Next steps
- Save every customer to Contacts: the template already maps
email,nameandcompany; turn on contact collection in the template Settings. - Want the request in the customer’s language? Add a language variant of the template and send
the form with a hidden
fm_localefield (for examplede).


