Testimonial form template

    The testimonial, a rating, and clear permission for how you may credit it.

    Reviewed by Ritu Fadadu · Last reviewed

    Preview and code

    Preview

    Overall rating (optional)

    Not published. Only so we can check before publishing.

    How may we credit you?

    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-testimonial" class="fb-label">What would you tell someone considering us?</label>
        <textarea id="fb-testimonial" name="testimonial" class="fb-input" required rows="5"></textarea>
      </div>
      <fieldset class="fb-field fb-fieldset">
        <legend class="fb-label">Overall rating <span class="fb-optional">(optional)</span></legend>
        <div class="fb-options">
          <label class="fb-option">
            <input type="radio" name="rating" value="5-excellent" class="fb-check">
            <span>5 — Excellent</span>
          </label>
          <label class="fb-option">
            <input type="radio" name="rating" value="4-good" class="fb-check">
            <span>4 — Good</span>
          </label>
          <label class="fb-option">
            <input type="radio" name="rating" value="3-ok" class="fb-check">
            <span>3 — OK</span>
          </label>
          <label class="fb-option">
            <input type="radio" name="rating" value="2-poor" class="fb-check">
            <span>2 — Poor</span>
          </label>
          <label class="fb-option">
            <input type="radio" name="rating" value="1-very-poor" class="fb-check">
            <span>1 — Very poor</span>
          </label>
        </div>
      </fieldset>
      <div class="fb-field fb-field--half">
        <label for="fb-name" class="fb-label">Your name</label>
        <input type="text" id="fb-name" name="name" class="fb-input" required autocomplete="name">
      </div>
      <div class="fb-field fb-field--half">
        <label for="fb-email" class="fb-label">Email</label>
        <input
          type="email"
          id="fb-email"
          name="email"
          class="fb-input"
          required
          autocomplete="email"
          aria-describedby="fb-email-help"
        >
        <p id="fb-email-help" class="fb-help">Not published. Only so we can check before publishing.</p>
      </div>
      <div class="fb-field fb-field--half">
        <label for="fb-role" class="fb-label">Role <span class="fb-optional">(optional)</span></label>
        <input type="text" id="fb-role" name="role" class="fb-input" autocomplete="organization-title">
      </div>
      <div class="fb-field fb-field--half">
        <label for="fb-company" class="fb-label">
          Company
          <span class="fb-optional">(optional)</span>
        </label>
        <input type="text" id="fb-company" name="company" class="fb-input" autocomplete="organization">
      </div>
      <fieldset class="fb-field fb-fieldset">
        <legend class="fb-label">How may we credit you?</legend>
        <div class="fb-options">
          <label class="fb-option">
            <input type="radio" name="credit" value="name-role-and-company" class="fb-check" required>
            <span>Name, role and company</span>
          </label>
          <label class="fb-option">
            <input type="radio" name="credit" value="first-name-only" class="fb-check" required>
            <span>First name only</span>
          </label>
          <label class="fb-option">
            <input type="radio" name="credit" value="anonymously" class="fb-check" required>
            <span>Anonymously</span>
          </label>
        </div>
      </fieldset>
      <!-- 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 testimonial">
      <button type="submit" class="fb-button">Send testimonial</button>
    </form>
    

    About this template

    The point of a testimonial form is the permission, not the praise. This template asks how the customer is happy to be credited — full name and company, first name only, or anonymously — as a required choice, so every quote you collect arrives with a recorded answer to “can we publish this, and how?”

    The testimonial box comes first and is required; the rating is optional, because some happy customers do not think in stars. Role and company are optional too, and only used if the customer picks the credit option that includes them.

    Send the form to customers after a good moment — a delivered project, a closed ticket, a renewal. Pair it with a short email that links here; people write better testimonials when they are asked directly than when they stumble on a form.

    Fields in this template

    FieldNameTypeRequiredWhy it is there
    What would you tell someone considering us?testimonialLong textYesRequired, and first. The question is phrased to invite a specific answer.
    Overall ratingratingSingle choiceNoOptional — not everyone thinks in stars.
    Your namenameShort textYesRequired, even when publishing anonymously, so you know who said it.
    EmailemailEmailYesRequired but never published; for confirming before you publish.
    RoleroleShort textNoOptional, used only with the full credit option.
    CompanycompanyShort textNoOptional, used only with the full credit option.
    How may we credit you?creditSingle choiceYesRequired. The recorded permission that makes the quote usable.

    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

    • Ask a more specific question in the label (“What changed after you switched?”) for more useful quotes.
    • Add a website link field for B2B testimonials that link back to the customer.
    • Record the date you published each quote next to the CSV export, so you can refresh old ones.

    Where the submissions go

    • Testimonials are stored and emailed to you; export them all to CSV on every plan.
    • Post new testimonials to a team Slack channel — good news is worth sharing, on any plan.
    • On Starter and above, collect them in Google Sheets as a library your marketing team can pick from.

    Feedback Forms: 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 testimonial form live

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