Furrow Forms

Visual CMS · works with Furrow Forms

Contact forms for Hygraph sites

Keep public mutations off your GraphQL content API.

paste this into your agent

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

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

prefer clicking? start in the dashboard

components/ContactForm.tsx
export function ContactForm() {
  const loadedAt = Date.now();
  return (
    <form action="https://api.furrowforms.com/s/fp_k7m2" method="POST">
      <input type="text" name="_gotcha" style={{ display: 'none' }} tabIndex={-1} />
      <input type="hidden" name="_ft" value={loadedAt} />
      <input name="name" type="text" required />
      <input name="email" type="email" required />
      <textarea name="message" required />
      <button>Send</button>
    </form>
  );
}

The gap

Why Hygraph sites need a form backend

Hygraph (formerly GraphCMS) gives you a federated GraphQL layer over your content — and a temptation: it speaks mutations, so why not mutate form submissions into a model? Because that means a write-capable token in the client or a custom proxy in front of it, spam entries inside your content environment, and bot traffic against the API your pages query. Furrow Forms is the separation of concerns: forms POST to Furrow, your content API stays read-only to the public, and verified submissions arrive by signed webhook wherever you want them.

01

Mutations need credentials; forms face the internet

Public form traffic and authenticated content mutations don’t mix — you end up proxying, and now you maintain a form handler anyway. Furrow’s public keys are designed for client-side exposure; its spam stack does the gatekeeping.

02

Spam inside the content environment

Submissions-as-content puts junk entries in the same environment your team schedules releases from, consuming API operations along the way. Rejected posts never reach Furrow’s storage — or your quota.

03

Enterprise content ops, ad-hoc form ops

Teams choose Hygraph to standardize content across brands and regions. Furrow gives forms the same shape: projects per site, settings inherited, everything auditable and manageable over API.

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 Hygraph 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 — your Hygraph schema is untouched.
  2. 02Paste the snippet into your frontend.
  3. 03Configure domains, recipients, and a webhook once at the project level.
  4. 04If submissions belong in your systems, consume the signed webhook server-side — verified, retried, logged.

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

FAQ

Hygraph + Furrow Forms, answered

How do I handle contact forms with Hygraph?

Keep them out of your content API: point the form at a Furrow Forms endpoint. Furrow filters spam, stores the submission, notifies your team, and can deliver a signed webhook to your backend — while your Hygraph project stays read-only to visitors.

Why not store submissions as Hygraph content entries?

Doing it from the browser requires exposing a write-capable token; doing it safely requires building and running a proxy — the very form handler you were avoiding. Either way, spam lands inside your content environment and consumes API operations. A dedicated form backend sidesteps all of it.

Does this work with whatever frontend we use?

Yes — the form is plain markup with a POST action, so Next.js, Astro, Nuxt, SvelteKit, or static HTML all behave the same. Classic POSTs get a 303 redirect to your thank-you page; fetch() calls get JSON.

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 →