Gatsby job application form

Add a job application form with resume upload to your Gatsby careers page, with no backend and no upload API. The component posts multipart FormData to Formpaste, so applications with attachments land in your inbox.

How to build it

  1. Create a form in your Formpaste dashboard and copy its access key.
  2. Connect Storage in the dashboard so the form can accept file uploads.
  3. Copy the React component above, add your access key, then build and deploy.

Prompt for your AI coding agent

Add a Formpaste job application form to my Gatsby careers page. Use a React component with name, email, role, cover note and a resume file input that POSTs the raw FormData (multipart/form-data) to https://api.formpaste.com/submit with a hidden access_key input. No serverless function, no upload endpoint of my own.

Or connect the Formpaste MCP server to Claude Code, Codex, Cursor, Claude Desktop, VS Code, or any mcp-remote client. See the setup guide.

Gatsby gotchas

Gatsby sites often reach for Netlify Forms, but you do not need it. A Formpaste form is a plain React component that posts to an endpoint, so it works whether or not you deploy on Netlify, with no build-time form detection.

You do not need Netlify Forms

Netlify Forms ties your form to Netlify hosting and its build-time HTML parsing. Posting to Formpaste from a component works on any host - Netlify, Gatsby Cloud, Cloudflare Pages, anywhere - and there is nothing to detect at build time.

It is a normal React component

Gatsby is React, so the form is a component with an onSubmit that fetches the Formpaste endpoint. No gatsby-specific plugin and no serverless function of your own.

Static build, external POST

Gatsby outputs static files and the form posts to an external endpoint, so the site stays fully static and deployable anywhere. No SSR or functions are required for the form to work.

Handle the response in state

The endpoint returns JSON. Await the fetch and show your own success state, or set a redirect URL in the dashboard for a no-JS thank-you page.

What to get right

The resume is a file upload

A real job application needs the resume attached, so the form posts multipart form data. The generated code sets enctype and sends the file with the rest of the fields.

Accept common document types

Candidates send PDF and Word files. Do not restrict to a single type or you will lose applicants.

Route applications to the right inbox

Send applications to your hiring address, and reply-to is set to the applicant so you can respond directly.

How it works

Three simple steps for form submissions to land in your email inbox.
Create your form, set your form's action URL to Formpaste's endpoint, and add your access key.

1

Create your form

Sign up, verify your email, and create an access key in your dashboard.

2

Copy the code

Paste the snippet above into your project. Pick CSS or Tailwind to match your site.

export function ContactForm() {
  async function onSubmit(e) {
    e.preventDefault();
    const form = new FormData(e.currentTarget);
    await fetch("https://api.formpaste.com/submit", { method: "POST", body: form });
  }

  return (
    <form onSubmit={onSubmit} className="mx-auto flex w-full max-w-md flex-col gap-4 rounded-xl border border-gray-200 bg-white p-6 shadow-sm dark:border-gray-800 dark:bg-gray-950">
      <input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE" />
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Full name
    <input type="text" name="name" required className="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Email
    <input type="email" name="email" required className="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Role applying for
    <input type="text" name="role" required className="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Cover note
    <textarea name="message" className="min-h-28 rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100"></textarea>
  </label>
      <label className="flex flex-col gap-1.5 text-sm font-medium text-gray-900 dark:text-gray-100">Resume
    <input type="file" name="resume" required className="rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-900 shadow-sm outline-none focus-visible:ring-2 focus-visible:ring-gray-900 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-100 dark:focus-visible:ring-gray-100" />
  </label>
      <button type="submit" className="w-full rounded-md bg-gray-900 px-4 py-2 text-sm font-medium text-white shadow-sm transition-colors hover:bg-gray-800 disabled:opacity-60 dark:bg-white dark:text-gray-900 dark:hover:bg-gray-200">Submit application</button>
    </form>
  );
}
3

Add your access key

Replace the placeholder with your access key to start receiving submissions.

<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY_HERE">

Gatsby job application form FAQ

Paste a form. Get submissions.

Instantly without setting up any backend, servers or databases. 250 submissions/mo free - no credit card.

Other Gatsby forms