Compared
An EmailJS alternative built for contact forms.
EmailJS lets a website send email from JavaScript through a mailbox or email service you connect. Heartdove is a different shape: the form posts to a backend that saves the message first, sends the alert itself, and shows you whether it was delivered. Here is a dated, sourced comparison.
Updated 20 October 2026
Two different shapes
EmailJS is an email sender for the browser. You install its SDK on your website, connect an email service in the EmailJS dashboard, design a template, and the page sends the email using your public key. The message exists as an email and as an entry in EmailJS’s history, kept for 7 days on Free and 30 days on paid plans. That is a good fit when you want replies to thread in your own mailbox or you need attachments and templates.
Heartdove is a form backend. The browser posts the form to one endpoint; the submission is stored in your inbox before any email is sent; the alert goes out from the Heartdove sending domain and is tracked until it is delivered or bounces. Nothing of yours is connected, there are no mail credentials anywhere in the setup, and the message is still there if the email is not.
Side by side, checked 20 October 2026
EmailJS figures come from emailjs.com/pricing and the EmailJS docs index as read on 20 October 2026. The pricing page shows more than one request figure for its Professional and Business plans, so only the Free and Personal figures are quoted. Heartdove figures come from the pricing page.
| EmailJS | Heartdove | |
|---|---|---|
| How the email is sent | Your website calls the EmailJS SDK, which sends through an email service you connect to your EmailJS account | Your form posts to Heartdove, which stores it and sends the alert from its own verified sending domain |
| Free plan | 200 requests a month, 2 templates, 7 days of history | 500 submissions a month, instant alerts, 90 days of history |
| Entry paid plan | Personal, US$9 a month: 2,000 requests, 30 days of history | Pro, US$144 a year: 5,000 submissions a month, one year of history |
| Approaching the monthly limit | Notifications at 80%, 95% and 100%; no automatic overage fees | Usage meter in the app, with a warning from 80%; no overage fees |
| Over the monthly limit | Additional requests are "safely dropped" (pricing page) | Held, visible, then released automatically |
| Record of the message | Email history on EmailJS servers: 7 days on Free, 30 days on paid plans; can be turned off per template | A searchable inbox with status, notes and tags: 90 days on Free, up to 10 years on Team |
| Delivery status | Email history log; per-message bounce status not described on the pricing page | Captured, accepted, delivered or bounced, with the reason, on every message |
| Protecting the public key | Allowlist from the Personal plan; the docs include a CAPTCHA verification guide | Exact origin check, rate limit, hidden trap, scoring and quarantine on every plan |
| Attachments | From 500 KB on Personal to 30 MB on Business | Not accepted |
| Templates and auto-replies | Yes, designed in the EmailJS dashboard | Alert emails only; no visitor auto-reply |
| Webhooks | Not listed on the pricing page | Signed webhooks on every plan; during early access we connect your endpoint for you |
Dropped or held
EmailJS’s pricing page says it does not charge automatic overage fees, sends notifications at 80, 95 and 100 percent of the monthly limit, and safely drops additional requests once the limit is reached. Upgrading restores sending.
Heartdove also has no overage fees, and handles the limit differently: a submission above the allowance is stored, shown as held, and released automatically when the allowance resets.
What a public key in the page can do
Both services put a public key in your page. With EmailJS, the key is used to send email through the templates and service in your account, and EmailJS offers an allowlist and CAPTCHA verification to control that. With Heartdove, the key only identifies the form; a post is accepted only from the website addresses you registered, is rate limited, and is scored for spam with quarantine. The key cannot send email anywhere else and cannot read anything back.
When EmailJS fits better
- You want the email to come from your own mailbox so replies thread naturally.
- You need attachments, or an automatic reply to the visitor from a designed template.
- You are sending something that is not a form submission at all, such as a notification from an app.
Heartdove does none of those today. It sends one alert email per submission, text only, and keeps the record.
Switching a form from EmailJS
Remove the EmailJS script and the emailjs.send call. Either post a plain form to the endpoint, or keep your JavaScript and post JSON with fetch. Register the website address, add the access key, and keep the hidden trap field.
<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>const response = await fetch('https://submit.heartdove.com/v1/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(), // reuse it when you retry
},
body: JSON.stringify({
access_key: 'YOUR_ACCESS_KEY',
// turnstile_token: token, // only if the form uses Cloudflare Turnstile
fields: { email, message },
}),
});
const receipt = await response.json();
// 202 { success: true, data: { id, status: 'accepted', duplicate: false } }Questions
Is Heartdove free like EmailJS?
Both have a free plan. EmailJS Free allows 200 requests a month with 7 days of history; Heartdove Free allows 500 submissions a month with an instant alert for each and 90 days of history. Neither needs a card.
Can I send email from JavaScript without a backend at all?
A browser cannot send email itself; both services run the sending on their servers. The difference is whether the browser triggers a send through your connected mailbox, or posts a form to a backend that stores it and alerts you.
Will I get an auto-reply to the visitor?
Not with Heartdove today. The visitor sees a confirmation page or your own thank-you page. EmailJS can send a templated auto-reply.
Where does the alert come from?
From the Heartdove sending domain, with the submission shown in full. Each alert is tracked until the recipient server accepts it or it bounces.
Never lose another enquiry.
Connect your first form in a few minutes. Your existing design stays exactly as it is.