splitforms.com
Platforms · 27 frameworks

Contact forms for every framework.

Pick your stack. Each guide ships with a working code example, the 3-step setup, and best practices for that framework — one endpoint, 500 free submissions a month, and no backend to build.

Get free access key Read the docs
Frameworks

One backend, every framework.

27 copy-paste guides — same endpoint, same dashboard, tailored to how you build.

HTML contact form

The simplest possible setup. Drop one `<form>` tag into your HTML and submissions land in your dashboard. Free includes inbox delivery. No JavaScript, no backend, no server to maintain. Works on GitHub Pages, S3, Cloudflare Pages, plain Apache — anywhere static HTML can be served.

Read the guide →

Next.js contact form

Add a free Next.js contact form to your app in three steps — client component or server action, both supported. No API route to maintain, no backend code to ship.

Read the guide →

React contact form

Build a working contact form for your React website and send submissions straight to your inbox — in three steps, with no backend or server code. Works with Vite, Create React App, Remix, and Gatsby.

Read the guide →

Vue contact form

Composition API, Options API, Nuxt, Vite — every Vue setup works with one tiny single-file component. Submit a form, get email notifications, dashboard analytics, and webhooks. No backend, no SDK, no $30/mo plan.

Read the guide →

Astro contact form

Astro&apos;s zero-JS-by-default philosophy pairs perfectly with the splitforms endpoint. Use a pure HTML form for static pages, an Astro Action for SSR, or a React/Vue/Svelte island for client-side interactivity. Same backend, three patterns, zero hydration cost when you don&apos;t need it.

Read the guide →

Svelte contact form

SvelteKit, classic Svelte, Vite, Astro islands — pick your flavor. One reactive component, full form handling, no backend route. Works with Svelte 4 stores and Svelte 5 runes.

Read the guide →

Webflow contact form

Webflow&apos;s built-in forms cap free submissions and gate webhooks behind paid plans. Point your existing Form Block at the splitforms endpoint instead — same drag-and-drop designer, real backend, 500 submissions/month free, and signed webhooks from Pro.

Read the guide →

Carrd contact form

Carrd&apos;s native form widget needs a Pro Standard plan AND a Mailchimp/SendGrid/Basin integration to actually email you. Skip both. Set the form Type to &quot;Custom&quot; and point it at the splitforms endpoint — 60 seconds, 500 free submissions per month.

Read the guide →

WordPress contact form

Skip Contact Form 7, WPForms, Gravity Forms, Forminator, and the rest of the bloated plugin economy. One form tag in your theme or a Custom HTML block gives you a working WordPress contact form that sends submissions to your inbox plus the splitforms dashboard. No plugin, no `wp_options` clutter, no database table, no PHP cron job.

Read the guide →

Tailwind CSS contact form

A polished, accessible, dark-mode-ready Tailwind contact form template. Drop into any project that has Tailwind configured — Next.js, React, Astro, Vue, Svelte, plain HTML. Includes focus rings, validation states, loading spinner, and a working backend.

Read the guide →

AJAX (vanilla JS) contact form

No framework? No problem. Submit a form via the native `fetch()` API and show inline success/error messages — pure browser JavaScript, zero dependencies, no jQuery, no axios. Works in every modern browser back to Edge 18.

Read the guide →

Hugo contact form

Hugo builds blazing-fast static sites — but ships zero backend. Drop a partial or shortcode in your theme, pull the access key from site params, and you have a working contact form without spinning up a Cloud Run service or wiring Netlify Functions. Pure HTML, zero JavaScript, full spam protection.

Read the guide →

Gatsby contact form

Gatsby is React under the hood, so any React form works — but the build is static. Use the splitforms endpoint to skip Netlify Forms (which limit submissions on free tier), Lambdas, Gatsby Functions, and AWS API Gateway entirely. One React component, 500 free submissions per month, dashboard included.

Read the guide →

Eleventy contact form

11ty&apos;s beauty is its simplicity — and a contact form should match. One Nunjucks (or Liquid) include, one form tag, no serverless function in sight. Pull the access key from global data, render zero JavaScript, and ship submissions straight to your inbox.

Read the guide →

SvelteKit contact form

Use SvelteKit&apos;s progressive-enhancement form actions for a no-JS-required experience, or a plain client-side fetch for tight control over loading state. Both patterns work with the splitforms endpoint — standard FormData in, JSON out, every adapter supported.

Read the guide →

Framer contact form

Framer&apos;s built-in forms send to a single email, gate webhooks behind paid plans, and limit free submissions. Paste a Code Component instead — same canvas drag-and-drop, real backend, 500 submissions/month free, dashboard search, and signed webhooks from Pro.

Read the guide →

Nuxt contact form

Nuxt 3, Nuxt Content, Nuxt Studio, Nuxt UI — all flavors work. Use a Vue 3 Composition API page, pull your key from runtimeConfig.public, and skip writing a `/server/api` route. Or use a Nitro server route to keep the key server-side. Both patterns supported.

Read the guide →

Alpine.js contact form

Alpine.js's tiny footprint pairs naturally with splitforms — declare `x-data` for state, `@submit.prevent` for the handler, and POST to splitforms. No build step, no SPA framework, no server route.

Read the guide →

Bootstrap contact form

Bootstrap 5's form components handle the UI; splitforms handles the backend. Use `.form-control` + `.was-validated` for native validation, POST to splitforms, and ship a working contact form in minutes.

Read the guide →

Jekyll contact form

Jekyll-built static sites have no backend by design — splitforms gives them one. Drop the form into a Liquid template, point the action at splitforms, and your GitHub Pages or S3-hosted Jekyll site has a working contact form in seconds.

Read the guide →

Vite contact form

Vite's fast HMR and zero-config bundling pair well with splitforms. Whether you're building vanilla, React, Vue, Svelte, or Solid on top of Vite, the same fetch-based pattern works — read your access key from `import.meta.env`, POST to splitforms.

Read the guide →

JavaScript contact form

Plain HTML form plus a few lines of vanilla JavaScript — no framework, no library, no build step. fetch() POSTs the FormData to splitforms; you get the response inline and update the DOM. Zero dependencies.

Read the guide →

Cloudflare Pages contact form

Cloudflare Pages doesn't ship a built-in form handler the way Netlify does. splitforms fills the gap — your static Pages site POSTs the form to splitforms, and you skip writing a Worker for it. Works with Pages Functions too if you prefer a server-side proxy.

Read the guide →

Netlify contact form

Netlify Forms is free and unlimited on current credit plans, but it stays coupled to Netlify hosting. splitforms swaps in cleanly when you need a portable endpoint, an independent dashboard, and signed webhooks from Pro.

Read the guide →

Vercel contact form

Vercel has no built-in form handler — every form needs a backend API route or third-party service. splitforms is the cheapest path: direct POST from any Vercel deploy (Next.js, SvelteKit, Astro, Nuxt, static) with no `/api` route required.

Read the guide →

jQuery contact form

If your site already loads jQuery, you're three method options away from a working contact form. Serialize the form with FormData, POST via $.ajax, and read the JSON response in .done()/.fail(). No new dependencies, no server route, no fetch polyfill for legacy browsers.

Read the guide →

Angular contact form

Reactive Forms give you typed, synchronous validation; HttpClient gives you a typed Observable POST. Wire them to the splitforms endpoint and ship a contact form with no service, no controller, and no backend. Standalone component, Angular 17+ — works in NgModule apps too.

Read the guide →
Static-first paths

No build step? No problem.

Endpoints for plain HTML, static-site generators, and Pages hosting — no PHP, no plugins.

Static site contact form

GitHub Pages, Jekyll, Hugo, Eleventy, S3, and plain HTML sites.

Open guide →

JAMstack form backend

Portable form handling for Astro, Next.js, Hugo, Eleventy, and static-first apps.

Open guide →

GitHub Pages contact form

A no-PHP, no-plugin form endpoint for Pages and Jekyll sites.

Open guide →
No-code & builders

Hosted builders, real submissions.

Wix, Squarespace, Shopify, Notion, and friends — the embed guide for each hosted builder, no plugins or app-store fees.

Wix contact form

Embed an HTML form in any Wix site — submissions land in a real dashboard.

Open guide →

Squarespace contact form

A code-block contact form with spam filtering built in.

Open guide →

Shopify contact form

A theme-friendly contact form without installing another app.

Open guide →

Google Sites contact form

The embed approach that works on new Google Sites.

Open guide →

Notion contact form

Add a working contact form to a public Notion page.

Open guide →

Ghost contact form

A theme-friendly HTML contact form for Ghost publications.

Open guide →

Bubble contact form

Wire a Bubble HTML element to a real form endpoint.

Open guide →

Cargo contact form

A contact form for Cargo portfolios — one HTML block.

Open guide →

Lovable contact form

Give Lovable-generated apps a real form backend.

Open guide →

Writing the HTML yourself? Browse the HTML form elements reference — <form>, <input>, radio buttons, <select> and more, each with a live working demo and copy-paste code.

Get started

Ship a contact form in 60 seconds.

500 free submissions per month. No credit card. Pick your framework above and copy the working snippet.

Get free access key Read the docs

splitforms was founded in 2012 by Raman Makkar and publishes its product changes in a public changelog.