Tailwind CSS

Tailwind CSS contact form that actually sends

Tailwind templates give you a good-looking contact form with nowhere to send it. Heartdove keeps your classes exactly as they are; only the action and a hidden key change, and every submission is saved before your alert goes out.

Updated 20 October 2026

Plain HTML and the React, Vue and Svelte adapters have been tested in real browsers. This guide places the same snippet on Tailwind CSS; it has not yet been run end to end on Tailwind CSS itself. If something differs, the docs list what each platform needs.

Add the form to Tailwind CSS

Paste the form into any page. The classes below are a starting point; swap them for your own design system.

contact.html
<form action="https://submit.heartdove.com/v1/submit" method="POST" class="mx-auto max-w-md space-y-4">
  <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
  <label class="block text-sm font-medium text-slate-700">Email
    <input type="email" name="email" required class="mt-1 w-full rounded-lg border border-slate-300 px-3 py-2 focus:border-indigo-500 focus:outline-none" />
  </label>
  <label class="block text-sm font-medium text-slate-700">Message
    <textarea name="message" rows="5" required class="mt-1 w-full rounded-lg border border-slate-300 px-3 py-2 focus:border-indigo-500 focus:outline-none"></textarea>
  </label>
  <input type="checkbox" name="botcheck" tabindex="-1" autocomplete="off" class="hidden" />
  <button type="submit" class="w-full rounded-lg bg-indigo-600 px-4 py-2.5 font-semibold text-white hover:bg-indigo-700">Send message</button>
</form>

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 Tailwind CSS site that usually means:

  • https://www.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

Is it safe to put the access key in my page?

Yes. The key is public and only identifies the form; it does not grant access to anything. Submissions are accepted only from the website addresses you register, each visitor is rate limited, and every message is scored for spam before it is stored.

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.

Can I send visitors to my own thank-you page?

Yes. Add a hidden _redirect field with a full URL on one of the websites registered for the form. JSON requests get a receipt instead of a redirect.

Never lose another enquiry.

Connect your first form in a few minutes. Your existing design stays exactly as it is.