Furrow Forms

Headless CMS · works with Furrow Forms

Contact forms for Payload sites

Code-first CMS, code-first form backend — keep submissions out of your content DB.

paste this into your agent

Fetch furrowforms.com/ai and set up a contact form backend for my Payload site.

agent-readable recipe: /forms-for/payload.md

prefer clicking? start in the dashboard

components/ContactForm.tsx
'use client';

export function ContactForm() {
  const loadedAt = Date.now();
  async function submit(formData: FormData) {
    const res = await fetch('https://api.furrowforms.com/s/fp_k7m2', {
      method: 'POST',
      body: formData,
    });
    const { ok } = await res.json(); // { ok: true, id: "sub_…" }
  }

  return (
    <form action={submit}>
      <input type="text" name="_gotcha" style={{ display: 'none' }} tabIndex={-1} />
      <input type="hidden" name="_ft" value={loadedAt} />
      <input name="email" type="email" required />
      <textarea name="message" required />
      <button>Send</button>
    </form>
  );
}

The gap

Why Payload sites need a form backend

Payload is the code-first CMS: config lives in TypeScript, the admin panel is generated, and — in Payload 3 — the whole thing runs inside your Next.js app. Forms are where that elegance usually ends. The moment a contact form goes live you own spam filtering, email delivery, and a public write path into your own database. Furrow Forms takes that slice off your plate: one POST endpoint per form, spam handled, notifications sent, signed webhooks out — while Payload keeps doing what it is for.

01

A public write path into your own stack

A contact form that writes into Payload means an unauthenticated endpoint feeding your production database — and every bot that finds it lands in the same admin panel your editors use. Furrow absorbs that traffic on its own infrastructure; only signed webhooks reach you.

02

Deliverability is now your problem

Rolling your own handler means configuring a mail provider, warming up sending, and debugging the notification that silently stopped arriving. Furrow sends notification emails with template tokens out of the box, on every tier.

03

One site is easy. Your roster is not.

Payload shops rarely run one site. Furrow’s settings cascade — Turnstile keys, allowed domains, notify recipients, webhooks — is configured once per project and inherited by every form, across as many sites as you run.

Two ways in

Set it up yourself, or don’t

Hand it to your agent

[ recommended ]

Furrow’s whole control plane is an API and MCP server. Paste this prompt into Claude Code, Cursor, or any agent — it does the rest:

paste this into your agent

Fetch furrowforms.com/ai and set up a contact form backend for my Payload site.
  1. 1.Registers the account over POST /api/register — you read one 6-digit email code
  2. 2.Provisions the site: client, project, and forms in one idempotent bootstrap_site call
  3. 3.Pastes the generated snippet into your codebase
  4. 4.Fires test_webhook and verifies the signed delivery

Or do it by hand

  1. 01Create a free account and a project for the site (or let your agent do it — Payload people tend to have one running anyway).
  2. 02Create the form; copy the generated Next.js snippet into your app’s components.
  3. 03Set allowed domains, notify emails, and an optional webhook once, on the project — every form inherits them.
  4. 04Ship it. Spam is filtered before it counts; deliveries are signed and retried.

free tier: 100 subs/mo · unlimited forms · full API + MCP · pricing →

FAQ

Payload + Furrow Forms, answered

How do I add a contact form to a Payload CMS site?

Add a plain form component to your Next.js frontend that POSTs to a Furrow Forms endpoint (https://api.furrowforms.com/s/<key>). Furrow stores the submission, filters spam, emails your team, and fires a signed webhook — no Payload collection, access rules, or email config required.

Should form submissions live inside Payload?

Only if editors need to manage form layouts in the admin panel — that is what the official Form Builder plugin is for. For a contact form, keeping an unauthenticated write path out of your CMS database is the safer default: let a dedicated backend absorb the bot traffic and forward real submissions by webhook.

Can an AI agent set this up while building my Payload site?

Yes — that is Furrow’s specialty. An agent scaffolding your Payload project can register a Furrow account via API, provision the site’s forms in one bootstrap_site call over MCP, drop the generated snippet into your components, and verify the webhook — without a dashboard.

The form backend your agent can run.

paste this into your agent

Fetch furrowforms.com/ai and set up forms for this site.

Setup for agents →