Contact form for every platform.
Pick your stack. Each guide ships with a working code example, the 3-step setup, and best practices for that framework. Free for 1,000 submissions/month — no credit card required.
HTML contact form
The simplest possible setup. Drop one `<form>` tag into your HTML and submissions land in your inbox. 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
Build a working contact form for your Next.js app in three steps. Use a client component or server action — both supported. No API route to maintain.
Read the guide →React contact form
Plug-and-play contact form for any React app. Vite, Create React App, Remix, Gatsby — all work. One fetch call, full state handling.
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'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'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'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, 1,000 submissions/month free, signed webhooks included.
Read the guide →Carrd contact form
Carrd'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 "Custom" and point it at the splitforms endpoint — 60 seconds, 1,000 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 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, 1,000 free submissions per month, dashboard included.
Read the guide →Eleventy contact form
11ty'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'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'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, 1,000 submissions/month free, signed webhooks, dashboard search.
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 →