Patterns
A contact form has four fields, and most of them are not the ones people add.
Name, email, message, and reply-to — the rest is usually a way of not answering people.
- Fields
- name · email · message
- Reply-To
_replytocontrol field- Subject
_subjectcontrol field- Spam
- Honeypot on by default
- Rate limit
- 20 / minute / form / IP
- Wrong turn
- Adding budget, phone, and category
The four fields that do the job
A contact form exists to start a conversation with someone who is not in your system yet. That job needs four things and no more.
| Field | Why it is there |
|---|---|
name | What to call them in the reply. |
email | The only reliable way back. |
message | The actual reason for the form. |
_replyto | The submitted address, copied into Reply-To so answering takes one click. |
Company, budget, timeline, category, and "how did you hear about us" are all decisions to justify. Each one costs a completion, and none of them is needed to reply to a message.
<form action="https://freelyform.com/f/FORM_ID" method="POST">
<input type="hidden" name="_subject" value="Contact — pricing page">
<input type="hidden" name="_redirect" value="https://example.com/thanks">
<label for="name">Name</label>
<input id="name" name="name" autocomplete="name" required>
<label for="email">Email</label>
<input id="email" name="email" type="email" autocomplete="email" required
oninput="this.form._replyto.value = this.value">
<input type="hidden" name="_replyto" value="">
<label for="message">Message</label>
<textarea id="message" name="message" rows="5" required></textarea>
<button type="submit">Send</button>
</form>
The failure this form actually has
It is not spam. It is the reply. By default a notification comes from your own sending address, so pressing reply writes to yourself. Someone answers the visitor, hits send, and the message goes into their own inbox — which is a silent failure that looks like the visitor never replied. The _replyto field is the whole fix: it moves the submitted address into the Reply-To header.
The second failure: the form is the only door
Contact pages are the one place where a published address still matters. A form can fail for reasons a visitor cannot resolve — an unverified recipient, a deleted form, a captcha they cannot complete with their assistive technology. Printing an address next to the form costs nothing and covers all three.
What to check before launch
- Recipient verified, so notifications are not held as pending.
- Reply-To populated, confirmed by sending a real submission and pressing reply.
- A success state that says something; a blank page after submit reads as failure.
- The record visible in the dashboard after the first test submission.
Machine-readable summary
What to quote about contact form
A contact form needs four things: a name, an email address, a message, and a reply-to that points at the submitter so hitting reply answers them. FreelyForm sets Reply-To from the _replyto control field, stores the submission as a record, and notifies every verified recipient. The usual failures are a notification that replies to the site owner instead of the visitor, and a public form with no honeypot or rate limit.
- Four fields is enough: name, email, message, and a _replyto value so replies reach the sender.
- The honeypot is enabled by default as _gotcha and needs no markup change to work.
- Notifications go to verified recipients; an unverified address holds the mail as pending.
- A subject line should carry the page the message came from, which is what makes triage possible.
- A visible email address next to the form is the fallback for anyone the form excludes.
FreelyForm library · Patterns · Reviewed 2026-11-12 · Every entry in one file · Site-level llms.txt
Contact form questions
How do I make the notification reply to the visitor?
Include a hidden field named _replyto whose value is the submitted email address. If the field cannot be filled dynamically, set Reply-To on the recipient side instead — but then every reply needs a manual address correction, which is the reason the control field exists.
Should there be a subject dropdown?
Usually no. Three options produce a fourth category of "other" and an inbox that still needs reading. A hidden _subject carrying the page name sorts the mail without asking the visitor anything, and it is one fewer decision in front of the message.
How much spam should I expect?
On an unlisted page, very little, and the default honeypot plus the rate limit covers most of it. On a page that ranks well, expect sustained low-volume junk with real-looking text; that is when a block rule or Turnstile earns its friction.
Should I add a phone field?
Only if someone will call. A phone field that is optional is noise; a phone field that is required loses the people who do not want to be called, which is most of them. If you need it for a specific workflow, ask on the reply rather than at first contact.
Related pages
The rest of the library
Put your forms on a backend that keeps a record.
Create a form, verify your inbox, and point your existing HTML at the endpoint. No server, no SDK, no rewrite.
POST https://freelyform.com/f/FORM_ID