Generate a free splitforms key
Sign in at splitforms.com — your access key is created instantly. No credit card, no setup wizard, no SDK to install.
Consultation Request · React
Discovery-call request with service, budget, and timeline qualification. Free for 200 submissions total — no backend, no SDK, no plugin.

Copy-paste code
Replace YOUR_ACCESS_KEY with your splitforms key, paste into a React page, and ship. No build-time integration required.
'use client';
import { useState, type FormEvent } from 'react';
export default function ConsultationForm() {
const [status, setStatus] = useState<'idle' | 'sending' | 'sent' | 'error'>('idle');
async function onSubmit(e: FormEvent<HTMLFormElement>) {
e.preventDefault();
setStatus('sending');
const data = new FormData(e.currentTarget);
data.set('access_key', 'YOUR_ACCESS_KEY');
data.set('subject', 'New consultation request');
const res = await fetch('https://splitforms.com/api/submit', {
method: 'POST',
body: data,
headers: { Accept: 'application/json' },
});
const json = await res.json();
if (json.success && json.payment_url) {
// Payment form: finish the payment on the secure Stripe page.
window.location.href = json.payment_url;
return;
}
setStatus(json.success ? 'sent' : 'error');
if (json.success) e.currentTarget.reset();
}
if (status === 'sent') return <p>Thanks — we’ll be in touch.</p>;
return (
<form onSubmit={onSubmit}>
<label htmlFor="name">Full name *</label>
<input id="name" type="text" name="name" placeholder="Tomás López" required />
<label htmlFor="email">Email *</label>
<input id="email" type="email" name="email" placeholder="[email protected]" required />
<label htmlFor="phone">Phone *</label>
<input id="phone" type="tel" name="phone" placeholder="+1 555 0184" required />
<label htmlFor="topic">Topic *</label>
<select id="topic" name="topic" required>
<option value="">Choose…</option>
<option>General inquiry</option>
<option>Strategy</option>
<option>Financial planning</option>
<option>Legal advice</option>
<option>Other</option>
</select>
<label htmlFor="details">What do you need help with? *</label>
<textarea id="details" name="details" placeholder="Be specific so we can match you with the right advisor." required />
<button type="submit" disabled={status === 'sending'}>
{status === 'sending' ? 'Sending…' : 'Send'}
</button>
{status === 'error' && <p>Something went wrong. Try again.</p>}
</form>
);
}React + Consultation Request
React ships nothing for form delivery — it's a view layer. The historical options are an Express server you stand up just for POST /api/contact, a Vercel serverless function with SMTP wiring, or a third-party library like Formik that still leaves the backend problem unsolved. The consultation request on this page uses useState for submit state and a plain fetch POST to splitforms — no form library, no context provider, no wrapper component. It works in Create React App, Vite, Remix, and every React bundler because it's just standard FormData and the Fetch API.

Consultation Request fields
The posted payload contains full name, email, phone, topic, what do you need help with?. Required fields are full name, email, phone, topic and what do you need help with?. Rename, remove, or add your own — splitforms accepts any name you POST.

React production notes
React itself ships nothing for form submission — it's a view layer. The historical baseline is one of: an Express/Hono/Fastify server you stand up just for POST /api/contact, a Function-as-a-Service (Vercel/Netlify/Cloudflare) that ends up needing the same SMTP wiring, or a third-party form library (React Hook Form, Formik) that handles validation but still leaves you to operate the backend. Vite, CRA, and Remix all default to assuming you have somewhere to POST — they just don't tell you where. Splitforms is the where: a single fetch call, no library install, no useEffect gymnastics, no Express boilerplate.

Setup
Three actions stand between you and your first consultation request submission — no backend, no database, no CAPTCHA library.
Sign in at splitforms.com — your access key is created instantly. No credit card, no setup wizard, no SDK to install.
Drop the form snippet into a React page, component, or layout. Replace YOUR_ACCESS_KEY with the key from your dashboard. The form action is a hard-coded URL — no env vars or build-time wiring needed.
Dashboard updates live on Free. Free includes owner email delivery; Starter adds signed webhooks, CSV export, Slack/Discord forwarding, and BCC to your team.
How SplitForms works
Connect your form, collect every submission, and send data where it needs to go — without building backend infrastructure.

Point your form to your unique SplitForms endpoint. That's it.

We instantly capture and organize every submission in your inbox.

Send data to email, spreadsheets, CRMs, webhooks, and 7,000+ apps.

No credit card required. Set up in under 60 seconds.
Connect & automate
SplitForms works with the destinations you route to and the platforms you build on — from Slack and Sheets to WordPress, Shopify, and Next.js. And with Stripe connected, your forms can take payments too.

Trusted by indie teams and agencies shipping forms worldwide
Testimonials
40 quotes on record — from indie hacks to agency migrations.
“Email notifications on every plan, including free, was the deciding factor. I was about to pay a competitor purely to get an email when a lead came in.”
“The dashboard is genuinely usable. I can read, filter, and export submissions without exporting to a spreadsheet first. That alone saves me an hour a week.”
“We added file uploads to a job-application form and the attachments just showed up, retained and downloadable. No S3 bucket policy nightmare.”
“Honest pricing is rare. The $59 three-year plan meant I paid once and stopped thinking about it. No surprise renewal, no per-seat creep.”
“I shipped a React contact form in a Vite app in one sitting. The docs answered every question before I had to ask it.”
“Our WordPress site dropped its plugin-heavy form for a plain HTML one pointed at splitforms. The site got faster and the spam stopped.”
Common questions
Yes. The form is plain HTML with a single POST endpoint, so it runs on any React site without server-side code, plugins, or SDKs. Drop the snippet into a React page or component and submissions land in your splitforms dashboard.
Free for 200 submissions total — no credit card, no trial. Pro is $5/mo for 5,000 submissions, and there's a one-time $59 3-year plan (15,000 submissions/mo for 36 months). The same pricing applies regardless of which framework hosts the form.
Yes. The template ships with sensible defaults (full name, email, phone, topic…) — add, remove, or rename any of them. Splitforms accepts whatever fields you POST.
A hidden honeypot field catches dumb bots, and a tuned classifier scores the rest. You only see real submissions in your dashboard. No CAPTCHA, no friction for human users — and it works the same on React as on any other framework.
Yes. Webhooks are available on paid plans, with auto-formatted payloads for Slack, Discord, and WhatsApp (via CallMeBot). Or send raw signed JSON to any URL — Zapier, n8n, your own server. Configure in the splitforms dashboard.
Yes — the form posts directly to splitforms from the browser, so no server is involved. Works on Vercel, Netlify, GitHub Pages, Cloudflare Pages, S3, or any plain Apache host.
Simple pricing
Choose a plan that fits your workflow — from a free form endpoint to full automations, exports, Stripe payments, and higher submission limits.
For side projects and indie devs.
For agencies and growing products.
Pay $59. 3 years sorted.
No credit card required on Free • Cancel anytime