GDPR-friendly · Hosted in the EU
The EU form backend you paste once and never maintain.
Paste one API key as your form's action. Submissions land in your dashboard and ping your phone instantly - and never leave the EU.
Free tier: 5 forms · 250 submissions/month · No credit card.
Build it for your client. Hand over the form and every submission. Same key. No redeploy.
<form action="https://formhook.app/f/fh_..." method="POST">
<input type="email" name="email" required>
<textarea name="message" required></textarea>
<button type="submit">Send message</button>
</form>That's the integration. There is no step two.
contact-form
● Live
Submissions
Mila Petrović
Just now
Can we discuss the new website?
Aarav Sharma
Today
Does the free plan keep submissions forever?
Chloé Martin
Today
Are my submissions stored in the EU?
Germany · Kept forever · Export ZIP
New submission - contact-form
Mila: Can we discuss the new website?
Product illustration / not customer data
Read the docs- Stored in Germany
- Kept forever, even on Free
- Export everything, any plan
- Built by a studio that uses it
- Soft cap - never drops a lead
01 / From HTML to your phone
Three steps. Then get back to building.
- 01
Create a form
Give it a name. Get your unique endpoint.
- 02
Paste the key as your action
Keep your HTML, your styles, your framework.
- 03
Get pinged
Live dashboard, native web push and email.
02 / Residency is architecture
EU hosting, no asterisks.
Your submissions are stored in the EU and never leave it - nothing to assess, nothing to renegotiate, nothing that ends up in court.
Browser
Your visitor submits the form over HTTPS.
Cloudflare edge
TLS + DDoS protection. Nothing persisted. No submission-body storage.
Hetzner VPS, Germany
Submissions live here. Kept forever on every plan, including Free.
File uploads → Cloudflare R2, EU
Paid plans: 10 MB per file. EU storage, with short-lived signed download URLs.
Cloudflare R2, EU
File attachments. A separate EU storage boundary.
Safe Harbor and Privacy Shield were struck down. The Data Privacy Framework is under appeal. Formhook's submission storage does not rely on a US transfer framework.
Concrete infrastructure. A published DPA. No residency add-on.
03 / For the work you ship for others
Ship the site. Hand over the form.
Build and test in your Studio account. When the project wraps, the client gets the form and every submission - not another maintenance agreement.
Studio builds + tests
Connect the client site on your account. One form per client.
One-click transfer
A 7-day invite. Pending forms stay live and collecting. Same API key, no redeploy.
Client owns it all
The form and every submission. You keep a metadata-only console.
Studio clients
Metadata only after claim · Illustrative records
- contact-formActive184 / 30d
- project-enquiryPending36 / 30d
- booking-formActive72 / 30d
After claim: name, status and 30-day count only. No submission content.
- Transfer when the project wraps.
- One form per client.
- Maintenance-free after handoff.
- Pass EU residency into the client's privacy policy.
04 / A small backend. The right defaults.
Everything the form needs after “Send”.
A real ping. Not another inbox tab.
Native web push on desktop and phone, plus email. Included on every plan.
09:41
New submission - contact-form
Mila: Can we discuss the new website?
Kept forever.
Every submission, every plan. Your history doesn't expire when a billing cycle does.
Retention / forever
export.zip
Production defaults, not a checklist for later.
Honeypot, rate limits, optional Turnstile, per-form CORS allowlist and strict redirect validation.
Protection / enabled
- Honeypot
- Rate limits
- X-Auth-Token
CORS allowlist
Bring your own Turnstile secret. Soft caps accept over-quota submissions, with warnings at 80% and 100%.
Send it to the tools you use.
HMAC-signed webhooks. Ready-formatted for Discord, Slack and Teams. Pro+.
POST / WEBHOOK
File uploads on Pro+.
10 MB each. Pro: 1 GB. Studio: 10 GB. EU storage.
project-brief.pdf
Reply from the dashboard.
Keep the conversation with the submission. Pro+.
REPLY TO / mila@example.com
05 / Drop it in
Your HTML. One new action.
No SDK. No framework lock-in. JSON, form-encoded or multipart - send the form you already have.
- Hidden honeypot field stops the lazy bots; Cloudflare Turnstile handles the rest.
- Optional
_redirectfield for native form posts - strictly validated against your origin allowlist, no open redirects. - Per-form CORS allowlist. Browser submissions from unknown origins are rejected at the edge.
<form action="https://formhook.app/f/fh_..." method="POST">
<input type="email" name="email" required>
<input name="_gotcha" type="text" hidden>
<input type="hidden" name="_redirect" value="https://example.com/thanks">
<textarea name="message" required></textarea>
<button type="submit">Send message</button>
</form>await fetch("https://formhook.app/f/fh_...", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
email: "user@example.com",
message: "Hello",
}),
});"use client";
export function ContactForm() {
async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
e.preventDefault();
const data = Object.fromEntries(new FormData(e.currentTarget));
await fetch("https://formhook.app/f/fh_...", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
});
}
return (
<form onSubmit={onSubmit}>
<input name="email" type="email" required />
<textarea name="message" required />
<button>Send message</button>
</form>
);
}curl -X POST https://formhook.app/f/fh_... \
-H "Content-Type: application/json" \
-d '{"email":"test@example.com","message":"hi"}'POST endpoint only. No read/query API.
06 / Framework-optional
Works with your stack.
Static site, server-rendered page or a little JavaScript. Same endpoint.
07 / Clear limits. No expiry dates.
Start free. Grow into client work.
EU storage, forever retention and a full exit on every plan.
Free
For production. Not just a trial.
€0/ mo
Free forever. No credit card.
- 5 forms
- 250 submissions / month
- 1 seat
- Forever retention
- Native push + email
- Honeypot, rate limits, Turnstile
- CORS allowlist + X-Auth-Token
- Full ZIP export + import
Pro
For growing sites and independent projects.
€12.50/ mo
billed €150/year
- Unlimited forms
- 5,000 submissions / month
- 3 seats
- Everything in Free
- Signed webhooks: Slack, Discord, Teams
- 10 MB files · 1 GB storage
- Reply from the dashboard
- Priority email
Studio
For client workFor the client work you want to hand over.
€40.83/ mo
billed €490/year
- Unlimited forms
- 25,000 submissions / month
- 10 seats
- Everything in Pro
- 10 MB files · 10 GB storage
- Client handoff + multi-client console
Need higher limits? Get in touch. All plans are billed in EUR via Polar, our Merchant of Record - VAT and invoicing are handled for you.
Your data, your exit
Can I export my submissions?
What happens if Formhook shuts down?
action URL is the only integration point, so switching providers is editing one line of HTML. Your forms keep working until the last day, and leaving takes one line.Built for our own client work.
Built and run by Astropixels, a web studio that uses Formhook for its own client work. The Studio plan exists because we needed it.
One less thing to maintain
Ship the form, not the backend.
You shouldn't have to write a form receiver in 2026. Spend ten seconds connecting your HTML, then move on.