Formstork

FRAMEWORK

Add a form backend to your Remix app

Formstork receives submissions from any Remix form, emails you each one, and keeps every message in a searchable dashboard. Your route POSTs the form data straight to Formstork, so there is no action to write or database to build.

How it works

Remix is a full-stack React framework, so it does give you a server: a route's action function normally receives the form POST. But you would still have to write that action, wire up an email service, and store rows somewhere. Formstork is that backend, ready-made. You can skip the Remix action entirely and POST the form data straight to Formstork from a client-side onSubmit handler, or call the same endpoint from inside your action if you prefer to keep the request on the server. Either way, your form's fields plus a hidden access_key go to https://api.formstork.com/submit, and Formstork emails you each submission, sets the visitor's email as the reply-to, and saves it to a searchable, taggable dashboard. Turn on spam filtering, an integration like Slack or Google Sheets, or an autoresponder whenever you need one.

tsx
import { useState } from "react";
import type { FormEvent } from "react";

export default function Contact() {
  const [status, setStatus] = useState("idle");

  async function handleSubmit(event: FormEvent<HTMLFormElement>) {
    event.preventDefault();
    setStatus("sending");
    const res = await fetch("https://api.formstork.com/submit", {
      method: "POST",
      headers: { Accept: "application/json" },
      body: new FormData(event.currentTarget),
    });
    setStatus(res.ok ? "sent" : "error");
  }

  if (status === "sent") return <p>Thanks, we got your message.</p>;

  return (
    <form onSubmit={handleSubmit}>
      <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
      <input type="email" name="email" placeholder="Your email" required />
      <textarea name="message" placeholder="Your message" required />
      <button disabled={status === "sending"}>Send</button>
    </form>
  );
}

No action or database to build

Remix gives you an action function for form POSTs, but you would still write it, wire up email, and store rows somewhere. Formstork is that backend, so you point your form at one endpoint and skip all of it.

Client fetch or server action, your call

Because a submission is just an HTTP POST, you can send it from a client-side onSubmit handler with fetch(), or call Formstork from inside your Remix action to keep the request on the server. There is an @formstork/react package too, but a plain fetch is all you need.

Spam filtering and integrations included

Every form gets a honeypot and a server-side content filter, with optional Turnstile, hCaptcha, or reCAPTCHA. Each submission can also route to Slack, Discord, Telegram, Notion, Airtable, Mailchimp, Google Sheets, or a signed webhook.

Set it up

  1. 1Build your form as a Remix route component with the fields you need (name, email, message), or start from Formstork's hosted no-code form builder.
  2. 2On submit, gather the fields into FormData, include your access key as access_key, and fetch() them to https://api.formstork.com/submit (or call the same endpoint from your route's action instead).
  3. 3Sign up at app.formstork.com, copy your access key from the dashboard, and swap it in for YOUR_ACCESS_KEY.
  4. 4Submit once to test. The submission lands in your inbox and your Formstork dashboard, with the visitor's email set as the reply-to. Optional: connect an integration like Slack or Google Sheets.

Frequently asked questions

How do I handle form submissions in Remix?

Point your Remix form at the Formstork endpoint. Add a hidden access_key field and POST the fields to https://api.formstork.com/submit, either with fetch() in a client-side onSubmit handler or from your route's action. Formstork emails you each submission and stores it in your dashboard, so you do not need to build your own action or database.

Do I need to write a Remix action?

No. Formstork is the backend that receives the POST, so a client-side fetch() from an onSubmit handler is enough. If you prefer to keep the request on the server, you can call the same endpoint from inside a Remix action, but it is optional.

Is it free to start?

Yes. The free plan includes 250 submissions a month with the full dashboard, email delivery, spam filtering, integrations, and CSV and JSON export, with no credit card and 90-day retention. Paid plans add more volume, forever retention, autoresponders, and file uploads.

Try Formstork free

250 submissions a month with a full dashboard. No credit card required.

Get your access keyRead the docs