Newsletter signup form template

    Email, first name, the topics they want, and consent that is a real choice.

    Reviewed by Ritu Fadadu · Last reviewed

    Preview and code

    Preview

    What would you like to hear about? (optional)

    Code — replace YOUR_ENDPOINT_ID with your form's ID

    <style>
      .fb-form { display: grid; gap: 1rem; max-width: 36rem; }
      .fb-field { display: flex; flex-direction: column; gap: 0.375rem; }
      .fb-fieldset { margin: 0; padding: 0; border: 0; min-width: 0; }
      .fb-label { font-weight: 600; }
      .fb-optional { font-weight: 400; color: #6b7280; }
      .fb-help { margin: 0; font-size: 0.875rem; color: #6b7280; }
      .fb-input { box-sizing: border-box; width: 100%; padding: 0.625rem 0.75rem; border: 1px solid #d1d5db; border-radius: 0.5rem; background: #fff; color: #111827; font: inherit; }
      .fb-input:focus { border-color: #2563eb; outline: 2px solid #2563eb; outline-offset: 1px; }
      .fb-options { display: flex; flex-direction: column; gap: 0.5rem; }
      .fb-option { display: flex; align-items: center; gap: 0.5rem; }
      .fb-check { width: 1.125rem; height: 1.125rem; margin: 0; accent-color: #2563eb; }
      .fb-button { justify-self: start; min-height: 44px; padding: 0.625rem 1.25rem; border: 0; border-radius: 0.5rem; background: #2563eb; color: #fff; font: inherit; font-weight: 600; cursor: pointer; }
      .fb-button:hover { background: #1d4ed8; }
      .fb-button:focus-visible { outline: 2px solid #2563eb; outline-offset: 2px; }
      .fb-button:disabled { opacity: 0.6; cursor: wait; }
      .fb-status { margin: 0; min-height: 1.5em; }
      @media (min-width: 640px) {
        .fb-form { grid-template-columns: 1fr 1fr; }
        .fb-field, .fb-button, .fb-status { grid-column: 1 / -1; }
        .fb-field--half { grid-column: auto; }
      }
    </style>
    
    <form id="fb-form" class="fb-form" action="https://formboost.app/f/YOUR_ENDPOINT_ID" method="POST">
      <div class="fb-field">
        <label for="fb-email" class="fb-label">Email</label>
        <input type="email" id="fb-email" name="email" class="fb-input" required autocomplete="email">
      </div>
      <div class="fb-field fb-field--half">
        <label for="fb-first_name" class="fb-label">
          First name
          <span class="fb-optional">(optional)</span>
        </label>
        <input
          type="text"
          id="fb-first_name"
          name="first_name"
          class="fb-input"
          autocomplete="given-name"
        >
      </div>
      <fieldset class="fb-field fb-fieldset">
        <legend class="fb-label">
          What would you like to hear about?
          <span class="fb-optional">(optional)</span>
        </legend>
        <div class="fb-options">
          <label class="fb-option">
            <input type="checkbox" name="topics" value="product-updates" class="fb-check">
            <span>Product updates</span>
          </label>
          <label class="fb-option">
            <input type="checkbox" name="topics" value="tutorials" class="fb-check">
            <span>Tutorials</span>
          </label>
          <label class="fb-option">
            <input type="checkbox" name="topics" value="events" class="fb-check">
            <span>Events</span>
          </label>
        </div>
      </fieldset>
      <div class="fb-field">
        <label class="fb-option">
          <input type="checkbox" id="fb-consent" name="consent" value="yes" class="fb-check" required>
          <span>Email me the newsletter. I can unsubscribe at any time.</span>
        </label>
      </div>
      <input type="hidden" name="source" value="footer">
      <!-- Honeypot: keep it hidden. People never see it; bots fill it in and get flagged as spam. -->
      <div
        aria-hidden="true"
        style="position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden"
      >
        <label for="fb-honey">Leave this field empty</label>
        <input type="text" id="fb-honey" name="_honey" tabindex="-1" autocomplete="off">
      </div>
      <input type="hidden" name="_subject" value="New newsletter signup">
      <button type="submit" class="fb-button">Subscribe</button>
    </form>
    

    About this template

    This is the form, not the mailing list. Formboost collects and stores each signup, emails you about it and screens out bots; it does not send newsletters or manage unsubscribes. That part belongs to your email tool, and on Starter and above you connect the two with a webhook, Zapier or n8n, so every new signup is added there automatically.

    The consent checkbox is required and unticked by default, which is what makes the signup a deliberate opt-in. The topics question is optional multiple choice, sent as an array by the script versions, so you can segment from day one instead of asking later.

    A hidden source field records where the form sits — footer, blog post, pricing page — so you can see which placement actually brings subscribers.

    Fields in this template

    FieldNameTypeRequiredWhy it is there
    EmailemailEmailYesRequired, first, and the only thing most people will type.
    First namefirst_nameShort textNoOptional — for a personal greeting in your email tool.
    What would you like to hear about?topicsMultiple choiceNoOptional multiple choice, sent as an array for segmenting.
    Email me the newsletter. I can unsubscribe at any time.consentCheckboxYesRequired and unticked by default: a recorded, deliberate opt-in.
    (hidden)sourceHidden valueNoHidden. Change it per placement to compare where signups come from.

    Each name becomes a column in your dashboard and a row in the notification email. The hidden _honey field is the honeypot; _subject sets the email's subject line. Both are reserved fields and never appear in the field table.

    Make it yours

    • For a one-line footer form, keep only the email field, the consent checkbox and the button.
    • Change source per page, or fill it with location.pathname from JavaScript.
    • Send people to a confirmation page with a custom redirect that says what to expect and how often.
    • If you run double opt-in, let your email tool send the confirm-your-address message. Auto Reply sends a single acknowledgement, not a confirmation link, so it cannot complete a double opt-in on its own.

    Where the submissions go

    • Every signup is stored in your dashboard and can be exported to CSV and imported into any mailing tool, on every plan.
    • On Starter and above, add subscribers to your email tool as they arrive with a webhook, Zapier or n8n.
    • Submissions flagged as spam stay in the dashboard's spam tab and are never forwarded, so bot signups do not reach your mailing tool.

    Newsletter Signups: plans, destinations and a worked setup →

    Before you publish it

    1. Create a form in the Formboost dashboard and replace YOUR_ENDPOINT_ID with its ID.
    2. Pick one variant: HTML posts and reloads, HTML + JS and React send JSON with fetch() and stay on the page.
    3. For the plain HTML version, add a hidden _redirect with an https:// thank-you page on the same site as the form — anything else falls back to Formboost's page.
    4. Submit it once from the live page and check the submission in your dashboard. Every request is acknowledged, so the dashboard is the real test. Troubleshooting covers the rest.

    More form templates

    Put the newsletter signup form live

    Free forever: 500 submissions a month across 10 forms, no card.