Furrow Forms

Frameworks & SSGs · works with Furrow Forms

Contact forms for Next.js apps

Delete /api/contact — one endpoint replaces the route, the filter, and the mailer.

paste this into your agent

Fetch furrowforms.com/ai and set up a contact form backend for my Next.js app.

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

prefer clicking? start in the dashboard

components/contact-form.tsx
'use client';
import { useState } from 'react';

export function ContactForm() {
  const [sent, setSent] = useState(false);
  const [loadedAt] = useState(() => 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();
    setSent(ok);
  }

  if (sent) return <p>Thanks — we’ll be in touch.</p>;
  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 Next.js sites need a form backend

Every Next.js app eventually grows a /api/contact route: parse the body, check a captcha, call a mail API, maybe store the thing, forget to rate-limit it. It is the most-rewritten forty lines in the ecosystem. Furrow Forms replaces the route entirely — your form POSTs from the client to a managed endpoint with the spam stack on by default, and your team gets email while your systems get HMAC-signed webhooks. Snippets are generated natively for Next.js from the form’s field contract, and the whole backend is provisionable by the same AI agent that scaffolds your app.

01

The form route is a liability, not a feature

Unrate-limited API routes get found; mail-provider keys leak into env sprawl; the captcha wiring breaks quietly. Furrow ships honeypot, Turnstile, domain allowlisting, and per-IP rate limits as defaults — someone else’s pager.

02

Static and edge deployments stay simple

Exporting statically or running fully on the edge? There is no server dependency to accommodate — the form talks to Furrow, not to your deployment.

03

Multi-app fleets, one control plane

Recipients, webhooks, and keys are project-level settings managed over REST or MCP — the same call pattern for every Next.js app you or your agents 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 Next.js app.
  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 (or let the agent building your app do it over MCP).
  2. 02Copy the generated Next.js snippet into components/ and delete the /api/contact route.
  3. 03Configure domain, recipients, and webhooks once at the project level.
  4. 04Deploy anywhere — Vercel, self-hosted, static export — the form backend is independent of the host.

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

FAQ

Next.js + Furrow Forms, answered

How do I add a contact form to a Next.js app?

POST the form data to a Furrow Forms endpoint from a client component (or a plain form action). Furrow validates against its spam stack, stores the submission, sends notification email, and fires signed webhooks — replacing the custom /api/contact route entirely.

Why not just write an API route with a mail library?

You can — and you then own spam filtering, rate limiting, captcha wiring, deliverability, storage, and retries, per app, forever. A form backend turns those forty recurring lines into managed infrastructure with a delivery log.

Does this work with static export or edge runtimes?

Yes. The submission goes browser-to-Furrow, so output: "export", edge rendering, and self-hosting all work identically. CORS is honored for your project’s allowed domains.

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 →