Post your form straight to an endpoint. No script, no keys in your code, and every submission kept and labeled lead, review, spam, junk, or bot. 500 screened submissions a month free.
Published Updated
Based on each product’s public plans and docs. Features change, so check their latest if you are unsure.
EmailJS sends an email from the browser with its SDK, a template, and a public key in your code. The free plan covers 200 requests a month with 7 days of history, and spam protection is an optional reCAPTCHA v2 on each template. It sends whatever the form holds, so bot fills and sales pitches both reach your inbox. GoodInbound takes a plain form post, keeps every submission, and labels each one with a reason.
Point your form's action at GoodInbound. It works with plain HTML and any framework, with or without JavaScript, and there's no key to manage.
Every submission is stored with its label and reason, instead of going out as an email and leaving a log that expires.
Behavior, network, identity, and on Pro the message itself are checked first. Visitors never see a CAPTCHA.
EmailJS is handy for sending templated emails from the browser. For a contact form, GoodInbound gives you a stored, screened inbox without an SDK.
Unlimited projects on every plan. Pro adds advanced screening, enrichment, and analytics, with extra seats, contacts, and monthly submission packs when you grow.
Free, spam-filtered contact forms with notifications and workflows.
Included features:
Advanced spam screening and bigger limits.
Everything in Free, plus:
For headless volume, security reviews, and custom scale.
Everything in Pro, plus:
Yes, for 200 email requests a month with two templates and seven days of history. Paid plans start at $9 a month for 2,000 requests, and requests past the monthly limit are dropped (checked October 2026).
EmailJS says a copied public key can only send your own templates. Anyone can still fill those templates with their own text, which is why paid plans add a domain allowlist and you can require reCAPTCHA v2. A form endpoint has no key to copy.
Create a form in GoodInbound, set your form's action to its HTML action URL with method POST, and name each input after the matching field. Then remove the EmailJS script and the sendForm call. To stay on the page, submit with fetch() and an Accept: application/json header.