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.

EmailJSHeartdove
How the email is sentYour website calls the EmailJS SDK, which sends through an email service you connect to your EmailJS accountYour form posts to Heartdove, which stores it and sends the alert from its own verified sending domain
Free plan200 requests a month, 2 templates, 7 days of history500 submissions a month, instant alerts, 90 days of history
Entry paid planPersonal, US$9 a month: 2,000 requests, 30 days of historyPro, US$144 a year: 5,000 submissions a month, one year of history
Approaching the monthly limitNotifications at 80%, 95% and 100%; no automatic overage feesUsage meter in the app, with a warning from 80%; no overage fees
Over the monthly limitAdditional requests are "safely dropped" (pricing page)Held, visible, then released automatically
Record of the messageEmail history on EmailJS servers: 7 days on Free, 30 days on paid plans; can be turned off per templateA searchable inbox with status, notes and tags: 90 days on Free, up to 10 years on Team
Delivery statusEmail history log; per-message bounce status not described on the pricing pageCaptured, accepted, delivered or bounced, with the reason, on every message
Protecting the public keyAllowlist from the Personal plan; the docs include a CAPTCHA verification guideExact origin check, rate limit, hidden trap, scoring and quarantine on every plan
AttachmentsFrom 500 KB on Personal to 30 MB on BusinessNot accepted
Templates and auto-repliesYes, designed in the EmailJS dashboardAlert emails only; no visitor auto-reply
WebhooksNot listed on the pricing pageSigned 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.

Plain form
<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>
Or with fetch
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.