Request forms · 5 fields
Support request form template
A short ticket form for customers who need help. The subject and priority let you sort the queue before you open a message, and the description box asks for what you need to reproduce the problem.
Support request
Live demo: try the fields. Submitting sends nothing.
02 / Field guide
Why these fields
Name
text · requiredRequired, so your reply can address the person.
Email
email · requiredRequired. It is where your answer goes.
Subject
text · requiredRequired. A short subject makes the queue readable at a glance.
Priority
select · optionalOptional. Four levels are enough. If you promise response times per level, state them next to the form.
Describe your issue
textarea · requiredRequired. Ask for steps to reproduce, what they expected and what happened instead.
When to use it
Use it on a help page or in your product's support menu when requests arrive by email today and get lost. For questions from people who are not customers yet, the contact us template fits better.
Keep the priority levels few and explain them on the page, or every request will be marked Urgent.
Privacy and GDPR
- Ask people not to paste passwords, card numbers or health details into the description; a support form is not the place for them.
- Support requests often contain account details. Limit who can read them to the people who answer, and delete old requests on a schedule.
03 / Make it yours
Choose your stack. Copy your form.
Replace the example endpoint with your Formward endpoint, then adapt the fields to your needs.
<form action="https://forms.formward.eu/f/your-form-id" method="POST">
<label for="name">Name</label>
<input type="text" name="name" id="name" required />
<label for="email">Email</label>
<input type="email" name="email" id="email" required />
<label for="subject">Subject</label>
<input type="text" name="subject" id="subject" required />
<label for="priority">Priority</label>
<select name="priority" id="priority">
<option value="Low">Low</option>
<option value="Normal">Normal</option>
<option value="High">High</option>
<option value="Urgent">Urgent</option>
</select>
<label for="description">Describe your issue</label>
<textarea name="description" id="description" required></textarea>
<input type="text" name="_gotcha" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" aria-hidden="true" />
<button type="submit">Send</button>
</form>Accessibility
Accessible by default, and how to keep it that way
- Every field in the code has a visible label tied to it with for and id, so screen readers announce what to enter and a click on the label focuses the field.
- Required fields carry the required attribute, so the browser explains a missing answer before anything is sent. Say “required” in words as well; an asterisk or a colour alone is easy to miss.
- The spam trap field (_gotcha) is hidden from screen readers with aria-hidden and skipped by the Tab key, so people never meet it.
- In the JavaScript versions, show the confirmation or error in an element with role="status" so the result is announced, and keep the entered answers when sending fails.
Changed the fields? Paste your version into the HTML form tester to see exactly what it sends, or run it through the GDPR form checker.
04 / Implementation
How the code talks to Formward
Each form you create gets its own endpoint in the form https://forms.formward.eu/f/your-form-id. The HTML version posts to it directly and the browser is redirected to a thank-you page, so it works without JavaScript.
The Next.js version below sends the same fields with fetch and an Accept: application/json header. Formward then answers with { ok: true, id }, or an error body with 402 when the plan limit is reached and 429 when the rate limit kicks in. See responses and status codes.
Next.js client component
"use client";
import { useState } from "react";
export function SupportRequestForm() {
const [sent, setSent] = useState(false);
async function onSubmit(e: React.FormEvent<HTMLFormElement>) {
e.preventDefault();
const form = e.currentTarget;
const res = await fetch("https://forms.formward.eu/f/your-form-id", {
method: "POST",
headers: { Accept: "application/json" },
body: new FormData(form),
});
if (res.ok) {
setSent(true);
form.reset();
}
}
if (sent) return <p>Thanks! Your message has been sent.</p>;
return (
<form onSubmit={onSubmit}>
<label htmlFor="name">Name</label>
<input type="text" name="name" id="name" required />
<label htmlFor="email">Email</label>
<input type="email" name="email" id="email" required />
<label htmlFor="subject">Subject</label>
<input type="text" name="subject" id="subject" required />
<label htmlFor="priority">Priority</label>
<select name="priority" id="priority">
<option value="Low">Low</option>
<option value="Normal">Normal</option>
<option value="High">High</option>
<option value="Urgent">Urgent</option>
</select>
<label htmlFor="description">Describe your issue</label>
<textarea name="description" id="description" required />
<input
type="text"
name="_gotcha"
tabIndex={-1}
autoComplete="off"
style={{ position: "absolute", left: "-9999px" }}
aria-hidden="true"
/>
<button type="submit">Send</button>
</form>
);
}
Spam protection
- The generated code already includes the hidden _gotcha honeypot. Leave it in: a bot that fills it gets a normal success response, the submission is filed as spam and no email is sent.
- Every form has a per-IP rate limit, and you can restrict it to your own domains with the allowed-origins list in the form settings.
- Cloudflare Turnstile is optional and works on every plan, including Free. Turn it on in the form settings, add the widget to your markup and Formward checks the token server-side.
- The form settings can also reject disposable email addresses, which is worth turning on when a fake address would waste your time.
What happens after submit
- Each request is emailed to you and stored in the EU on every plan.
- From Professional, a webhook can open a ticket in your helpdesk or post the request to a team channel, where you can route it by the priority value.
- From Professional, the autoresponder can confirm that the request arrived.
Questions
- How do people attach screenshots?
- Add a file field. File uploads are available from Professional; on other plans, ask for a link to the screenshot instead.
- Should support requests and personal data requests use the same form?
- Better not. Requests about personal data have a legal deadline and their own record keeping, so a separate data subject request form keeps them from getting lost in the support queue.
Related
- Contact us template
For sales and general questions.
- Data subject request template
For access, correction and deletion requests.
- HTML form tester
See exactly what your version of the form sends.
- Next.js forms
The support form inside a Next.js app.
Customize before publishing
- Remove fields you do not need and mark only essential answers as required.
- Replace placeholder wording with terms your audience already understands.
- Add your privacy notice, retention details and expected response time.
- Test keyboard focus, validation errors and the confirmation state on mobile.
Use this template
Create a free account and the form is set up from this template. Copy your endpoint and replace https://forms.formward.eu/f/your-form-id in the code above.