splitforms.com

Form template · Customer Complaint 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.

  • 500 free total
  • No PHP · no SDK
  • One POST endpoint
Customer Complaint Form Template — copy-paste form template

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 backend code

No server, API route, or SDK — your Customer Complaint Form posts straight to one endpoint.

Straight to your inbox

Every submission is emailed to you and saved to a searchable dashboard — spam filtered before it reaches you.

Copy-paste ready

It's plain HTML you own — paste the Customer Complaint Form snippet, swap in your access key, and ship.

Copy and ship

Your Customer Complaint Form, ready to paste.

Plain HTML that posts to the /api/submit endpoint. Replace YOUR_ACCESS_KEY with the key from your dashboard; that's the only edit.

Get your free access key
customer-complaint-form.html
<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

What each field collects.

name, email (required)
The email becomes the Reply-To on your notification, so whoever handles the complaint answers the customer directly.
phone, preferred_contact
Some complaints are better settled in a five-minute call than a long email. Let the customer choose, and keep phone optional.
reference (optional)
The order, booking or account number lets you pull up the transaction without a search. Optional, because walk-in and phone customers often don't have one.
incident_date (required)
Pins down which visit, delivery or charge the complaint is about, and shows how long ago it happened.
category (select)
Decides who should handle it. Keep the list short and in your customers' words; 'Billing or charges' is clearer to them than 'Accounts receivable'.
description (textarea)
The label asks for events in order, which gets you a timeline instead of a paragraph of frustration you have to untangle.
resolution_wanted (select)
The field most complaint forms skip. Knowing whether the customer wants a refund, a redo or an explanation lets you resolve many complaints in one reply.
previous_contact (select)
A 'yes, not resolved' answer means the complaint already went through your normal process once. Send those to someone with authority to fix it.
safety_risk (yes/no, required)
Replaces a 'how serious is this?' scale, which customers who bother to complain tend to rate as serious anyway. On paid plans, a routing rule (safety_risk equals yes) can email a manager as well as your usual inbox.
evidence (file, optional)
A photo, receipt or screenshot. Uploads need enctype="multipart/form-data" and are stored on paid plans, up to 5 MB per file. Keep it optional; plenty of valid complaints have no paperwork.

How to add it

How to add this form to your site.

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.

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.

Decide who gets which complaints

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, resolve, review

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

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.

  • Customer complaint form: 13 fields in 4 sections (about you, what happened, putting it right, evidence)
  • Plain HTML with labelled fieldsets — paste it into any site
  • One POST endpoint, no SDK — honeypot and spam scoring, no CAPTCHA
What's included with the Customer Complaint Form Template

Where submissions go

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.

  • Reply-to wired to the visitor's email — reply straight from your inbox
  • Honeypot and automatic spam scoring filter bots, no CAPTCHA friction
  • Live dashboard, CSV export, and signed webhooks on paid plans
Spam-filtered submissions from the Customer Complaint Form Template

How SplitForms works

What happens after someone submits your form?

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.

A SplitForms contact form submission launching straight to your inbox

Add your endpoint

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

HTML form pointing at a SplitForms submit endpoint

Receive submissions

We instantly capture and organize every submission in your inbox.

Submissions inbox with searchable leads and status pills

Route anywhere

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

Generic integration tiles for email, sheets, chat, CRM, automate, and webhook

No credit card required. Set up in under 60 seconds.

Connect & automate

Where can submissions go besides email?

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.

Connect your SplitForms form to Slack, Google Sheets, Mailchimp, Zapier and more
NewTake payments on your formsDeposits, bookings, order forms — submitters check out through Stripe and the money goes straight to your Stripe account. Included on every paid plan.See payment forms →Need time slots? Online booking →

Setup guides for the stacks you use

Questions

Frequently asked questions.

View all FAQs
Will the customer get an acknowledgment?

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.

Can billing complaints and safety issues go to different people?

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'.

How do you stop spam without a CAPTCHA?

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.

What should a customer complaint form include?

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.

How should we reply to a complaint without admitting fault?

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.

What is the difference between a complaint form and a feedback form?

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

How much does splitforms cost?

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.

Free

$0— 500 submissions
 

No card, no time limit

Best for testing

For side projects and indie devs.

  • 500 free submissions
  • Unlimited forms
  • Email notifications included
  • Smart spam filtering
  • Submissions dashboard
  • Redirect after submit
  • MCP server included

Annual

$49/ year
About $4.08 per month, billed yearly
Best value

Every Pro feature with triple the volume — $0.27 per 1,000 at full use.

  • 15,000 submissions per month
  • Unlimited forms
  • Everything in Pro
  • File uploads with 5 GB storage
  • 3 team seats
  • Priority email support

No credit card required on Free • Cancel anytime • Full pricing and FAQ