Signup forms · 1 fields
Newsletter signup form template
The shortest signup form there is: one email field. Further down is a fuller version with a first name and a consent box, for lists where you want a record of what each person agreed to.
Email signup
Live demo: try the fields. Submitting sends nothing.
02 / Field guide
Why these fields
Email
email · requiredThe only field, and type="email" lets the browser catch obvious typos. To keep mistyped or fake addresses off the list, have your mailing tool send a confirmation email before the first issue.
When to use it
Use the one-field version in a footer or under an article, where every extra field costs signups. Say right beside it what you send and how often.
Formward collects and stores the signups; it does not send newsletters. Move them to your mailing tool by export, or forward each signup with a webhook so it reaches the list straight away.
Privacy and GDPR
- Marketing email needs consent in most EU countries, under the national rules that implement the ePrivacy Directive. Submitting a clearly labelled signup form can be that consent, as long as the label says exactly what people sign up for.
- To keep proof of what each person agreed to, use the consent version below with consent capture switched on. It records the consent text and the time with every signup, on every plan including Free.
- Do not add the address to other lists or pass it to partners. That is a new purpose and needs its own consent.
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="email">Email</label>
<input type="email" name="email" id="email" required />
<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 EmailSignupForm() {
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="email">Email</label>
<input type="email" name="email" id="email" required />
<input
type="text"
name="_gotcha"
tabIndex={-1}
autoComplete="off"
style={{ position: "absolute", left: "-9999px" }}
aria-hidden="true"
/>
<button type="submit">Send</button>
</form>
);
}
05 / Alternative
Signup with a recorded consent box
A first name for a friendlier greeting and a required checkbox named _consent. Switch on consent capture in the form settings, mark it required, and paste the same wording there as on the box. Formward stores the configured text and the time with each signup and refuses submissions without the tick.
HTML
<form action="https://forms.formward.eu/f/your-form-id" method="POST">
<label for="name">First name</label>
<input type="text" name="name" id="name" />
<label for="email">Email</label>
<input type="email" name="email" id="email" required />
<label>
<input type="checkbox" name="_consent" id="_consent" required /> Email me the monthly newsletter. I can unsubscribe at any time with the link in every issue.
</label>
<input type="text" name="_gotcha" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px" aria-hidden="true" />
<button type="submit">Send</button>
</form>Next.js
"use client";
import { useState } from "react";
export function NewsletterSignupConsentForm() {
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">First name</label>
<input type="text" name="name" id="name" />
<label htmlFor="email">Email</label>
<input type="email" name="email" id="email" required />
<label>
<input type="checkbox" name="_consent" id="_consent" required /> Email me the monthly newsletter. I can unsubscribe at any time with the link in every issue.
</label>
<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
- Every signup is emailed to you and stored in the EU on every plan. Export the list as CSV from Personal up and import it into your mailing tool.
- From Professional, a webhook or the n8n integration can add each new subscriber to your mailing tool as it arrives.
- A welcome email from Formward itself uses the autoresponder, from Professional. Most teams leave the welcome and the confirmation step to their mailing tool.
- Once signups are synced, set a short retention on the form so the list does not live in two places.
Questions
- Do I need double opt-in for a newsletter in the EU?
- The GDPR does not name it, but Article 7(1) requires you to be able to show that each person consented, and a confirmation email is the usual way to prove the address belongs to the person who signed up. In some countries, Germany among them, it is widely treated as the expected standard. Your mailing tool normally handles it.
- Can Formward send the newsletter itself?
- No. Formward collects and stores signups and can send a one-off autoresponder. Send the newsletter from a mailing tool, and move signups there by export, webhook or n8n.
Related
- Signup templates
Mailchimp and Klaviyo styled signups, and the waitlist.
- Waitlist template
For interest before a launch.
- Consent checkboxes
Wording that holds up, and how proof is stored.
- Integrations
Webhooks, n8n and exports to move signups on.
- React forms
The signup as a component with inline success.
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.