<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged formbackend</title>
<link>https://coderlegion.com/tag/formbackend</link>
<description>Powered by Question2Answer</description>
<item>
<title>How to Handle Form Submissions in Vue.js Without a Backend</title>
<link>https://coderlegion.com/20941/how-to-handle-form-submissions-in-vue-js-without-a-backend</link>
<description>&lt;p&gt;If you are building a Vue.js application and need to handle contact form submissions, the standard approach involves setting up a backend server, configuring email sending, managing environment variables, and deploying server-side code.&lt;/p&gt;
&lt;p&gt;That is a lot of infrastructure for what is essentially a contact form.&lt;/p&gt;
&lt;p&gt;In this tutorial, I will show you how to handle Vue.js form submissions without any backend using Formgrid. Every submission gets stored in a dashboard, triggers an instant email notification, becomes a tracked lead in a pipeline, and optionally syncs to Google Sheets automatically.&lt;/p&gt;
&lt;p&gt;No server. No Node.js backend. No email configuration. Just a Vue.js form and a Formgrid endpoint URL.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-you-are-building&quot;&gt;What You Are Building&lt;/h3&gt;
&lt;p&gt;A fully functional contact form in Vue.js that:&lt;/p&gt;
&lt;p&gt;Sends form data to Formgrid on submission. Triggers an instant email notification with the submission details. Stores every submission as a tracked lead in your Formgrid dashboard. Shows a loading state while submitting. Shows a success message after submission. Blocks bots with a honeypot field.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;prerequisites&quot;&gt;Prerequisites&lt;/h3&gt;
&lt;p&gt;Basic knowledge of Vue.js and JavaScript. A free Formgrid account at formgrid.dev.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-1-create-your-vue-js-project&quot;&gt;Step 1: Create Your Vue.js Project&lt;/h3&gt;
&lt;p&gt;If you do not have a Vue.js project yet create one now:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm create vue@latest vue-formgrid-contact
cd vue-formgrid-contact
npm install
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open localhost:5173 and confirm the default Vue.js page loads.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-2-create-your-formgrid-account-and-form&quot;&gt;Step 2: Create Your Formgrid Account and Form&lt;/h3&gt;
&lt;p&gt;Go to &lt;a rel=&quot;nofollow&quot; href=&quot;https://formgrid.dev&quot;&gt;formgrid.dev&lt;/a&gt; and sign up using Google or email. No credit card required.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ayfulytj8845e34vriww.png&quot; alt=&quot;Formgrid signup page&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dbt8i4w6l2l6qt2x20d0.png&quot; alt=&quot;Formgrid dashboard after signup&quot;&gt;&lt;/p&gt;
&lt;p&gt;Once logged in click New Form from your dashboard and give your form a name. Something like &quot;Vue Contact Form&quot; or &quot;Website Enquiries&quot;. Click Create Form.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8h42jznal4gvtoxnenmr.png&quot; alt=&quot;Formgrid new form dashboard&quot;&gt;&lt;/p&gt;
&lt;p&gt;You will be taken to your form's Overview tab. Here you will find your unique Endpoint URL. Copy it. It looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;https://formgrid.dev/api/f/your-form-id
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l2n2wk1glt9b8u3dp89g.png&quot; alt=&quot;Form details page showing endpoint URL&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is the URL you will send your form data to. Every time someone submits your form the data goes to this endpoint and Formgrid emails you the submission details instantly.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-3-create-the-contact-form-component&quot;&gt;Step 3: Create the Contact Form Component&lt;/h3&gt;
&lt;p&gt;In your Vue.js project create a new file called &lt;code&gt;ContactForm.vue&lt;/code&gt; inside the &lt;code&gt;src/components&lt;/code&gt; folder:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vue&quot;&gt;&amp;lt;!-- src/components/ContactForm.vue --&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;div class=&quot;form-wrapper&quot;&amp;gt;
    &amp;lt;div v-if=&quot;submitted&quot; class=&quot;success-message&quot;&amp;gt;
      &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;48&quot; height=&quot;48&quot; fill=&quot;none&quot; stroke=&quot;#0d9488&quot; stroke-width=&quot;2&quot; stroke-linecap=&quot;round&quot; stroke-linejoin=&quot;round&quot; viewBox=&quot;0 0 24 24&quot;&amp;gt;
        &amp;lt;path d=&quot;M22 11.08V12a10 10 0 1 1-5.93-9.14&quot;/&amp;gt;
        &amp;lt;polyline points=&quot;22 4 12 14.01 9 11.01&quot;/&amp;gt;
      &amp;lt;/svg&amp;gt;
      &amp;lt;h2&amp;gt;Message sent successfully&amp;lt;/h2&amp;gt;
      &amp;lt;p&amp;gt;We will get back to you within 24 hours.&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;

    &amp;lt;form v-else @submit.prevent=&quot;handleSubmit&quot;&amp;gt;
      &amp;lt;h2&amp;gt;Contact Us&amp;lt;/h2&amp;gt;
      &amp;lt;p&amp;gt;Any questions or remarks? Just write us a message.&amp;lt;/p&amp;gt;

      &amp;lt;div class=&quot;field&quot;&amp;gt;
        &amp;lt;label for=&quot;name&quot;&amp;gt;Name&amp;lt;/label&amp;gt;
        &amp;lt;input
          id=&quot;name&quot;
          v-model=&quot;form.name&quot;
          type=&quot;text&quot;
          placeholder=&quot;Allen Jones&quot;
          required
        /&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div class=&quot;field&quot;&amp;gt;
        &amp;lt;label for=&quot;email&quot;&amp;gt;Email&amp;lt;/label&amp;gt;
        &amp;lt;input
          id=&quot;email&quot;
          v-model=&quot;form.email&quot;
          type=&quot;email&quot;
          placeholder=&quot;*Emails are not allowed*&quot;
          required
        /&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div class=&quot;field&quot;&amp;gt;
        &amp;lt;label for=&quot;phone&quot;&amp;gt;Phone &amp;lt;span class=&quot;optional&quot;&amp;gt;(optional)&amp;lt;/span&amp;gt;&amp;lt;/label&amp;gt;
        &amp;lt;input
          id=&quot;phone&quot;
          v-model=&quot;form.phone&quot;
          type=&quot;tel&quot;
          placeholder=&quot;+1 555 000 0000&quot;
        /&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;div class=&quot;field&quot;&amp;gt;
        &amp;lt;label for=&quot;message&quot;&amp;gt;Message&amp;lt;/label&amp;gt;
        &amp;lt;textarea
          id=&quot;message&quot;
          v-model=&quot;form.message&quot;
          placeholder=&quot;Write your message here&quot;
          rows=&quot;5&quot;
          required
        /&amp;gt;
      &amp;lt;/div&amp;gt;

      &amp;lt;!-- Honeypot field: hidden from real users, catches bots --&amp;gt;
      &amp;lt;input
        v-model=&quot;form.honeypot&quot;
        type=&quot;text&quot;
        name=&quot;_honey&quot;
        style=&quot;display: none&quot;
        tabindex=&quot;-1&quot;
        autocomplete=&quot;off&quot;
        aria-hidden=&quot;true&quot;
      /&amp;gt;

      &amp;lt;p v-if=&quot;error&quot; class=&quot;error-message&quot;&amp;gt;{{ error }}&amp;lt;/p&amp;gt;

      &amp;lt;button type=&quot;submit&quot; :disabled=&quot;loading&quot;&amp;gt;
        {{ loading ? 'Sending...' : 'Send Message' }}
      &amp;lt;/button&amp;gt;
    &amp;lt;/form&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup&amp;gt;
import { ref, reactive } from 'vue'

const FORMGRID_ENDPOINT = 'https://formgrid.dev/api/f/your-form-id'

const form = reactive({
  name: '',
  email: '',
  phone: '',
  message: '',
  honeypot: ''
})

const loading = ref(false)
const submitted = ref(false)
const error = ref('')

async function handleSubmit() {
  // If honeypot is filled in it is a bot
  if (form.honeypot) return

  loading.value = true
  error.value = ''

  try {
    const response = await fetch(FORMGRID_ENDPOINT, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Accept': 'application/json'
      },
      body: JSON.stringify({
        name: form.name,
        email: form.email,
        phone: form.phone,
        message: form.message
      })
    })

    if (response.ok) {
      submitted.value = true
    } else {
      error.value = 'Something went wrong. Please try again.'
    }
  } catch {
    error.value = 'Something went wrong. Please try again.'
  } finally {
    loading.value = false
  }
}
&amp;lt;/script&amp;gt;

&amp;lt;style scoped&amp;gt;
.form-wrapper {
  max-width: 540px;
  margin: 60px auto;
  padding: 40px;
  background: #ffffff;
  border-radius: 12px;
  box-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);
  font-family: system-ui, sans-serif;
}

h2 {
  font-size: 1.5rem;
  font-weight: 700;
  color: #0d1117;
  margin: 0 0 8px;
}

p {
  color: #6b7a8d;
  font-size: 0.9rem;
  margin: 0 0 24px;
}

.field {
  margin-bottom: 20px;
}

label {
  display: block;
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: #0d1117;
  margin-bottom: 6px;
}

.optional {
  font-weight: 400;
  text-transform: none;
  letter-spacing: normal;
  color: #6b7a8d;
}

input,
textarea {
  width: 100%;
  padding: 10px 14px;
  border: 1px solid #e2e8f0;
  border-radius: 8px;
  font-size: 0.95rem;
  color: #0d1117;
  background: #f8f9fb;
  box-sizing: border-box;
  transition: border-color 0.15s ease;
  outline: none;
}

input:focus,
textarea:focus {
  border-color: #0d9488;
  background: #ffffff;
}

textarea {
  resize: vertical;
  min-height: 120px;
}

button {
  width: 100%;
  padding: 12px;
  background: #0d9488;
  color: #ffffff;
  border: none;
  border-radius: 8px;
  font-size: 0.875rem;
  font-weight: 600;
  letter-spacing: 0.05em;
  cursor: pointer;
  transition: background 0.15s ease;
  margin-top: 8px;
}

button:hover:not(:disabled) {
  background: #0f766e;
}

button:disabled {
  opacity: 0.65;
  cursor: not-allowed;
}

.error-message {
  color: #dc2626;
  font-size: 0.875rem;
  margin-bottom: 12px;
}

.success-message {
  text-align: center;
  padding: 20px 0;
}

.success-message svg {
  margin-bottom: 16px;
}

.success-message h2 {
  font-size: 1.25rem;
  color: #0d1117;
  text-align: center;
}

.success-message p {
  text-align: center;
  margin: 8px 0 0;
}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;your-form-id&lt;/code&gt; in the &lt;code&gt;FORMGRID_ENDPOINT&lt;/code&gt; constant with the actual form ID from your Formgrid form overview tab.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-4-use-the-component-in-your-app&quot;&gt;Step 4: Use the Component in Your App&lt;/h3&gt;
&lt;p&gt;Open &lt;code&gt;src/App.vue&lt;/code&gt; and import the ContactForm component:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vue&quot;&gt;&amp;lt;!-- src/App.vue --&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;ContactForm /&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script setup&amp;gt;
import ContactForm from './components/ContactForm.vue'
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run your development server:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You should see the contact form at localhost:5173.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-5-test-the-form-submission&quot;&gt;Step 5: Test the Form Submission&lt;/h3&gt;
&lt;p&gt;Fill in the form with real looking test data and click Send Message.&lt;/p&gt;
&lt;p&gt;Within seconds you should see three things happen.&lt;/p&gt;
&lt;p&gt;The success message appears on screen replacing the form.&lt;/p&gt;
&lt;p&gt;You receive an instant email notification at your Formgrid signup address with the full submission details formatted cleanly:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;New Submission: Vue Contact Form

Name: Allen Jones
Email: *Emails are not allowed*
Phone: +1 555 000 0000
Message: This is a test message from my Vue.js form.

Submitted: 10:30 AM, June 16, 2026
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0vw3ljqpoch8k7yspdfa.png&quot; alt=&quot;Formgrid email notification&quot;&gt;&lt;/p&gt;
&lt;p&gt;The submission appears in your Formgrid dashboard under the Submissions tab.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b1m3an3i2sp4037nd97s.png&quot; alt=&quot;Formgrid submissions dashboard&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-6-view-the-lead-in-your-pipeline&quot;&gt;Step 6: View the Lead in Your Pipeline&lt;/h3&gt;
&lt;p&gt;This is where Formgrid goes beyond a basic form backend.&lt;/p&gt;
&lt;p&gt;Every submission automatically becomes a tracked lead in your Formgrid dashboard. Go to the Leads tab and you will see your test submission with a status of New.&lt;/p&gt;
&lt;p&gt;Here is what the full flow looks like from form submission to tracked lead:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://formgrid.dev/gifs/lead-pipeline-demo.gif&quot; alt=&quot;Formgrid lead pipeline demo&quot;&gt;&lt;/p&gt;
&lt;p&gt;Click on the lead and you can:&lt;/p&gt;
&lt;p&gt;Change its status from New to Contacted when you reply. Change it to Converted when they become a customer. Add a private note about the conversation. Set a follow-up reminder so Formgrid emails you on a date you choose with the lead details and your notes attached.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jbb7apqksbzpmgijsmj5.png&quot; alt=&quot;Lead status pipeline in Formgrid&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jpl2u4j43dpklj6zfzhp.png&quot; alt=&quot;Adding notes to a lead in Formgrid&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ohsj1btyitpsmn08cc31.png&quot; alt=&quot;Setting a follow up reminder&quot;&gt;&lt;/p&gt;
&lt;p&gt;Your conversion rate updates automatically at the top of the leads tab. That number tells you things a flat email inbox never could.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-7-configure-form-settings&quot;&gt;Step 7: Configure Form Settings&lt;/h3&gt;
&lt;p&gt;Go to the Settings tab on your form in the Formgrid dashboard to configure additional options.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e0d8ayuksfp1tmakip36.png&quot; alt=&quot;Formgrid form settings page&quot;&gt;&lt;/p&gt;
&lt;p&gt;From here you can:&lt;/p&gt;
&lt;p&gt;Add multiple notification email addresses. Set a custom redirect URL after submission. Enable auto-responder emails to confirm receipt to the person who submitted. Enable hCaptcha for additional bot protection on top of the honeypot field already in your form.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;step-8-connect-google-sheets-optional-&quot;&gt;Step 8: Connect Google Sheets (Optional)&lt;/h3&gt;
&lt;p&gt;If you want every form submission to appear automatically as a new row in a Google Sheet go to the Integrations tab on your form.&lt;/p&gt;
&lt;p&gt;Connect your Google account and select the sheet where you want submissions to land. From that point every new submission creates a new row instantly with no Zapier required.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mgtkew3kl4ugpaisqafq.png&quot; alt=&quot;Google Sheets sync setup in Formgrid&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nyjiich2rbyllql4nkd5.png&quot; alt=&quot;Google Sheets showing form submissions as rows&quot;&gt;&lt;/p&gt;
&lt;p&gt;This is particularly useful if you have a team. Everyone with access to the sheet sees new submissions in real time without needing to log into anything new.&lt;/p&gt;
&lt;p&gt;Google Sheets sync is available on the Premium plan at $12 per month.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;how-to-handle-file-uploads&quot;&gt;How to Handle File Uploads&lt;/h3&gt;
&lt;p&gt;If you need users to upload files alongside the form you need to send multipart form data instead of JSON. Here is the updated handleSubmit function:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;async function handleSubmit() {
  if (form.honeypot) return

  loading.value = true
  error.value = ''

  try {
    const formData = new FormData()
    formData.append('name', form.name)
    formData.append('email', form.email)
    formData.append('phone', form.phone)
    formData.append('message', form.message)

    if (form.file) {
      formData.append('file', form.file)
    }

    const response = await fetch(FORMGRID_ENDPOINT, {
      method: 'POST',
      headers: {
        'Accept': 'application/json'
      },
      body: formData
    })

    if (response.ok) {
      submitted.value = true
    } else {
      error.value = 'Something went wrong. Please try again.'
    }
  } catch {
    error.value = 'Something went wrong. Please try again.'
  } finally {
    loading.value = false
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the file field to your reactive form object and a file input to your template:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vue&quot;&gt;&amp;lt;div class=&quot;field&quot;&amp;gt;
  &amp;lt;label for=&quot;file&quot;&amp;gt;Attachment &amp;lt;span class=&quot;optional&quot;&amp;gt;(optional)&amp;lt;/span&amp;gt;&amp;lt;/label&amp;gt;
  &amp;lt;input
    id=&quot;file&quot;
    type=&quot;file&quot;
    @change=&quot;form.file = $event.target.files[0]&quot;
  /&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;File uploads up to 1GB are included on the Premium plan at $12 per month.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;using-with-the-options-api&quot;&gt;Using with the Options API&lt;/h3&gt;
&lt;p&gt;If you prefer the Options API instead of the Composition API here is the equivalent component:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vue&quot;&gt;&amp;lt;template&amp;gt;
  &amp;lt;!-- Same template as above --&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;script&amp;gt;
export default {
  name: 'ContactForm',
  data() {
    return {
      form: {
        name: '',
        email: '',
        phone: '',
        message: '',
        honeypot: ''
      },
      loading: false,
      submitted: false,
      error: ''
    }
  },
  methods: {
    async handleSubmit() {
      if (this.form.honeypot) return

      this.loading = true
      this.error = ''

      try {
        const response = await fetch(
          'https://formgrid.dev/api/f/your-form-id',
          {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
              'Accept': 'application/json'
            },
            body: JSON.stringify({
              name: this.form.name,
              email: this.form.email,
              phone: this.form.phone,
              message: this.form.message
            })
          }
        )

        if (response.ok) {
          this.submitted = true
        } else {
          this.error = 'Something went wrong. Please try again.'
        }
      } catch {
        this.error = 'Something went wrong. Please try again.'
      } finally {
        this.loading = false
      }
    }
  }
}
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;using-with-nuxt-js&quot;&gt;Using with Nuxt.js&lt;/h3&gt;
&lt;p&gt;If you are using Nuxt.js instead of plain Vue.js the same component works without any changes. Nuxt.js is built on Vue.js and supports the same Composition API and Options API patterns.&lt;/p&gt;
&lt;p&gt;The only difference is where you place the component file. In a Nuxt project put it in the &lt;code&gt;components&lt;/code&gt; folder and Nuxt will auto-import it:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;components/
  ContactForm.vue   // auto-imported by Nuxt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use it in any page without importing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-vue&quot;&gt;&amp;lt;!-- pages/contact.vue --&amp;gt;
&amp;lt;template&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;ContactForm /&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-not-just-use-a-backend-&quot;&gt;Why Not Just Use a Backend?&lt;/h3&gt;
&lt;p&gt;You could set up an Express server, configure Nodemailer, deploy it to a VPS, and manage it yourself. Here is what that actually involves:&lt;/p&gt;
&lt;p&gt;Setting up a Node.js server. Configuring email sending with an SMTP provider. Managing environment variables for email credentials. Deploying and maintaining the server. Handling server downtime and errors. Paying for server hosting.&lt;/p&gt;
&lt;p&gt;Formgrid handles all of that for $12 per month on the Premium plan, plus gives you a lead pipeline, Google Sheets sync, and follow-up reminders that a custom backend would not include.&lt;/p&gt;
&lt;p&gt;For a contact form on a Vue.js site, a backend is the wrong tool for the job.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;formgrid-pricing&quot;&gt;Formgrid Pricing&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Plan &lt;/th&gt;&lt;th&gt;Price &lt;/th&gt;&lt;th&gt;Submissions&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Free &lt;/td&gt;&lt;td&gt;$0 per month &lt;/td&gt;&lt;td&gt;25 per month&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Premium &lt;/td&gt;&lt;td&gt;$12 per month &lt;/td&gt;&lt;td&gt;1,000 per month&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Business &lt;/td&gt;&lt;td&gt;$29 per month &lt;/td&gt;&lt;td&gt;15,000 per month&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The free plan is enough to get started. Upgrade when your volume grows.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;In this tutorial you built a fully functional Vue.js contact form that handles submissions without any backend code.&lt;/p&gt;
&lt;p&gt;Every submission is:&lt;/p&gt;
&lt;p&gt;Sent to Formgrid via a simple fetch request. Stored in a dashboard you can access any time. Emailed to your inbox instantly. Tracked as a lead in a pipeline with status, notes, and follow-up reminders. Optionally synced to Google Sheets automatically.&lt;/p&gt;
&lt;p&gt;The entire setup takes about 10 minutes. No server to build. No email configuration. No infrastructure to maintain.&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://formgrid.dev&quot;&gt;Try Formgrid free at formgrid.dev&lt;/a&gt; No credit card required.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. I wrote this tutorial as honestly as I could. If anything looks inaccurate or could be improved, let me know in the comments.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/20941/how-to-handle-form-submissions-in-vue-js-without-a-backend</guid>
<pubDate>Thu, 18 Jun 2026 17:01:25 +0000</pubDate>
</item>
<item>
<title>The Best Form Backend for Static Sites in 2026</title>
<link>https://coderlegion.com/20937/the-best-form-backend-for-static-sites-in-2026</link>
<description>&lt;p&gt;You built your site on GitHub Pages, Netlify, Vercel, or a plain HTML file. It looks great. But there is one problem.&lt;/p&gt;
&lt;p&gt;Your contact form has nowhere to go.&lt;/p&gt;
&lt;p&gt;Static sites have no server. No server means no backend. No backend means no way to process form submissions natively. You need a form backend to handle what your static site cannot.&lt;/p&gt;
&lt;p&gt;This post covers every realistic option in 2026, what each one actually costs, and which one makes the most sense depending on your use case.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-static-sites-need-a-form-backend&quot;&gt;Why Static Sites Need a Form Backend&lt;/h3&gt;
&lt;p&gt;When a user submits a form on a regular server-rendered site, the server processes the submission, sends an email, saves it to a database, and does whatever else you configured.&lt;/p&gt;
&lt;p&gt;Static sites have none of that. The page is just HTML and CSS served from a CDN. There is no process running in the background waiting to handle submissions.&lt;/p&gt;
&lt;p&gt;Your options are:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;1. Use a third-party form backend service
2. Write a serverless function yourself
3. Use your hosting platform's built-in forms
4. Self-host your own form backend
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each approach has genuine tradeoffs. Here is the honest breakdown.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;option-1-third-party-form-backend-services&quot;&gt;Option 1: Third-Party Form Backend Services&lt;/h3&gt;
&lt;p&gt;These are hosted services that give you an endpoint URL. You point your form action at that URL, and they handle everything else.&lt;/p&gt;
&lt;h4 id=&quot;formspree&quot;&gt;Formspree&lt;/h4&gt;
&lt;p&gt;One of the oldest form backends. Been around since 2012.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Simple and reliable
Good documentation
Works with any HTML form
Large user base
Established reputation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The honest problems:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Free plan: 50 submissions per month
           1 form only
           No spam filtering
           Submissions go straight
           to the inbox, including spam

Paid plan: $15 per month
           Spam filtering
           More submissions
           No lead management
           No pipeline
           Stops at the inbox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The biggest limitation of Formspree is that it stops at the inbox. Every submission becomes an email. You are responsible for tracking who you contacted, who you followed up with, and who converted. There is no system for that built in.&lt;/p&gt;
&lt;p&gt;If you receive 20 enquiries per month and manually track them all in a spreadsheet or Gmail labels, Formspree works. If you want something that actually helps you manage leads, it does not.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free up to 50 submissions. $15 per month for paid features.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;netlify-forms&quot;&gt;Netlify Forms&lt;/h4&gt;
&lt;p&gt;If you are already hosting on Netlify, their built-in forms are a natural first choice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Zero configuration if already on Netlify
No external service needed
Clean integration with existing workflow
Submissions visible in the Netlify dashboard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The honest problems:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Free plan: 100 submissions per month
           Basic spam filtering only
           No email notifications by default
           Need to set up notifications manually

Paid plans: $19 per month minimum
            Still no lead management
            Basic submission storage only

Locked to Netlify:
            If you move hosting, you
            lose your form history
            Not portable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Netlify Forms is convenient if you are already on Netlify and have low volume. The moment you outgrow 100 submissions per month or need any form of lead tracking, it falls short.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free up to 100 submissions on Netlify free tier. $19 per month for Pro.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;basin&quot;&gt;Basin&lt;/h4&gt;
&lt;p&gt;A simpler form backend aimed at developers who want clean, minimal tooling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Clean developer experience
Good spam filtering
Reasonable pricing
Simple dashboard
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The honest problems:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Free plan: 100 submissions per month
Paid plan: $15 per month
No lead pipeline
No follow-up reminders
No Google Sheets sync
Stops at the inbox like Formspree
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Basin is a solid Formspree alternative, but it solves the same problem in roughly the same way. If Formspree is not working for you, Basin is a lateral move, not an upgrade.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free up to 100 submissions. $15 per month paid.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;web3forms&quot;&gt;Web3Forms&lt;/h4&gt;
&lt;p&gt;A newer form of backend that has grown quickly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Generous free plan
Good deliverability
Clean API
Actively maintained
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The honest problems:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Free plan: unlimited submissions
           but basic features only
Paid plan: $18 per month
No lead management
No pipeline
No follow-up system
Stops at the inbox
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Web3Forms has a genuinely generous free plan, which is why it has grown. But the same limitation applies: it stops at the inbox. Every submission becomes an email, and you manage the rest manually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free with limited features. $18 per month paid.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;formgrid&quot;&gt;Formgrid&lt;/h4&gt;
&lt;p&gt;Full disclosure: I built Formgrid. This is the tool I use and the one I think is the most complete solution for developers and small businesses on static sites.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1cjuk68q69rjrd6i6xm8.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g38g5z14an98673kw7tg.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does differently:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every other form backend on this list stops at the inbox. Formgrid does not.&lt;/p&gt;
&lt;p&gt;Every submission becomes a tracked lead automatically. Not just an email. A lead with a status, a notes field, a follow-up reminder, and a conversion tracking system built in.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Submission arrives
Automatically becomes a lead
Status: New
You contact them
Status: Contacted
They become a customer
Status: Converted
Conversion rate updates automatically
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You can rename the stages to match your exact workflow. A quote request business might use New Request, Quote Sent, Negotiating, and Won. An event organizer might use Registered, Confirmed, Attended. The pipeline adapts to how you actually work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p7cpt58pu3v6dye0l1bz.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Google Sheets sync without Zapier:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Formspree charges $90 per month for Google Sheets integration. Formgrid includes it on Premium at $12 per month. No Zapier account. No automation setup. Every submission appears as a new row in your Google Sheet automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y9p1wrtar0jbmzu9pbrq.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kprxt27klwbcmdv9g028.png&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Spam protection on every plan:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I tested the same crypto spam submission on the Formspree free plan and the Formgrid free plan last week. Formspree delivered it straight to the inbox. Formgrid blocked it silently before it reached the inbox.&lt;/p&gt;
&lt;p&gt;Emoji in name fields, disposable email addresses, HTML injection, and known crypto spam patterns are filtered automatically on every plan, including free.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open source and self-hostable:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The entire codebase is on GitHub under the MIT license. If you want unlimited free usage, you can self-host on Docker. No vendor lock-in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Free: 3 forms, 25 submissions per month
Premium: $12 per month, unlimited forms,
         1000 submissions, Google Sheets,
         file uploads, CSV export,
         auto-responder emails
Business: $29 per month, everything in
          Premium plus custom HTML emails,
          unlimited Google Sheets,
          webhooks and Zapier,
          15000 submissions
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;option-2-serverless-functions&quot;&gt;Option 2: Serverless Functions&lt;/h3&gt;
&lt;p&gt;If you are comfortable with code, you can write your own form handler as a serverless function on Vercel, Netlify, or Cloudflare Workers.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;// Example Vercel serverless function
export default async function handler(req, res) {
  const { name, email, message } = req.body
  
  await sendEmail({
    to: '*Emails are not allowed*',
    subject: `New contact from ${name}`,
    body: message
  })
  
  res.status(200).json({ success: true })
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;What it does well:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Complete control
No monthly fees beyond email service
Integrates with any email provider
Customizable to any requirement
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The honest problems:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;You maintain it yourself
No dashboard to view submissions
No spam protection unless you build it
No lead management unless you build it
Email delivery setup and maintenance
Cold start latency on some platforms
Debugging is your responsibility
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This approach makes sense if you are a developer who enjoys building infrastructure and has specific requirements that no service can meet. For everyone else, the maintenance overhead is not worth it.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;option-3-platform-built-in-forms&quot;&gt;Option 3: Platform Built-in Forms&lt;/h3&gt;
&lt;p&gt;Some static site platforms include form handling natively.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Netlify Forms:&lt;/strong&gt; covered above.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vercel:&lt;/strong&gt; No built-in form handling. Requires serverless functions or a third-party service.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Pages:&lt;/strong&gt; no built-in form handling. Requires a third-party service.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Webflow:&lt;/strong&gt; has basic form handling but no auto-responder emails natively. You need a third-party service for confirmation emails and lead management.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Framer:&lt;/strong&gt; same limitation as Webflow. Basic form submissions only. No native auto-responder or lead management.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;option-4-self-hosted-form-backend&quot;&gt;Option 4: Self-Hosted Form Backend&lt;/h3&gt;
&lt;p&gt;If you want complete control and no monthly fees, self-hosting is a legitimate option.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tools worth considering:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Formgrid (open source):&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;MIT license
Docker deployment
Full feature set, including lead pipeline
PostgreSQL database
Runs on any VPS
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Formbricks:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Open source survey and form tool
Self-hostable
More survey-focused than form backend
Good for research and feedback forms
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Pocketbase:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Not a form backend specifically
But can handle form submissions
Single binary deployment
Very lightweight
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Self-hosting requires a server, maintenance, backups, and email delivery setup. For developers comfortable with DevOps, this is a great option. For everyone else, a managed service is more practical.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-honest-comparison&quot;&gt;The Honest Comparison&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Feature &lt;/th&gt;&lt;th&gt;Formspree &lt;/th&gt;&lt;th&gt;Netlify Forms &lt;/th&gt;&lt;th&gt;Basin &lt;/th&gt;&lt;th&gt;Web3Forms &lt;/th&gt;&lt;th&gt;Formgrid&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Free submissions &lt;/td&gt;&lt;td&gt;50/month &lt;/td&gt;&lt;td&gt;100/month &lt;/td&gt;&lt;td&gt;100/month &lt;/td&gt;&lt;td&gt;Unlimited &lt;/td&gt;&lt;td&gt;25/month&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Paid price &lt;/td&gt;&lt;td&gt;$15/month &lt;/td&gt;&lt;td&gt;$19/month &lt;/td&gt;&lt;td&gt;$15/month &lt;/td&gt;&lt;td&gt;$18/month &lt;/td&gt;&lt;td&gt;$12/month&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Spam filtering &lt;/td&gt;&lt;td&gt;Paid only &lt;/td&gt;&lt;td&gt;Basic &lt;/td&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;td&gt;Yes &lt;/td&gt;&lt;td&gt;All plans&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Lead pipeline &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Follow up reminders &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Google Sheets sync &lt;/td&gt;&lt;td&gt;$90/month &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;$12/month&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Auto-responder &lt;/td&gt;&lt;td&gt;Paid &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;Premium&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Open source &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Self-hostable &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;No &lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;which-one-should-you-use-&quot;&gt;Which One Should You Use?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Use Formspree if:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;You are already using it
Your use case is simple
You just need email notifications
You have fewer than 50 submissions
per month
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use Netlify Forms if:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;You are already on Netlify
You have very low form volume
You do not need email notifications
immediately, and are okay with configuring them
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use a serverless function if:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;You are a developer who wants
complete control
You have specific requirements
no service can meet
You enjoy building and maintaining
infrastructure
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Use Formgrid if:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;You want more than just email notifications
You want to track leads after they submit
You want Google Sheets sync without Zapier
You want spam filtering on the free plan
You want an open source option, you can
self-host if needed
You are managing enquiries for a
real business and need to follow up
without losing track of anyone
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id=&quot;how-to-connect-any-html-form-to-formgrid&quot;&gt;How to Connect Any HTML Form to Formgrid&lt;/h3&gt;
&lt;p&gt;If you are currently using Formspree or no form backend at all, switching to Formgrid takes about 5 minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Create a free account at formgrid.dev&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Create a new form and copy your endpoint URL&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Update your HTML form action&lt;/p&gt;
&lt;p&gt;From this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;
&amp;lt;form action=&quot;https://formspree.io/f/your-id&quot; method=&quot;POST&quot;&amp;gt;
  &amp;lt;input type=&quot;text&quot; name=&quot;name&quot; placeholder=&quot;Your Name&quot; /&amp;gt;
  &amp;lt;input type=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;Your Email&quot; /&amp;gt;
  &amp;lt;textarea name=&quot;message&quot; placeholder=&quot;Your Message&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
  &amp;lt;button type=&quot;submit&quot;&amp;gt;Send&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;
&amp;lt;form action=&quot;https://formgrid.dev/api/f/your-form-id&quot; method=&quot;POST&quot;&amp;gt;
  &amp;lt;input type=&quot;text&quot; name=&quot;name&quot; placeholder=&quot;Your Name&quot; /&amp;gt;
  &amp;lt;input type=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;Your Email&quot; /&amp;gt;
  &amp;lt;textarea name=&quot;message&quot; placeholder=&quot;Your Message&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
  &amp;lt;button type=&quot;submit&quot;&amp;gt;Send&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Submit a test form to confirm it is working&lt;/p&gt;
&lt;p&gt;That is it. Your form is live. Every submission now arrives as a tracked lead in your Formgrid dashboard.&lt;/p&gt;
&lt;h3 id=&quot;section&quot;&gt;&lt;img src=&quot;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0rrawabzryibpa0ac03.png&quot; alt=&quot;Image description&quot;&gt;&lt;/h3&gt;
&lt;h3 id=&quot;adding-the-honeypot-field-for-spam-protection&quot;&gt;Adding the Honeypot Field for Spam Protection&lt;/h3&gt;
&lt;p&gt;For HTML forms on your own site, add this hidden field inside your form tag to enable honeypot spam protection:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;input 
  type=&quot;text&quot; 
  name=&quot;_honey&quot; 
  style=&quot;display:none&quot; 
  tabindex=&quot;-1&quot; 
  autocomplete=&quot;off&quot; 
/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bots fill in every field, including hidden ones. This catches them automatically. Legitimate users never see or interact with this field.&lt;/p&gt;
&lt;p&gt;If you are using the Formgrid form builder, the honeypot field is added automatically. No extra code needed.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-bottom-line&quot;&gt;The Bottom Line&lt;/h3&gt;
&lt;p&gt;Every form backend on this list will get your form submissions to your inbox. The question is what happens after that.&lt;/p&gt;
&lt;p&gt;If you want to just receive emails, Formspree, Basin, and Web3Forms all work fine. Pick the one with the free tier that fits your volume.&lt;/p&gt;
&lt;p&gt;If you want to actually manage the leads that come through those forms, know who you contacted, set follow-up reminders, and track how many enquiries became customers, then Formgrid is the only option on this list that does that without requiring a separate CRM.&lt;/p&gt;
&lt;p&gt;For most developers building client sites or running small businesses, the lead management features pay for themselves the first time you close a deal you would otherwise have forgotten to follow up on.&lt;/p&gt;
&lt;p&gt;👉 &lt;a rel=&quot;nofollow&quot; href=&quot;https://formgrid.dev/app/signup&quot;&gt;Start free at Formgrid&lt;/a&gt; No credit card required.&lt;/p&gt;
&lt;hr&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/20937/the-best-form-backend-for-static-sites-in-2026</guid>
<pubDate>Thu, 18 Jun 2026 16:59:17 +0000</pubDate>
</item>
<item>
<title>Why I Use Formgrid for Every Client Website I Build</title>
<link>https://coderlegion.com/20932/why-i-use-formgrid-for-every-client-website-i-build</link>
<description>&lt;p&gt;A few months ago, I was building a website for my web design agency at leadsgrid.co.&lt;/p&gt;
&lt;p&gt;I had the homepage done. The services page was looking good. The industry landing pages were ready. Everything was working.&lt;/p&gt;
&lt;p&gt;Then I got to the contact form.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;the-problem-every-web-developer-hits&quot;&gt;The Problem Every Web Developer Hits&lt;/h3&gt;
&lt;p&gt;I needed a lead capture form on the site. Not just a contact form that sends me an email. A proper form that would:&lt;/p&gt;
&lt;p&gt;Notify me immediately when someone enquires. Store every submission somewhere I could track it. Let me see which enquiries I had followed up on and which ones I had not. Tell me which marketing channel sent each lead.&lt;/p&gt;
&lt;p&gt;I had built this before. I knew what it involved.&lt;/p&gt;
&lt;p&gt;A PHP backend to receive the POST request. An email sending library to format and deliver the notification. A database to store submissions. A dashboard to view them. Spam protection so bots do not flood the inbox. Something to track UTM parameters.&lt;/p&gt;
&lt;p&gt;I looked at my shared hosting on Namecheap. cPanel. PHP 8. MySQL.&lt;/p&gt;
&lt;p&gt;I thought: I could build this.&lt;/p&gt;
&lt;p&gt;Then I thought: I already built this. It is called Formgrid.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;why-i-almost-did-not-use-my-own-tool&quot;&gt;Why I Almost Did Not Use My Own Tool&lt;/h3&gt;
&lt;p&gt;Here is the thing about building a product. You spend so much time inside it, thinking about edge cases and user flows and feature gaps, that you sometimes forget to step back and see what it actually does.&lt;/p&gt;
&lt;p&gt;I almost went down the cPanel route out of habit. The same habit that makes developers spin up a Node.js backend and configure Nodemailer for a contact form when a better option already exists.&lt;/p&gt;
&lt;p&gt;What stopped me was a simple question:&lt;/p&gt;
&lt;p&gt;If I were not the founder of Formgrid and I needed a form backend for a static agency site right now, what would I use?&lt;/p&gt;
&lt;p&gt;The answer was obvious.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;what-i-actually-did&quot;&gt;What I Actually Did&lt;/h3&gt;
&lt;p&gt;I pointed the enquiry form on leadsgrid.co at a Formgrid endpoint.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;form action=&quot;https://formgrid.dev/api/f/your-form-id&quot; method=&quot;POST&quot;&amp;gt;
  &amp;lt;input type=&quot;text&quot; name=&quot;name&quot; placeholder=&quot;Your Name&quot; required /&amp;gt;
  &amp;lt;input type=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;Your Email&quot; required /&amp;gt;
  &amp;lt;select name=&quot;package&quot;&amp;gt;
    &amp;lt;option value=&quot;&quot;&amp;gt;Choose a package&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;Lead Starter&quot;&amp;gt;Lead Starter $500&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;Lead Engine&quot;&amp;gt;Lead Engine $950&amp;lt;/option&amp;gt;
    &amp;lt;option value=&quot;Lead Machine&quot;&amp;gt;Lead Machine $1,500&amp;lt;/option&amp;gt;
  &amp;lt;/select&amp;gt;
  &amp;lt;textarea name=&quot;message&quot; placeholder=&quot;Tell me about your business&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/20932/why-i-use-formgrid-for-every-client-website-i-build</guid>
<pubDate>Thu, 18 Jun 2026 16:49:24 +0000</pubDate>
</item>
</channel>
</rss>