Use-Case Guide

Contact Form Examples (with a Backend That Actually Emails You)

Copy-paste contact form examples for a simple message form, a support form with department routing, and a sales inquiry form — each one backed by Formigo so every submission lands in your inbox, Slack, or Google Sheets without writing a line of server code.

This guide focuses on the patterns and use cases behind good contact forms: what fields to include, which layout fits each scenario, and how to get submissions delivered wherever your team already works. For the full HTML and JavaScript wiring — honeypot, timestamp, fetch with error handling — see the HTML & JavaScript form guide. Framework-specific guides for React, Next.js, Vue, and Astro are linked at the bottom.

On this page

What makes a good contact form

The best website contact forms are short, clear, and deliver submissions reliably. Here are the principles that separate forms people actually fill out from ones they abandon.

Ask only what you need

Name, email, and message cover most contact scenarios. Every extra field lowers completion. Add a subject or department only when routing genuinely requires it.

Validate with clear error messages

Use required and type="email" for browser-native validation. If you handle submission with JavaScript, show inline errors so users know exactly what to fix.

Confirm the submission

Always show a success state — a thank-you message, a redirect, or a toast. Without it, users resubmit and you get duplicates.

Protect against spam silently

A honeypot field and a timestamp check stop the vast majority of bots with zero friction for real visitors. No CAPTCHA puzzle needed on most forms.

On delivery: even a perfectly designed form fails if submissions disappear. Formigo's form backend delivers every submission to your email, Slack, Discord, or Google Sheet the moment it arrives — no polling, no dashboard refresh required.

Contact form examples you can copy

Three copy-paste patterns for the most common online contact form scenarios. Each POSTs directly to Formigo. Swap your-form for your actual form slug and you're live.

1. Simple name / email / message form

The baseline. Covers personal sites, portfolio pages, and any use case where you just want to hear from visitors.

<form action="https://formigo.io/f/your-form" method="POST">
  <div>
    <label for="name">Name</label>
    <input type="text" id="name" name="name" required>
  </div>

  <div>
    <label for="email">Email address</label>
    <input type="email" id="email" name="email" required>
  </div>

  <div>
    <label for="message">Message</label>
    <textarea id="message" name="message" rows="5" required></textarea>
  </div>

  <!-- Silent spam protection -->
  <input type="text" name="_formigo_hp" value=""
         style="display:none" tabindex="-1" autocomplete="off">
  <input type="hidden" name="_formigo_t" value="">

  <button type="submit">Send message</button>
</form>

<script>
  document.querySelector('input[name="_formigo_t"]').value =
    Math.floor(Date.now() / 1000);
</script>

2. Support form with subject and department routing

When you need to triage incoming messages — billing questions to finance, technical issues to engineering — add a <select> field so every submission records the chosen department, ready to filter or forward on your end.

<form action="https://formigo.io/f/your-form" method="POST">
  <div>
    <label for="name">Name</label>
    <input type="text" id="name" name="name" required>
  </div>

  <div>
    <label for="email">Email address</label>
    <input type="email" id="email" name="email" required>
  </div>

  <div>
    <label for="department">Department</label>
    <select id="department" name="department" required>
      <option value="">Select a department</option>
      <option value="sales">Sales</option>
      <option value="billing">Billing</option>
      <option value="technical">Technical support</option>
      <option value="other">Other</option>
    </select>
  </div>

  <div>
    <label for="subject">Subject</label>
    <input type="text" id="subject" name="subject" required>
  </div>

  <div>
    <label for="message">Describe your issue</label>
    <textarea id="message" name="message" rows="5" required></textarea>
  </div>

  <!-- Silent spam protection -->
  <input type="text" name="_formigo_hp" value=""
         style="display:none" tabindex="-1" autocomplete="off">
  <input type="hidden" name="_formigo_t" value="">

  <button type="submit">Submit request</button>
</form>

<script>
  document.querySelector('input[name="_formigo_t"]').value =
    Math.floor(Date.now() / 1000);
</script>

3. Sales and inquiry form

A multi-field form that captures company, role, and budget context so your sales team gets qualified leads rather than bare email addresses.

<form action="https://formigo.io/f/your-form" method="POST">
  <div>
    <label for="name">Full name</label>
    <input type="text" id="name" name="name" required>
  </div>

  <div>
    <label for="email">Work email</label>
    <input type="email" id="email" name="email" required>
  </div>

  <div>
    <label for="company">Company</label>
    <input type="text" id="company" name="company">
  </div>

  <div>
    <label for="role">Your role</label>
    <input type="text" id="role" name="role" placeholder="e.g. CTO, Product Manager">
  </div>

  <div>
    <label for="team_size">Team size</label>
    <select id="team_size" name="team_size">
      <option value="">Select size</option>
      <option value="1-10">1–10</option>
      <option value="11-50">11–50</option>
      <option value="51-200">51–200</option>
      <option value="200+">200+</option>
    </select>
  </div>

  <div>
    <label for="message">How can we help?</label>
    <textarea id="message" name="message" rows="4" required></textarea>
  </div>

  <!-- Silent spam protection -->
  <input type="text" name="_formigo_hp" value=""
         style="display:none" tabindex="-1" autocomplete="off">
  <input type="hidden" name="_formigo_t" value="">

  <button type="submit">Get in touch</button>
</form>

<script>
  document.querySelector('input[name="_formigo_t"]').value =
    Math.floor(Date.now() / 1000);
</script>

Want the full wiring? The HTML & JavaScript form guide covers fetch-based submission, JSON payloads, 429 rate-limit handling, and accessibility patterns. Framework guides are below.

Where your submissions go

Every submission that arrives at your Formigo endpoint is stored and then forwarded to whichever destinations you configure. You can enable multiple channels on the same form at once.

Email

Each submission arrives as a formatted email. Add multiple recipients so every stakeholder gets notified.

Slack

Post submissions directly to a Slack channel so your team sees new leads without leaving their workflow.

Discord

Route submissions to a Discord channel via a webhook. Useful for community-run projects and open-source teams.

Google Sheets

Each submission appends a row to a spreadsheet — a simple CRM or leads log with no extra tooling.

Webhooks

POST submission data to your own endpoint, Zapier, or Make to trigger any downstream automation.

Configure channels in the Formigo dashboard. One form can deliver to email, Slack, and Google Sheets simultaneously — no extra code required.

Spam protection for contact forms

Contact forms are a favourite target for bots. Formigo includes a layered spam-scoring system: a honeypot field, a timestamp check, optional CAPTCHA, and automatic rate limiting. The examples above already include the honeypot and timestamp fields — they cover most forms with zero impact on real visitors.

Honeypot

Hidden field bots fill; humans don't

Timestamp

Flags submissions under 2 seconds

Rate limiting

5 per IP per form every 10 min

For the full picture — CAPTCHA options (Cloudflare Turnstile, hCaptcha), spam scores, and how to review flagged submissions — see the spam protection guide.

FAQ

Common questions about contact form examples, delivery, and spam handling.

What fields should every contact form include?

At minimum, a contact form needs a name field, an email address field, and a message textarea. Support and sales forms often add a subject line or a department select so submissions can be routed to the right inbox. Keep it short: every extra field reduces completion rates.

How do I make a contact form send to email without a backend?

Point the form's action attribute at a form backend endpoint such as https://formigo.io/f/your-form and set method to POST. Formigo receives the submission and forwards it to whichever email address, Slack channel, or Google Sheet you configured. No server code needed.

Do I need JavaScript to submit a contact form?

No. A plain HTML form with action and method POST works fine. Formigo accepts standard url-encoded form submissions without any JavaScript. If you want to avoid a full page reload or show a custom success message, you can use fetch or XMLHttpRequest to POST instead, but it is entirely optional.

How do I stop bots from spamming my contact form?

Add a hidden honeypot field named _formigo_hp that must stay empty, and a hidden timestamp field named _formigo_t that JavaScript sets to the current Unix time when the page loads. Bots fill the honeypot or submit too quickly, triggering Formigo's spam scoring. Most contact forms need nothing more; an optional Cloudflare Turnstile or hCaptcha can be layered on for high-risk forms.

Where do contact form submissions go with Formigo?

You choose. Formigo can deliver each submission to an email address, a Slack channel, a Discord channel, a Google Sheet, or a custom webhook. You can enable multiple destinations on the same form so the same submission lands in your inbox and in your team's Slack channel simultaneously.

Get every contact form submission delivered instantly

Point your contact form at Formigo and submissions land in your email, Slack, or Google Sheets the moment they arrive. Free forever, no credit card required.

Start for free