Edit the categories
Change the category list to match your business, swap YOUR_ACCESS_KEY for the key from your dashboard, and link the form from your contact page, receipts and order emails.
Form template · Customer Complaint Form Template
Updated · plan facts checked against /pricing
A customer complaint form records what went wrong, when, on which order or visit, and what the customer wants done about it, so the right person can resolve it in one reply. This free complaint form template has 13 fields, including a desired-resolution question and a safety flag you can route to a manager on paid plans.

This template is one of our free HTML form templates. See more form templates by industry.
Overview
This complaint form is plain HTML that posts to one splitforms endpoint (https://splitforms.com/api/submit) with a hidden access_key, so it works on any website, including a static one, with no help desk to set up. Each complaint is emailed to you the moment it is sent, on every plan, and saved in your dashboard with the time it arrived. The fields are named for routing: category, resolution_wanted and safety_risk each arrive as their own value, so they can decide who sees the complaint.
No server, API route, or SDK — your Customer Complaint Form posts straight to one endpoint.
Every submission is emailed to you and saved to a searchable dashboard — spam filtered before it reaches you.
It's plain HTML you own — paste the Customer Complaint Form snippet, swap in your access key, and ship.
Copy and ship
Plain HTML that posts to the /api/submit endpoint. Replace YOUR_ACCESS_KEY with the key from your dashboard; that's the only edit.
<form action="https://splitforms.com/api/submit" method="POST" enctype="multipart/form-data">
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY">
<input type="hidden" name="subject" value="New customer complaint">
<input type="hidden" name="form_loaded_at" id="form_loaded_at">
<fieldset>
<legend>1. About you</legend>
<label>Full name <input type="text" name="name" autocomplete="name" required></label>
<label>Email <input type="email" name="email" autocomplete="email" required></label>
<label>Phone (optional) <input type="tel" name="phone" autocomplete="tel"></label>
<label>How should we reply?
<select name="preferred_contact">
<option>Email</option>
<option>Phone call</option>
</select>
</label>
</fieldset>
<fieldset>
<legend>2. What happened</legend>
<label>Order, booking or account number (if you have one)
<input type="text" name="reference">
</label>
<label>Date it happened <input type="date" name="incident_date" required></label>
<label>What is the complaint about?
<select name="category" required>
<option value="">Choose one</option>
<option>Product</option>
<option>Service or workmanship</option>
<option>Billing or charges</option>
<option>Delivery</option>
<option>A member of staff</option>
<option>Website or app</option>
<option>Something else</option>
</select>
</label>
<label>Location, branch or page (optional)
<input type="text" name="location">
</label>
<label>Tell us what happened, in order
<textarea name="description" rows="6" required></textarea>
</label>
</fieldset>
<fieldset>
<legend>3. Putting it right</legend>
<label>What would resolve this for you?
<select name="resolution_wanted" required>
<option value="">Choose one</option>
<option>Refund</option>
<option>Replacement or repair</option>
<option>Redo the service</option>
<option>Correct a billing error</option>
<option>An explanation or apology</option>
<option>Something else (say above)</option>
</select>
</label>
<label>Have you already contacted us about this?
<select name="previous_contact" required>
<option value="">Choose one</option>
<option>No, this is the first time</option>
<option>Yes, and it is not resolved</option>
</select>
</label>
<fieldset>
<legend>Is anyone's safety at risk?</legend>
<label><input type="radio" name="safety_risk" value="no" required> No</label>
<label><input type="radio" name="safety_risk" value="yes"> Yes</label>
</fieldset>
</fieldset>
<fieldset>
<legend>4. Evidence (optional)</legend>
<!-- File uploads are stored on paid plans -->
<label>Photo, receipt or screenshot
<input type="file" name="evidence" accept=".pdf,.jpg,.jpeg,.png">
</label>
</fieldset>
<!-- honeypot: leave empty -->
<input type="checkbox" name="botcheck" style="display:none" tabindex="-1" autocomplete="off">
<button type="submit">Send complaint</button>
</form>
<script>
document.getElementById('form_loaded_at').value = Date.now();
</script>Field by field
name, email (required)phone, preferred_contactreference (optional)incident_date (required)category (select)description (textarea)resolution_wanted (select)previous_contact (select)safety_risk (yes/no, required)evidence (file, optional)How to add it
To add a Customer Complaint Form to your site you need three things: a free splitforms access key, the HTML snippet above, and your key pasted into it. No backend, database, or CAPTCHA library — the form posts to one URL and every submission lands in your inbox and dashboard.
Change the category list to match your business, swap YOUR_ACCESS_KEY for the key from your dashboard, and link the form from your contact page, receipts and order emails.
Every complaint is emailed to your inbox on every plan. On paid plans, add routing rules so billing complaints also go to whoever handles billing and safety_risk = yes goes to a manager.
Reply within the time you promise, starting from the resolution the customer asked for. On paid plans, export the CSV each month and look for the same product, location or category coming up again.
What's included
Most complaint forms ask what went wrong and stop there, which is why the first reply is so often another question. Two fields change that. 'What would resolve this for you?' tells you whether the customer wants a refund, a redo or just an explanation, and many complaints close in one reply once you know. 'Is anyone's safety at risk?' is the one urgency question a customer can answer consistently, unlike a 'how serious is this?' scale that everyone rates as serious. Add the order number, the date, and whether they have already contacted you, and the person who reads the complaint can act on it instead of starting an email thread. Ask what would put it right, and flag safety risks for a manager.

Where submissions go
Reply-to is wired to the visitor's email, so one tap on Reply answers them directly — while the built-in honeypot and automatic spam scoring filter out bots before they reach you. Every submission is emailed to your inbox and can forward to a webhook or Slack the moment a visitor hits send.

How SplitForms works
splitforms receives the submission, filters spam, saves it to your dashboard and emails you — then, on paid plans, sends it on to your webhooks and integrations. No backend infrastructure to build.

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
On paid plans, submissions can also go to Slack, Discord, Google Sheets, Notion, Airtable, Zapier or any signed webhook — and splitforms works on the platforms you build on, from WordPress and Shopify to Next.js. With Stripe connected, your forms can take payments too.

Questions
Turn on the auto-reply, a paid feature, and every customer gets an email at the address they entered as soon as they submit. Say when they will hear back and stick to it; that alone stops most 'did you get my complaint?' follow-ups. On the Free plan you still get the notification email for every complaint.
Yes, on paid plans. Routing rules check a field's value and email extra recipients, or replace the default one, when a rule matches: for example category equals 'Billing or charges' goes to your accounts inbox, and safety_risk equals 'yes' goes to a manager. A 'contains' rule on the description can also catch words like 'lawyer' or 'injury'.
The template includes a hidden honeypot field and a time check (form_loaded_at), and splitforms adds a rule-based content filter. An upset customer never has to solve a puzzle before their complaint goes through.
The customer's name and email, an order or account number, the date, a category, what happened in order, what they want done about it, whether they have contacted you before, and an optional photo or receipt. This template has those 13 fields plus a yes/no safety question.
Thank the customer, confirm what they reported, say what you will do next and by when, and follow through. You can do that without accepting liability. If you work in a regulated industry, or the complaint mentions injury or legal action, have your lawyer or compliance lead approve the reply.
A feedback form collects opinions you review in batches. A complaint form starts a case that someone owns until it is resolved, so it needs the order number, the date and the outcome the customer wants. For a refund on its own, the refund request form template is more direct.
Simple pricing
Free gives you 500 submissions for $0 — no card, no time limit. Pro is $5/month for 5,000 submissions a month, and Annual is $49/year for 15,000 a month with every Pro feature.
For side projects and indie devs.
Every paid feature, for agencies and growing products.
Every Pro feature with triple the volume — $0.27 per 1,000 at full use.
No credit card required on Free • Cancel anytime • Full pricing and FAQ