Static sites
Static site contact form without a backend
A static website can render a contact form but cannot process it; there is no server to run PHP or send mail. The fix is a form backend: the browser posts the form to Heartdove, which stores the submission, sends your alert, and shows you whether that alert was delivered.
Updated 20 October 2026
Add the form to Static sites
Paste the form into any HTML page, whether it is hand-written, exported from a generator or produced by a build step. The only change to your markup is the action attribute and the hidden access key.
<form action="https://submit.heartdove.com/v1/submit" method="POST">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<label>Email <input type="email" name="email" required /></label>
<label>Message <textarea name="message" required></textarea></label>
<!-- Hidden spam trap: people never see it, bots tick it -->
<input type="checkbox" name="botcheck" tabindex="-1" autocomplete="off" style="display:none" />
<button type="submit">Send message</button>
</form>Plain HTML posts have been tested in real browsers. Add a hidden _redirect field to send visitors to your own thank-you page, or leave it out to show the default confirmation.
Registering www.yourdomain.com also registers yourdomain.com, so both addresses work from the start.
Register your website address
Heartdove accepts a submission only from the exact website addresses registered on the form, so a copied key cannot be fired from somewhere else. Register every address the form is published on; each form takes up to 10, and registering a www address covers the bare domain too. For a Static sites site that usually means:
https://www.yourdomain.comhttps://yourdomain.com
Testing locally? Register your local address, such as http://localhost:3000, as well.
What happens after submit
The message is saved to your inbox before any email is sent, so a failed alert never loses the enquiry. The alert is then tracked step by step and shown on the message:
- CapturedSaved and searchable
- Accepted by providerHanded to the email provider
- DeliveredThe recipient’s mail server accepted it
- BouncedShown with the reason; the address is paused
Over your monthly allowance, submissions are held, visibly, and released automatically. Nothing is billed as overage, and each plan’s hold capacity is on the pricing page. The Free plan includes 500 submissions a month with an instant alert for each.
Spam, without a CAPTCHA
Every form gets the exact origin check, a per-visitor rate limit, the hidden trap field and spam scoring with quarantine. Cloudflare Turnstile can be turned on per form for a human check, and is never required. Read how the layers work.
Questions
Can a static website have a contact form at all?
Yes. The form itself is static HTML; only the receiving end needs a server, and Heartdove is that server.
Is a mailto: link good enough?
A mailto: link opens the visitor’s email program, if they have one configured, and you get no record of anything. A form backend stores the message and tells you whether the alert arrived.
Do I need a CAPTCHA?
No. Every form gets an exact origin check, a per-visitor rate limit, a hidden trap field and spam scoring with quarantine. Cloudflare Turnstile is optional for forms that want a human check.
What happens if I go over the free limit?
Submissions above your monthly allowance are held, visibly, for at least seven days and released automatically when your allowance resets. Each plan’s hold capacity is on the pricing page, and there is no overage charge.
Never lose another enquiry.
Connect your first form in a few minutes. Your existing design stays exactly as it is.