The short answer
FormSubmit and RG Forms solve the same problem with different amounts of setup. FormSubmit needs no account at all — you point your form at their endpoint with your email address, confirm it once, and submissions are forwarded to your inbox, which makes it the fastest option in the category. RG Forms takes about two minutes to set up because it provisions a Google Sheet and an Apps Script endpoint inside your own Google account, and in exchange every submission is stored as a spreadsheet row you own rather than existing only as an email. Pick FormSubmit for speed on a small site; pick RG Forms when you want a searchable, sortable record that survives a deleted inbox.
Side by side
| FormSubmit | RG Forms | |
|---|---|---|
| Account required | No — confirm your address on first submission | Yes — sign in with Google |
| Time to first working form | Under a minute | About two minutes |
| Where submissions end up | Your inbox | A Google Sheet in your Drive, plus optional email |
| Searchable history | Whatever your mail client gives you | A spreadsheet you can sort, filter and annotate |
| Works without JavaScript | Yes — plain form post with redirect | No — fetch required |
| Cost | Free | Free |
| Custom redirect / thank-you page | Yes, via hidden fields | You stay on the page and show your own success state |
| Spam protection | Built-in options including a captcha toggle | Honeypot, plus Cloudflare Turnstile verified server-side |
The real question: is an email enough?
For a personal site or a one-page portfolio, yes. Messages arrive, you reply, done. Adding a spreadsheet to that is ceremony you don’t need.
It stops being enough at a predictable moment — usually when someone asks a question the inbox can’t answer. *How many enquiries did we get last month? Which ones haven’t been replied to? Can you send the marketing person a list?* Email is a delivery mechanism, not a record. If a notification is filtered, deleted, or sent to someone who has since left, the submission is simply gone.
RG Forms writes the row first and emails second. If the email fails or the quota is hit, the row is still there. That ordering is the entire difference.
Choose FormSubmit when
You want zero setup. No account, no OAuth, no provisioning step. Hard to beat.
JavaScript can’t be a requirement. The plain form post with a redirect works with JS disabled.
The site is small and personal. A handful of messages a month, one person reading them.
You want a classic redirect flow. Submit, land on a thank-you page. Some people prefer that to an in-page success state.
Choose RG Forms when
You need the history. Every submission, timestamped, in a sortable sheet — including the ones you deleted from your inbox by accident.
Someone else may need access. Share a spreadsheet with a colleague; you can’t share your inbox.
It’s a client site. Handing over a Google Sheet of leads is a deliverable. Forwarding emails isn’t.
You want the data to do something. Charts, filters, a “replied?” column, or anything that reads Google Sheets.
The RG Forms integration
<form id="contact-form">
<label>Name <input name="name" required /></label>
<label>Email <input type="email" name="email" required /></label>
<label>Message <textarea name="message" required></textarea></label>
<!-- Honeypot: humans never see it, bots fill it in -->
<input type="text" name="_hp" tabindex="-1" autocomplete="off"
style="position:absolute;left:-9999px" aria-hidden="true" />
<button type="submit">Send</button>
<p id="form-status" role="status"></p>
</form>
<script>
const ENDPOINT = "https://script.google.com/macros/s/AKfycb.../exec";
const form = document.getElementById("contact-form");
const status = document.getElementById("form-status");
form.addEventListener("submit", async (event) => {
event.preventDefault();
status.textContent = "Sending…";
const res = await fetch(ENDPOINT, {
method: "POST",
// text/plain avoids the CORS preflight Apps Script can't answer
headers: { "Content-Type": "text/plain" },
body: JSON.stringify({
tab: "contact",
fields: Object.fromEntries(new FormData(form)),
}),
});
const data = await res.json();
status.textContent =
data.result === "success" ? "Thanks — we'll be in touch." : "Something went wrong.";
if (data.result === "success") form.reset();
});
</script>Common questions
Is FormSubmit’s no-account setup a security problem?
No — they confirm ownership of the destination address before forwarding starts, which is the check that matters. It’s a sensible design for what it does.
Does RG Forms have a redirect option?
Not built in. Because it’s a fetch, you stay on the page and show your own success state — which is generally the better experience, and you can always window.location to a thank-you page yourself after a success response.
Which one handles more volume?
Both are fine at contact-form volume. RG Forms’ one real ceiling is notification email — Google caps Apps Script at roughly 100 recipients/day on free Gmail — but rows keep saving past that, so nothing is lost.
Can I switch later without changing my form much?
Yes. Both are “point your form somewhere” tools. Moving means changing the endpoint URL and the submit handler — an hour of work at most, and you keep whatever history you already have.
More answers in the full FAQ.