Skip to content
← All comparisons

Compare · EmailJS

Formward vs EmailJS: stored, filtered submissions

EmailJS solves a narrow problem neatly: send an email from front-end JavaScript using a template, without a server. You install the SDK, add a public key, a service ID and a template ID, and call sendForm.

Formward is a form backend. The browser posts the form, and Formward stores the submission, runs spam checks, sends the notification and keeps a searchable record. If all you want is an email and you are happy with a short sent-mail history, EmailJS is lighter. If you want the submissions themselves, Formward is the better tool.

Last checked 7 October 2026. Every statement about EmailJS on this page comes from EmailJS's own website, listed under Sources. Where we could not confirm something, the table says "Not checked" rather than guessing. Prices and plans change, so confirm them on their site before you decide. Formward's numbers come straight from our live plan table.

At a glance

Formward

  • Operated by EGF Fastighetsservice AB in Stockholm, Sweden.
  • Submissions stored at Hostup AB in Sweden; notification email sent through Mailjet in the EU.
  • Cloudflare Turnstile (US) is only involved on forms where you switch it on.
  • Billing runs through Stripe, which never receives form content.

EmailJS

  • EmailJS Pte. Ltd., Singapore.
  • Servers in the USA, operated by Amazon Web Services.
  • Publishes a DPA based on the EU Standard Contractual Clauses.
  • Keeps a history of sent emails: 7 days on Free, 30 days on paid plans.

Feature comparison

CapabilityFormwardEmailJS
What it isForm backendEmail sending from client-side JavaScript
Stores submissionsYes, searchable, with your own retention settingEmail history for 7 or 30 days
Needs JavaScriptNo, a plain HTML form worksYes, the SDK sends the email
Where data is processedHostup AB, SwedenAWS, USA
Free plan50 submissions a month, kept 30 days200 requests a month, 2 templates
AttachmentsProfessional and up (5 files, 10 MiB each)From Personal (500 KB)
Server-side spam filteringHoneypot, rate limits, disposable-email blocking, optional TurnstileNot checked
Rate limitPer-form limits you set1 request per second

Pricing

Formward planMonthlyPer month, yearlySubmissions / mo
Free€0€050
Personal€15€10200
Professional€30€202,000
Business€90€6020,000

EmailJS

  • Free: $0, 200 requests a month, 2 templates, 7-day history.
  • Personal: $9 a month, 2,000 requests, 6 templates, 500 KB attachments.
  • Professional: $15 a month, 5,000 requests, unlimited templates, 2 MB attachments.
  • Business: $40 a month, 25,000 requests, 30 MB attachments.

Current figures: EmailJS pricing · all Formward plans

EU, GDPR and data location

EmailJS states that its servers are in the USA and run on Amazon Web Services, and it relies on the EU Standard Contractual Clauses in its DPA. The email it sends goes to whatever mailbox your template targets.

Formward stores and processes form submissions in the EU: the application and database run at Hostup AB in Sweden, notification email goes out through Mailjet in the EU, and AI features on Professional and Business use Mistral AI in France. One optional sub-processor is outside the EU: Cloudflare Turnstile (US), which only sees the anti-bot challenge and only on forms where you enable it. Data leaves the EU when you send it there yourself, for example to a notification mailbox hosted by a US provider, a Google Sheets sync or a webhook URL.

The details are in Formward's sub-processor register, the DPA (accepted in the dashboard) and the transfer-impact statement.

Moving from EmailJS

Effort: Low. What changes:

  • Remove the @emailjs/browser package and its public key, service ID and template ID.
  • Post the form to your Formward endpoint, with or without JavaScript.
  • Set the notification address and subject on the Formward form instead of in an email template.

Before: EmailJS

import emailjs from "@emailjs/browser";

emailjs.init({ publicKey: "YOUR_PUBLIC_KEY" });

form.addEventListener("submit", async (event) => {
  event.preventDefault();
  await emailjs.sendForm("YOUR_SERVICE_ID", "YOUR_TEMPLATE_ID", form);
});

After: Formward

form.addEventListener("submit", async (event) => {
  event.preventDefault();
  const res = await fetch("https://forms.formward.eu/f/<formId>", {
    method: "POST",
    headers: { Accept: "application/json" },
    body: new URLSearchParams(new FormData(form)),
  });
  if (!res.ok) throw new Error("Submission failed");
});
  1. Create a form in Formward, set the notification email and copy the endpoint.
  2. Replace the sendForm call with a fetch() to the endpoint, or drop the script and set the form's action.
  3. Add a hidden _gotcha field as a honeypot and add your site's origin to the allowed origins.
  4. Send a test entry and remove the EmailJS keys from your code.

The full walkthrough, with the field mapping and the behaviour differences to test, is in the EmailJS migration guide.

Which one fits

Choose Formward for

  • Forms where you need a record of every submission, not just an email.
  • Sites that should work without JavaScript.
  • EU teams that want submissions processed in the EU.

Choose EmailJS for

  • Sending templated emails from an app, not only from forms.
  • Prototypes where an email is all you need.

Questions

Can I keep my React or Vue code?
Yes. Only the submit handler changes: replace the EmailJS call with a fetch() to your Formward endpoint. The framework pages show complete components.
Are my keys exposed in the browser with Formward?
There are no keys in the browser. The endpoint URL is public by design, and you protect it with allowed origins, rate limits and the honeypot on the Formward side.
How much does Formward cost?
Formward has a free plan with 50 submissions a month. Paid plans are EUR 15 a month (Personal, 200 submissions), EUR 30 (Professional, 2,000) and EUR 90 (Business, 20,000). Paying yearly brings those down to EUR 10, 20 and 60 a month.

Read next

Sources

Last checked 7 October 2026

Try Formward on one form

The free plan takes 50 submissions a month with no card. Point a test form at it and see the whole path before you move anything that matters.

EmailJS alternative with stored submissions: Formward