<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Allen Jones</title>
    <description>The latest articles on DEV Community by Allen Jones (@allenarduino).</description>
    <link>https://dev.to/allenarduino</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F679555%2F89b03aae-198c-48b1-acb5-9637c4f5ef61.jpeg</url>
      <title>DEV Community: Allen Jones</title>
      <link>https://dev.to/allenarduino</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/allenarduino"/>
    <language>en</language>
    <item>
      <title>Creating a Fully Functional Contact Form with React and Formgrid API</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Mon, 30 Mar 2026 12:25:58 +0000</pubDate>
      <link>https://dev.to/allenarduino/creating-a-fully-functional-contact-form-with-react-and-formgrid-api-499m</link>
      <guid>https://dev.to/allenarduino/creating-a-fully-functional-contact-form-with-react-and-formgrid-api-499m</guid>
      <description>&lt;p&gt;A contact form is an essential component &lt;br&gt;
of any website, allowing visitors to reach &lt;br&gt;
out to you with their queries or feedback.&lt;/p&gt;

&lt;p&gt;In this tutorial, I will show you how to create a contact form with Formgrid, React, and Styled Components.&lt;/p&gt;

&lt;p&gt;We will start by creating the basic form structure and styling it with Styled Components. &lt;br&gt;
Then we will integrate the Formgrid API to handle form submissions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt; is an open-source form backend and no-code form builder that makes it simple to handle form submissions without any server-side coding. By the end of this tutorial, you will have a working contact form that sends email notifications to your inbox whenever someone submits the form.&lt;/p&gt;


&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Prerequisites&lt;/li&gt;
&lt;li&gt;Setting Up the React Project&lt;/li&gt;
&lt;li&gt;Creating the Form Page Layout&lt;/li&gt;
&lt;li&gt;Creating The Details Bar Component&lt;/li&gt;
&lt;li&gt;Creating The Input Side and Input Fields&lt;/li&gt;
&lt;li&gt;Declaring The State Variables and 
Input Handler Functions&lt;/li&gt;
&lt;li&gt;Creating a Formgrid Account&lt;/li&gt;
&lt;li&gt;Handling Form Submission&lt;/li&gt;
&lt;li&gt;Creating The Success Page&lt;/li&gt;
&lt;li&gt;Redirecting Users to The Success Page&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;/ol&gt;


&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Basic knowledge of React and JavaScript&lt;/li&gt;
&lt;li&gt;A free Formgrid account&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Setting Up The React Project
&lt;/h2&gt;

&lt;p&gt;First, create a new React project using &lt;code&gt;create-react-app&lt;/code&gt;. 'Open your terminal, navigate to your desired directory, and &lt;br&gt;
run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx create-react-app formgrid-react-contact-form
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a new React project named &lt;code&gt;formgrid-react-contact-form&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once the project is created, navigate to &lt;br&gt;
the project root directory by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;formgrid-react-contact-form
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will be using &lt;code&gt;styled-components&lt;/code&gt; for &lt;br&gt;
styling our components and &lt;code&gt;react-reveal&lt;/code&gt; &lt;br&gt;
for fade-in animation.&lt;/p&gt;

&lt;p&gt;Run the following command to install &lt;br&gt;
the dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i styled-components react-reveal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Creating The Form Page Layout
&lt;/h2&gt;

&lt;p&gt;Now that we have our project set up let us create the page layout. In your project's &lt;code&gt;src&lt;/code&gt; folder create a new folder called &lt;code&gt;pages&lt;/code&gt;. Navigate to the &lt;code&gt;pages&lt;/code&gt; folder and create a new file called &lt;br&gt;
&lt;code&gt;FormPage.js&lt;/code&gt;. Add the following code &lt;br&gt;
to &lt;code&gt;FormPage.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//FormPage.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;styled-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PageWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  align-items: center;
  background-color: whitesmoke;
  padding-bottom: 50px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PageHeadingWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  display: flex;
  flex-direction: column;
  margin-top: 40px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FormContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  width: 70%;
  background-color: #fff;
  padding: 5px;
  border-radius: 5px;
  height: 70vh;
  @media (max-width: 768px) {
    width: 90%;
  }
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TextOne&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="s2"&gt;`
  font-size: 30px;
  color: rgb(4, 4, 59);
  text-align: center;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TextTwo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="s2"&gt;`
  color: rgb(4, 4, 34);
  font-size: 15px;
  text-align: center;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FormPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PageWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PageHeadingWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextOne&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Contact&lt;/span&gt; &lt;span class="nx"&gt;US&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextOne&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextTwo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Any&lt;/span&gt; &lt;span class="nx"&gt;Question&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="nx"&gt;remarks&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; 
          &lt;span class="nx"&gt;Just&lt;/span&gt; &lt;span class="nx"&gt;write&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextTwo&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/PageHeadingWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FormContainer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/FormContainer&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/PageWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;FormPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2khy47ux1oq4fmjzc44b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2khy47ux1oq4fmjzc44b.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Creating The Details Bar Component
&lt;/h2&gt;

&lt;p&gt;In your project's &lt;code&gt;src&lt;/code&gt; folder create a &lt;br&gt;
new folder called &lt;code&gt;components&lt;/code&gt;. &lt;br&gt;
Navigate to the &lt;code&gt;components&lt;/code&gt; folder and create a new file called &lt;code&gt;DetailsBar.js&lt;/code&gt;. Add the &lt;br&gt;
following code to &lt;code&gt;DetailsBar.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//DetailsBar.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;styled-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Icon&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-feather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DetailsBarWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  background-color: rgb(8, 8, 63);
  border-radius: 7px;
  position: relative;
  padding: 30px;
  display: flex;
  flex-direction: column;
  align-items: center;
  height: auto;
  padding-bottom: 100px;
  @media (max-width: 768px) {
    padding-bottom: 80px;
    grid-row: 2;
  }
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TextWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  display: flex;
  flex-direction: column;
  align-items: center;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TextOne&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="s2"&gt;`
  text-align: center;
  color: #fff;
  font-size: 18px;
  font-weight: bold;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TextTwo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="s2"&gt;`
  text-align: center;
  color: #fff;
  font-size: 12px;
  line-height: 18px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;BigCircle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  height: 50px;
  margin-top: 30px;
  width: 50px;
  background-color: rgb(100, 21, 173);
  border-radius: 100%;
  z-index: 22;
  margin-left: 10px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SmallCircle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  position: absolute;
  margin-left: 10px;
  background-color: rgb(252, 113, 137);
  border-radius: 100%;
  height: 30px;
  width: 30px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ContactsWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="s2"&gt;`
  display: flex;
  width: 200px;
  height: 10px;
  margin-top: 50px;
  cursor: pointer;
  text-decoration: none;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ContactText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  color: #fff;
  font-size: 15px;
  margin-left: 10px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SocialsWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  display: flex;
  justify-content: center;
  height: 10px;
  bottom: 30px;
  position: absolute;
  cursor: pointer;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SocialIconWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="s2"&gt;`
  width: 35px;
  height: 35px;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
  &amp;amp;:hover {
    background-color: rgb(252, 113, 137);
  }
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DetailsBar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DetailsBarWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextOne&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Contact&lt;/span&gt; &lt;span class="nx"&gt;Information&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextOne&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextTwo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Fill&lt;/span&gt; &lt;span class="nx"&gt;up&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;our&lt;/span&gt; &lt;span class="nx"&gt;team&lt;/span&gt; 
          &lt;span class="nx"&gt;will&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nx"&gt;back&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt; &lt;span class="nx"&gt;you&lt;/span&gt; &lt;span class="nx"&gt;within&lt;/span&gt; 
          &lt;span class="mi"&gt;24&lt;/span&gt; &lt;span class="nx"&gt;hours&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextTwo&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactsWrapper&lt;/span&gt; &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tel:+233543201893&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Phone&lt;/span&gt; 
            &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
            &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rgb(252, 113, 137)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
          &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactText&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;233543201893&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ContactText&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ContactsWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactsWrapper&lt;/span&gt; 
          &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mailto:aljay3334@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Mail&lt;/span&gt; 
            &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
            &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rgb(252, 113, 137)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
          &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ContactText&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;aljay3334&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;gmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;com&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ContactText&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/ContactsWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;BigCircle&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/BigCircle&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SmallCircle&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/SmallCircle&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SocialsWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SocialIconWrapper&lt;/span&gt; 
          &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.facebook.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Facebook&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/SocialIconWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SocialIconWrapper&lt;/span&gt; 
          &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.instagram.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Instagram&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/SocialIconWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SocialIconWrapper&lt;/span&gt; 
          &lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.linkedin.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Linkedin&lt;/span&gt; &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#fff&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/SocialIconWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/SocialsWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/DetailsBarWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;DetailsBar&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Firxxf7mvltkrkmtaio0o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Firxxf7mvltkrkmtaio0o.png" alt=" " width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;In &lt;code&gt;FormPage.js&lt;/code&gt; import the DetailsBar &lt;br&gt;
component into it as shown in the &lt;br&gt;
code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//FormPage.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;styled-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;DetailsBar&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/DetailsBar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FormPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PageWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PageHeadingWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextOne&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Contact&lt;/span&gt; &lt;span class="nx"&gt;US&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextOne&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextTwo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Any&lt;/span&gt; &lt;span class="nx"&gt;Question&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="nx"&gt;remarks&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; 
          &lt;span class="nx"&gt;Just&lt;/span&gt; &lt;span class="nx"&gt;write&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextTwo&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/PageHeadingWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FormContainer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DetailsBar&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/FormContainer&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/PageWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;FormPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Creating The Input Side
&lt;/h2&gt;

&lt;p&gt;Let us create the input side and add the input fields. &lt;br&gt;
We will style the input fields with styled components and make them responsive using CSS media queries.&lt;/p&gt;

&lt;p&gt;In the &lt;code&gt;components&lt;/code&gt; folder create a &lt;br&gt;
new file called &lt;code&gt;InputSide.js&lt;/code&gt; and &lt;br&gt;
add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//InputSide.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;styled-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputSideWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="s2"&gt;`
  height: auto;
  padding-bottom: 100px;
  position: relative;
  padding: 10px 10px 100px 10px;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  border: 2px solid transparent;
  width: 90%;
  padding-left: 10px;
  display: flex;
  flex-direction: column;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="s2"&gt;`
  color: #333;
  width: 100%;
  font-size: 15px;
  padding: 8px;
  border-bottom: 1px solid rgb(100, 21, 173);
  border-left: 1px solid transparent;
  border-right: 1px solid transparent;
  border-top: 1px solid transparent;
  outline: 0px transparent !important;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MessageInput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textarea&lt;/span&gt;&lt;span class="s2"&gt;`
  width: 100%;
  color: #333;
  font-size: 15px;
  padding: 10px;
  border-bottom: 1px solid rgb(100, 21, 173);
  border-left: 1px solid transparent;
  border-right: 1px solid transparent;
  border-top: 1px solid transparent;
  outline: 0px transparent !important;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SubMitButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="s2"&gt;`
  position: absolute;
  bottom: 20px;
  right: 20px;
  padding: 10px;
  background-color: rgb(8, 8, 63);
  color: #fff;
  border: none;
  border-radius: 5px;
  padding: 12px 25px 12px 24px;
  cursor: pointer;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputSideWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Input&lt;/span&gt; 
          &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allen Jones&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
        &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Email&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Input&lt;/span&gt; 
          &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aljay126@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
        &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Phone&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Input&lt;/span&gt; 
          &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;+233546227893&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
        &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MessageInput&lt;/span&gt; 
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Write your message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
        &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SubMitButton&lt;/span&gt; 
        &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Send Message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
      &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputSideWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;code&gt;FormPage.js&lt;/code&gt; import the InputSide &lt;br&gt;
component into it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//FormPage.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;styled-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;DetailsBar&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/DetailsBar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../components/InputSide&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FormPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PageWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PageHeadingWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextOne&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Contact&lt;/span&gt; &lt;span class="nx"&gt;US&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextOne&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TextTwo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="nx"&gt;Any&lt;/span&gt; &lt;span class="nx"&gt;Question&lt;/span&gt; &lt;span class="nx"&gt;or&lt;/span&gt; &lt;span class="nx"&gt;remarks&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; 
          &lt;span class="nx"&gt;Just&lt;/span&gt; &lt;span class="nx"&gt;write&lt;/span&gt; &lt;span class="nx"&gt;us&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/TextTwo&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/PageHeadingWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FormContainer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DetailsBar&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputSide&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/FormContainer&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/PageWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;FormPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26semx6k7a8cebeg6mno.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F26semx6k7a8cebeg6mno.png" alt=" " width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Declaring The State Variables and
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Input Handler Functions
&lt;/h2&gt;

&lt;p&gt;Let us declare the state variables and add the functions for handling &lt;br&gt;
the form inputs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//InputSide.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPhone&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;buttonLoading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setButtonLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;phoneHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setPhone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messageHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this code, we have used the useState hook to create state variables for the form inputs and the loading state of the submit button. &lt;br&gt;
We have also added the input handler functions.&lt;/p&gt;


&lt;h2&gt;
  
  
  Creating a Formgrid Account
&lt;/h2&gt;

&lt;p&gt;Go to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; &lt;br&gt;
and sign up using Google or Email. &lt;br&gt;
No credit card required.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05rdbmc0okdejzbtp3w4.png" alt=" " width="800" height="443"&gt;
&lt;/h2&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0zs027t6qts2m61jmya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb0zs027t6qts2m61jmya.png" alt=" " width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Once you are logged in click &lt;strong&gt;New Form&lt;/strong&gt; from your dashboard and give your form a name. Click &lt;strong&gt;Create Form&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be taken to your form's &lt;br&gt;
Overview tab. Here you will find your &lt;br&gt;
unique &lt;strong&gt;Endpoint URL&lt;/strong&gt;. Copy it. &lt;br&gt;
It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://formgrid.dev/api/f/your-form-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the URL you will use to send your form submissions. &lt;br&gt;
Every time someone submits your form, the data is sent to this endpoint, and Formgrid emails you the submission details instantly.&lt;/p&gt;

&lt;p&gt;Unlike Formspree, you do not need to &lt;br&gt;
configure anything else. Email notifications are enabled by default &lt;br&gt;
using the email address you signed up with.&lt;/p&gt;


&lt;h2&gt;
  
  
  Handling Form Submission
&lt;/h2&gt;

&lt;p&gt;Now let us add the function for handling form submission. &lt;br&gt;
Replace the contents &lt;br&gt;
of &lt;code&gt;InputSide.js&lt;/code&gt; with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//InputSide.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;styled-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPhone&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;buttonLoading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setButtonLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nameHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;emailHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;phoneHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setPhone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;messageHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setButtonLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://formgrid.dev/api/f/your-form-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
          &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="nx"&gt;message&lt;/span&gt; 
        &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setButtonLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Message sent successfully!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setButtonLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to send message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputSideWrapper&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Input&lt;/span&gt;
          &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Allen Jones&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;nameHandler&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;required&lt;/span&gt;
        &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Email&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Input&lt;/span&gt;
          &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aljay126@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;emailHandler&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;required&lt;/span&gt;
        &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Phone&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Input&lt;/span&gt;
          &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;+233546227893&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;phoneHandler&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;InputWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MessageInput&lt;/span&gt;
          &lt;span class="nx"&gt;placeholder&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Write your message&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
          &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;messageHandler&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="nx"&gt;required&lt;/span&gt;
        &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SubMitButton&lt;/span&gt;
        &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;buttonLoading&lt;/span&gt; 
          &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sending...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; 
          &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Send Message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;disabled&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;buttonLoading&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/InputSideWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;your-form-id&lt;/code&gt; with the actual endpoint slug from your Formgrid form overview tab.&lt;/p&gt;

&lt;p&gt;In this code, we use the &lt;code&gt;fetch&lt;/code&gt; API to make a POST request to your Formgrid endpoint with the form data as JSON. &lt;br&gt;
Formgrid receives the submission, saves it to your dashboard, and sends you an email notification instantly.&lt;/p&gt;

&lt;p&gt;If the response is successful, the &lt;br&gt;
&lt;code&gt;if&lt;/code&gt; block handles it. Otherwise &lt;br&gt;
the &lt;code&gt;else&lt;/code&gt; block handles errors.&lt;/p&gt;
&lt;h3&gt;
  
  
  What happens after submission
&lt;/h3&gt;

&lt;p&gt;When someone submits your form you will receive an email notification that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New Submission: Contact Form

Name: Allen Jones
Email: aljay126@gmail.com
Phone: +233546227893
Message: Hello, I would like to 
         get in touch.

Submitted: 10:30 AM, March 22, 2026
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Clean. Organized. Ready to act on.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0lu1tjfb1gpstvhesgu.png" alt=" " width="800" height="451"&gt;
&lt;/h2&gt;

&lt;p&gt;You can also view all submissions in your Formgrid dashboard at any time. &lt;br&gt;
No submission is ever lost, even if the email notification fails to arrive.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" alt=" " width="800" height="442"&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Adding spam protection
&lt;/h3&gt;

&lt;p&gt;Formgrid includes built-in spam protection controls in the &lt;strong&gt;Security Settings&lt;/strong&gt; section for each form (available on all plans).&lt;/p&gt;

&lt;p&gt;You can protect your form in two ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add a honeypot field to your frontend form&lt;/strong&gt;, and
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable protections in Form Details → Settings → Security Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are adding a honeypot field manually, use this field name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; 
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"honeypot"&lt;/span&gt; 
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
  &lt;span class="na"&gt;tabIndex&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="na"&gt;autoComplete&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"off"&lt;/span&gt;
  &lt;span class="na"&gt;aria-hidden&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;
&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OR&lt;br&gt;
You can click on the form to visit the:&lt;br&gt;
 &lt;strong&gt;Form Details&lt;/strong&gt; page. This is where you can manage everything related to that specific form.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjyrlhajkrrocccpy01u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjyrlhajkrrocccpy01u.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 3: Navigate to the form Settings Tab
&lt;/h3&gt;

&lt;p&gt;At the top of the Form Details page, you will see a row of tabs. Click on the &lt;strong&gt;Settings&lt;/strong&gt; tab to open the form's configuration options.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ty9ezbuknoot0k91as9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ty9ezbuknoot0k91as9.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 4: Scroll Down to the Security Settings Section
&lt;/h3&gt;

&lt;p&gt;Within the Settings tab, scroll down until you reach the &lt;strong&gt;Security Settings&lt;/strong&gt; section. This is where all of Formgrid's spam and abuse protection tools are located.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foogg3jcahm0x0b57ypfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foogg3jcahm0x0b57ypfd.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;You will see the following options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable CAPTCHA:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adds a Google reCAPTCHA "I'm not a robot" verification step to your form. When enabled, anyone submitting your form will need to complete the CAPTCHA challenge before their submission goes through. Real human users can do this easily. Automated bots typically cannot, which stops the majority of spam submissions before they ever reach your inbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable Honeypot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adds a hidden field to your form that is completely invisible to real users but visible to bots. When a bot fills in the form, it fills in every field it can detect, including the hidden honeypot field. Formgrid detects this and automatically discards the submission as spam. Legitimate users never see or interact with this field, so it has no impact on the experience of real visitors filling in your form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Allowed Domains (CORS):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Allows you to specify which domains are permitted to submit data to your form. If your form is embedded on a specific website, you can enter that domain here. Any submission coming from a different domain will be rejected. This is particularly effective against bots that submit directly to your form endpoint without visiting your website at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate Limiting:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sets a maximum number of submissions allowed per IP address per minute. This prevents any single source from flooding your form with repeated submissions in a short period. If you expect normal users to submit your form occasionally, a limit of 3 to 5 submissions per minute per IP is a reasonable starting point.&lt;/p&gt;

&lt;p&gt;Bots that automatically fill every field will fill in this hidden field. Formgrid detects this and automatically rejects the submission.&lt;/p&gt;


&lt;h2&gt;
  
  
  Creating The Success Page
&lt;/h2&gt;

&lt;p&gt;The success page is where users will &lt;br&gt;
be directed after form submission. &lt;br&gt;
In &lt;code&gt;src/pages/&lt;/code&gt; create a new file &lt;br&gt;
called &lt;code&gt;SuccessPage.js&lt;/code&gt; and add &lt;br&gt;
the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//SuccessPage.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Icon&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-feather&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Fade&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-reveal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;styled-components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MessageWrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`
  margin-top: 150px;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SuccessMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;h2&lt;/span&gt;&lt;span class="s2"&gt;`
  font-size: 25px;
  color: rgb(8, 8, 63);
  @media (max-width: 768px) {
    font-size: 18px;
  }
`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;SuccessPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Fragment&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Fade&lt;/span&gt; &lt;span class="nx"&gt;bottom&lt;/span&gt; &lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;distance&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;60px&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MessageWrapper&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Icon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CheckCircle&lt;/span&gt; 
            &lt;span class="nx"&gt;color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rgb(8, 8, 63)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
            &lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt; &lt;span class="p"&gt;}}&lt;/span&gt; 
          &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SuccessMessage&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nx"&gt;MESSAGE&lt;/span&gt; &lt;span class="nx"&gt;SENT&lt;/span&gt; &lt;span class="nx"&gt;SUCCESSFULLY&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/SuccessMessage&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MessageWrapper&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Fade&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/React.Fragment&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;SuccessPage&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Redirecting Users to The Success Page
&lt;/h2&gt;

&lt;p&gt;We will use &lt;code&gt;react-router-dom&lt;/code&gt; to handle &lt;br&gt;
navigation between the form page and &lt;br&gt;
the success page.&lt;/p&gt;

&lt;p&gt;Run the following command to install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;react-router-dom
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;code&gt;App.js&lt;/code&gt; and replace its contents &lt;br&gt;
with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//App.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nx"&gt;BrowserRouter&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;Routes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="nx"&gt;Route&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;FormPage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/FormPage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SuccessPage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./pages/SuccessPage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Routes&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;FormPage&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Route&lt;/span&gt; 
            &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/success&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; 
            &lt;span class="nx"&gt;element&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;SuccessPage&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; 
          &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Routes&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Router&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now update &lt;code&gt;InputSide.js&lt;/code&gt; to redirect &lt;br&gt;
the user to the success page after &lt;br&gt;
a successful submission:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;//InputSide.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useNavigate&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react-router-dom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;navigate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useNavigate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setButtonLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://formgrid.dev/api/f/your-form-id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; 
          &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
          &lt;span class="nx"&gt;message&lt;/span&gt; 
        &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setButtonLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nf"&gt;setButtonLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to send message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;InputSide&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why Use Formgrid Instead of Formspree
&lt;/h2&gt;

&lt;p&gt;Both Formgrid and Formspree handle form &lt;br&gt;
submissions reliably. Here is how &lt;br&gt;
they compare:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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;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;50/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Form builder&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hostable&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Sheets native&lt;/td&gt;
&lt;td&gt;$90/month&lt;/td&gt;
&lt;td&gt;$16/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom email templates&lt;/td&gt;
&lt;td&gt;$90/month&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Submission dashboard&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Formgrid gives you everything Formspree &lt;br&gt;
offers on the free plan, plus a no-code &lt;br&gt;
form builder, self-hosting via Docker, &lt;br&gt;
and significantly cheaper paid plans.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we learnt how to create &lt;br&gt;
a contact form in React using the Formgrid &lt;br&gt;
API and Styled Components. We also added &lt;br&gt;
&lt;code&gt;react-router-dom&lt;/code&gt; for navigation between &lt;br&gt;
the form page and the success page.&lt;/p&gt;

&lt;p&gt;With Formgrid, your form submissions are &lt;br&gt;
handled reliably, saved to a dashboard, &lt;br&gt;
and emailed to you instantly. No &lt;br&gt;
server-side code. No backend setup. &lt;br&gt;
Just a simple endpoint URL.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Try Formgrid free at formgrid.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #react #webdev #javascript &lt;/p&gt;

&lt;h1&gt;
  
  
  tutorial #formgrid
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
markdown

---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why WordPress Contact Form Emails Go to Spam (And How to Fix It)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sun, 29 Mar 2026 08:02:20 +0000</pubDate>
      <link>https://dev.to/allenarduino/why-wordpress-contact-form-emails-go-to-spam-and-how-to-fix-it-kk</link>
      <guid>https://dev.to/allenarduino/why-wordpress-contact-form-emails-go-to-spam-and-how-to-fix-it-kk</guid>
      <description>&lt;p&gt;You set up Contact Form 7 on your WordPress site. Someone fills out &lt;br&gt;
your contact form. You never received the email.&lt;/p&gt;

&lt;p&gt;Or worse: you receive it two days later, buried in your spam folder.&lt;/p&gt;

&lt;p&gt;You are not alone. This is one of the most searched WordPress problems in 2026, and it affects thousands of website owners who have no idea why their contact form emails keep disappearing.&lt;/p&gt;

&lt;p&gt;This guide explains exactly why it happens and gives you two ways to fix it permanently.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why WordPress Contact Form Emails
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Go to Spam
&lt;/h2&gt;

&lt;p&gt;WordPress forms do send emails. Contact &lt;br&gt;
Form 7, WPForms, Gravity Forms, and Ninja &lt;br&gt;
Forms all send email notifications when someone submits your form.&lt;/p&gt;

&lt;p&gt;The problem is not the form plugin. &lt;br&gt;
The problem is how WordPress sends emails.&lt;/p&gt;

&lt;p&gt;By default WordPress uses a PHP function called &lt;code&gt;mail()&lt;/code&gt; to send all emails including your form notifications. This function sends emails directly from your web server without any authentication &lt;br&gt;
or encryption.&lt;/p&gt;

&lt;p&gt;Email providers like Gmail, Outlook, and &lt;br&gt;
Yahoo has strict spam filters that check whether the server sending an email is authorized to send it. When an email arrives from a random web server with no authentication, those filters mark it as &lt;br&gt;
spam or reject it entirely.&lt;/p&gt;

&lt;p&gt;Your form is working perfectly. Your hosting server is sending the email. But it never reaches your inbox because Gmail sees it as suspicious.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Five Most Common Reasons Your
&lt;/h2&gt;
&lt;h2&gt;
  
  
  WordPress Form Emails Are Not Arriving
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reason 1: Your host blocks or throttles &lt;br&gt;
PHP mail&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many shared hosting providers block or severely limit PHP mail to prevent their servers from being used for spam. Bluehost, SiteGround, and other popular hosts have increasingly aggressive restrictions on PHP mail.&lt;/p&gt;

&lt;p&gt;If you recently changed hosting providers and your contact form emails suddenly stopped working, this is almost certainly &lt;br&gt;
the reason.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason 2: Your domain has no SPF or &lt;br&gt;
DKIM records&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SPF and DKIM are email authentication records that tell email providers your server is authorized to send emails from your domain. Without them, your emails look suspicious to spam filters.&lt;/p&gt;

&lt;p&gt;Most WordPress PHP mail setups send emails without proper SPF and DKIM authentication, which is why they land in spam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason 3: Contact Form 7 default &lt;br&gt;
settings use WordPress admin email&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CF7 by default sends notification emails from your WordPress admin email address using your server's PHP mail. &lt;br&gt;
If your server's IP address has been flagged for spam by any email provider, your notifications will be blocked or filtered.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason 4: Your notification email address is different from your domain&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your WordPress site is &lt;code&gt;yoursite.com&lt;/code&gt; but your notification email is &lt;br&gt;
&lt;code&gt;yourname@gmail.com&lt;/code&gt; the email is &lt;br&gt;
traveling from a server at &lt;code&gt;yoursite.com&lt;/code&gt; to Gmail. Gmail is increasingly suspicious of emails that originate from web servers &lt;br&gt;
rather than dedicated email infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason 5: No submission backup exists&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is not a deliverability problem, but it makes everything worse. When WordPress's PHP mail fails, your submission is lost &lt;br&gt;
permanently. There is no dashboard. No submission history. No way to recover what someone sent you. If the email fails, you never know it happened.&lt;/p&gt;


&lt;h2&gt;
  
  
  Fix 1: Use an SMTP Plugin
&lt;/h2&gt;

&lt;p&gt;The fastest fix for most WordPress users is to replace PHP mail with a proper SMTP connection using a dedicated email service.&lt;/p&gt;

&lt;p&gt;SMTP (Simple Mail Transfer Protocol) sends your emails through a proper authenticated email server instead of your web host's PHP mail function. Email providers trust SMTP emails from known &lt;br&gt;
services significantly more than PHP mail.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Install WP Mail SMTP
&lt;/h3&gt;

&lt;p&gt;WP Mail SMTP is the most popular WordPress SMTP plugin with over 3 million active installs. Install it from WordPress &lt;br&gt;
plugin directory.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Choose an SMTP provider
&lt;/h3&gt;

&lt;p&gt;WP Mail SMTP works with several free and &lt;br&gt;
paid SMTP providers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gmail SMTP (free)&lt;/strong&gt;&lt;br&gt;
If you have a Google Workspace account, you can use Gmail's SMTP server. Free for basic usage. Best for small sites &lt;br&gt;
with low form volume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Brevo (formerly Sendinblue) (free tier)&lt;/strong&gt;&lt;br&gt;
300 emails per day free. Good deliverability. &lt;br&gt;
Easy to set up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mailgun (free tier)&lt;/strong&gt;&lt;br&gt;
100 emails per day free. Excellent &lt;br&gt;
deliverability. Requires domain verification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resend (free tier)&lt;/strong&gt;&lt;br&gt;
3,000 emails per month free. Modern API. &lt;br&gt;
Excellent deliverability. Strong DKIM &lt;br&gt;
and SPF setup.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Configure WP Mail SMTP
&lt;/h3&gt;

&lt;p&gt;Go to WP Mail SMTP settings in your WordPress dashboard. Enter your SMTP credentials from whichever provider &lt;br&gt;
you chose. Send a test email to confirm &lt;br&gt;
it is working.&lt;/p&gt;

&lt;p&gt;Once configured, all WordPress emails, including your contact form notifications, will be sent through your SMTP provider &lt;br&gt;
instead of PHP mail. Deliverability &lt;br&gt;
improves immediately.&lt;/p&gt;


&lt;h2&gt;
  
  
  Fix 2: Use Formgrid as Your
&lt;/h2&gt;
&lt;h2&gt;
  
  
  Form Backend
&lt;/h2&gt;

&lt;p&gt;If you want more than just reliable email delivery, a submission dashboard, Google Sheets sync, file uploads, and spam protection, consider replacing your WordPress form plugin with Formgrid.&lt;/p&gt;

&lt;p&gt;Formgrid is a form backend and form builder that handles your submissions independently of WordPress. It uses Resend for email delivery, which means your notifications go through proper, authenticated email infrastructure with excellent deliverability.&lt;/p&gt;

&lt;p&gt;Here is how to use Formgrid with your &lt;br&gt;
WordPress site:&lt;/p&gt;
&lt;h3&gt;
  
  
  Option A: HTML Form in WordPress
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Custom HTML Block
&lt;/h3&gt;

&lt;p&gt;This is the most reliable approach. Instead of using a form plugin, you write a simple HTML form in a WordPress Custom HTML block and point it at your Formgrid endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign up at &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; &lt;br&gt;
and create a new form.&lt;/p&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Copy your Formgrid endpoint URL &lt;br&gt;
from the form overview tab. It looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://formgrid.dev/api/f/your-form-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; In your WordPress page editor, add a Custom HTML block and paste &lt;br&gt;
this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://formgrid.dev/api/f/your-form-id"&lt;/span&gt; 
      &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Your Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
           &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; 
           &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; 
           &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email Address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
           &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
           &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
           &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Message&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; 
              &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; 
              &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; 
              &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Honeypot spam protection --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
         &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
         &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send Message&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;your-form-id&lt;/code&gt; with your actual &lt;br&gt;
Formgrid endpoint slug.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Publish your page and submit a test entry. Your notification email will arrive instantly through Resend with reliable, authenticated delivery.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option B: Embed the Formgrid
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Form Builder
&lt;/h3&gt;

&lt;p&gt;If you do not want to write any HTML, you can build your form using Formgrid's drag-and-drop form builder and embed it in WordPress using an iframe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Build your form in the Formgrid form builder. Drag and drop your fields, customize labels, and click Save.&lt;/p&gt;


&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoy2c2w7bryqr9obfqe6.png" alt=" " width="800" height="441"&gt;
&lt;/h2&gt;


&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nc7en2b8mjlrtqghdhg.png" alt=" " width="800" height="441"&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Copy your shareable form link from the Overview tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; In your WordPress page editor &lt;br&gt;
add a Custom HTML block and paste &lt;br&gt;
this embed code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt; 
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://share.formgrid.dev/f/your-form-id"&lt;/span&gt;
  &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt;
  &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"600"&lt;/span&gt;
  &lt;span class="na"&gt;frameborder=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
  &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"border: none;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your form is now embedded in your &lt;br&gt;
WordPress page and all submissions go &lt;br&gt;
directly to Formgrid.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Formgrid Solves More Than
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Just Deliverability
&lt;/h2&gt;

&lt;p&gt;The SMTP plugin approach fixes your email deliverability. Formgrid fixes deliverability and gives you several things WordPress form plugins cannot:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A submission dashboard&lt;/strong&gt;&lt;br&gt;
Every submission is saved in your Formgrid dashboard regardless of &lt;br&gt;
whether the email was delivered. You never lose a submission again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSV export&lt;/strong&gt;&lt;br&gt;
Download all your submissions as a &lt;br&gt;
spreadsheet anytime. No plugin needed. &lt;br&gt;
No data loss.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File uploads&lt;/strong&gt;&lt;br&gt;
Accept resumes, images, and documents &lt;br&gt;
up to 1GB per file on the Premium plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Sheets sync&lt;/strong&gt;&lt;br&gt;
On the Professional plan, every submission appears automatically in a Google Sheet in real time. No Zapier. No plugins. &lt;br&gt;
No Google API setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spam protection&lt;/strong&gt;&lt;br&gt;
Built-in honeypot and rate limiting catch bots before they reach your inbox. Advanced CAPTCHA on the Premium plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom email templates&lt;/strong&gt;&lt;br&gt;
On the Business plan, you can design exactly how your notification emails look with full HTML control.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which Fix Should You Use?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You want the simplest fix with minimal setup, and you are happy with your current form plugin:
→ Use WP Mail SMTP with a free 
  SMTP provider

You want reliable emails AND a submission dashboard AND Google 
Sheets sync AND spam protection:
→ Use Formgrid as your form backend

You are a non-technical user who 
does not want to touch any code:
→ Use Formgrid's form builder 
  embedded via iframe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Honest Limitation of Formgrid
&lt;/h2&gt;

&lt;h2&gt;
  
  
  for WordPress
&lt;/h2&gt;

&lt;p&gt;Formgrid is not a WordPress plugin. You cannot install it from the WordPress plugin directory. It requires either adding a custom HTML form to your page or embedding the form builder via iframe.&lt;/p&gt;

&lt;p&gt;For users who are comfortable with WordPress Custom HTML blocks, this is a one-time 5-minute setup. For users who want a fully integrated WordPress plugin experience, WP Mail SMTP is the simpler choice.&lt;/p&gt;

&lt;p&gt;Both fixes solve the core problem. Choose the one that matches your &lt;br&gt;
technical comfort level.&lt;/p&gt;




&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Will this fix Contact Form 7 emails &lt;br&gt;
going to spam?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you use WP Mail SMTP with a proper SMTP provider, yes. CF7 will send through your SMTP connection instead of PHP mail &lt;br&gt;
and deliverability improves immediately.&lt;/p&gt;

&lt;p&gt;If you switch to Formgrid, your CF7 plugin becomes optional. You can use a simple HTML form instead and bypass CF7 entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need to pay for an SMTP provider?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most SMTP providers have generous free tiers. Brevo gives you 300 emails per day free. Mailgun gives you 100 emails per day free. For most small business contact forms, these free tiers are &lt;br&gt;
more than enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Formgrid work with any &lt;br&gt;
WordPress theme?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yes. Formgrid uses a standard HTML form or an iframe embed. Both work with any WordPress theme, including Astra, Divi, &lt;br&gt;
Elementor, GeneratePress, and Kadence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What happens if I miss a submission?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With a standard WordPress form plugin and PHP mail, a failed email means a lost submission. With Formgrid, every submission is saved to your dashboard regardless of email delivery. You can &lt;br&gt;
always log in and see every submission &lt;br&gt;
ever received.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;WordPress contact form emails going to spam is a PHP mail problem not a form plugin problem. The fix is straightforward:&lt;/p&gt;

&lt;p&gt;Replace PHP mail with a proper SMTP connection using WP Mail SMTP and a free SMTP provider. Your emails will reach inboxes reliably from today.&lt;/p&gt;

&lt;p&gt;Or switch to Formgrid for a form backend that handles reliable email delivery, submission storage, Google Sheets sync, and spam protection all in one place.&lt;/p&gt;

&lt;p&gt;Either way, your contact form emails will stop disappearing.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Try Formgrid free at formgrid.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. Written as honestly as I could. &lt;br&gt;
Let me know in the comments if &lt;br&gt;
anything looks off.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #wordpress #webdev #tutorial &lt;/p&gt;

&lt;h1&gt;
  
  
  contactform #email
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
markdown

---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>How to Send Webflow Form Submissions Directly to Google Sheets (No Zapier Required)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 27 Mar 2026 16:43:09 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-send-webflow-form-submissions-directly-to-google-sheets-no-zapier-required-l0d</link>
      <guid>https://dev.to/allenarduino/how-to-send-webflow-form-submissions-directly-to-google-sheets-no-zapier-required-l0d</guid>
      <description>&lt;p&gt;Webflow is an excellent tool for building professional websites without writing code. Its built-in form builder lets you add contact forms, enquiry forms, and registration forms to any page in minutes. But when it comes to where those submissions actually go, Webflow's native options are limited.&lt;/p&gt;

&lt;p&gt;By default, Webflow sends form submissions to your email inbox. That works well enough when you are receiving a handful of messages a month. But the moment you need your team to collaborate on responses, filter submissions by type, track patterns over time, or simply keep everything organised in one place, an inbox falls short.&lt;/p&gt;

&lt;p&gt;The solution most people reach for is Zapier. Set up a Zap, connect Webflow to Google Sheets, and submissions flow across automatically. It works, but it adds a monthly subscription on top of what you are already paying, introduces a delay between submission and spreadsheet row, and creates a dependency on a third service that can break independently of both Webflow and Google Sheets.&lt;/p&gt;

&lt;p&gt;This guide shows you a more direct approach. Using Formgrid, you can point your Webflow form at a custom endpoint and have every submission land in Google Sheets automatically, in real time, with no Zapier account required.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Will Need
&lt;/h2&gt;

&lt;p&gt;Before starting, make sure you have the following in place:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Formgrid Professional plan account:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Google Sheets integration is available on the Professional plan at $16/month. If you do not have an account yet, you can sign up for free at formgrid.dev and upgrade to Professional when prompted during the integration setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Webflow site with a form:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will need an existing Webflow form that you want to connect to Google Sheets. Any Webflow form works, whether it is a simple contact form with three fields or a detailed multi-field enquiry form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Google account:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will need access to Google Sheets to create the spreadsheet that will receive your submissions. Any standard Google account works.&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Works
&lt;/h2&gt;

&lt;p&gt;The setup replaces Webflow's default form submission handling with Formgrid's backend. Instead of Webflow catching the submission and forwarding it to your email, the form sends its data directly to a Formgrid endpoint URL. Formgrid receives the submission, saves it to your dashboard, sends you an email notification, and writes a new row to your connected Google Sheet instantly.&lt;/p&gt;

&lt;p&gt;The key change on the Webflow side is a single setting: the form action URL. You point it at your Formgrid endpoint instead of leaving it on Webflow's default handler. That is the only configuration change you make in Webflow. Everything else happens inside Formgrid.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part One: Set Up Your Formgrid Form and Get Your Endpoint URL
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Log In to Formgrid and Create a New Form
&lt;/h3&gt;

&lt;p&gt;Log in to your Formgrid account at formgrid.dev. From your dashboard, create a new form and give it a name that corresponds to the Webflow form you are connecting. For example, "Contact Form" or "Service Enquiry Form."&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;You are not building a form inside Formgrid here. You are registering a form entry in your dashboard so that Formgrid knows where to route the incoming submissions from Webflow. Your actual form fields remain exactly as they are in Webflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Copy Your Formgrid Endpoint URL
&lt;/h3&gt;

&lt;p&gt;Once your form is created, open it in your Formgrid dashboard. You will see your unique endpoint URL displayed prominently. It will follow this format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://formgrid.dev/api/f/your-form-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy this URL. You will need it in the next section when you update your Webflow form settings.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;This URL is permanent. It does not change when you update your form settings, connect integrations, or make any other changes inside Formgrid. You set it once in Webflow and never need to touch it again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part Two: Update Your Webflow Form to Use the Formgrid Endpoint
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 3: Open Your Webflow Form Settings
&lt;/h3&gt;

&lt;p&gt;Log in to your Webflow account and open the project containing the form you want to connect. In the Webflow Designer, click on your form element to select it. Then open the form settings panel.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrh4p9qubld1lolwpy61.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqrh4p9qubld1lolwpy61.png" alt=" " width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;







&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe17qjmejocjann5mayyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe17qjmejocjann5mayyu.png" alt=" " width="800" height="513"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Set the Form Action URL
&lt;/h3&gt;

&lt;p&gt;In the form settings panel, locate the &lt;strong&gt;Action&lt;/strong&gt; field. By default, this is either empty or set to Webflow's internal submission handler.&lt;/p&gt;

&lt;p&gt;Replace the existing value with your Formgrid endpoint URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://formgrid.dev/api/f/your-form-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set the &lt;strong&gt;Method&lt;/strong&gt; to &lt;strong&gt;POST&lt;/strong&gt; if it is not already.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feppst7xj0cdchj86ykey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feppst7xj0cdchj86ykey.png" alt=" " width="520" height="738"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Check Your Field Names
&lt;/h3&gt;

&lt;p&gt;Formgrid uses the &lt;strong&gt;name&lt;/strong&gt; attribute of each form field to create the column headers in your Google Sheet. Webflow assigns name attributes to every field automatically, but it is worth reviewing them before you connect your Sheet to make sure they are clear and descriptive.&lt;/p&gt;

&lt;p&gt;In the Webflow Designer, click on each input field in your form and check the name value in the element settings panel. Field names like "Name," "Email," "Phone," and "Message" will produce clean, readable column headers in your spreadsheet. Webflow's default auto-generated field names are sometimes less intuitive, so update any that are unclear.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgyh2t3it2cf7bzwjp1n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffgyh2t3it2cf7bzwjp1n.png" alt=" " width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: Publish Your Webflow Site
&lt;/h3&gt;

&lt;p&gt;Once you have updated the form action URL and reviewed your field names, publish your Webflow site to push the changes live. The Formgrid endpoint will not receive any submissions until your site is published.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Submit a Test Entry
&lt;/h3&gt;

&lt;p&gt;Before connecting Google Sheets, confirm that submissions are reaching Formgrid correctly. Visit your live Webflow site, fill in your form with test data, and submit it.&lt;/p&gt;

&lt;p&gt;Open your Formgrid dashboard and check the submissions list for your form. The test entry should appear within a few seconds.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If the submission does not appear, go back to your Webflow form settings and confirm that the action URL is set correctly and that the method is POST. Also, confirm that you published the site after making the change, as unpublished changes in Webflow do not take effect on the live site.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part Three: Connect Google Sheets
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 8: Open the Integrations Tab in Formgrid
&lt;/h3&gt;

&lt;p&gt;In your Formgrid dashboard, open the form you just connected and click on the &lt;strong&gt;Integrations&lt;/strong&gt; tab at the top of the page.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg92n733ozbxl0mbop3f8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg92n733ozbxl0mbop3f8.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;You will see the Google Sheets integration section. Since you are on the Professional plan, the Connect interface is active and ready to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9: Create a Blank Google Sheet
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;Create blank Google Sheet&lt;/strong&gt; button in the Formgrid integrations panel. This opens a new blank spreadsheet in Google Sheets in a separate browser tab.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4c2cwasp562gnxx3pfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4c2cwasp562gnxx3pfn.png" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Give your sheet a clear, identifiable name. Something like "Contact Form Submissions" or "Enquiries 2026" works well. If you manage multiple Webflow forms and plan to connect each one to its own sheet, a consistent naming convention will help you stay organised.&lt;/p&gt;

&lt;p&gt;Do not add any column headers or set up any structure in the spreadsheet. Formgrid creates the column headers automatically from your Webflow field names on the very first submission. The sheet should be empty when you connect it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 10: Share the Sheet With the Formgrid Service Account
&lt;/h3&gt;

&lt;p&gt;In your Google Sheet, click the &lt;strong&gt;Share&lt;/strong&gt; button in the top right corner. The share dialog will open.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffixdm1jea8hd1dqyg5uf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffixdm1jea8hd1dqyg5uf.png" alt=" " width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;You need to add the Formgrid service account email address as an editor. Go back to your Formgrid dashboard, where the service account email is displayed with a &lt;strong&gt;Copy&lt;/strong&gt; button next to it. Copy it directly from there to avoid any chance of a typing error.&lt;/p&gt;

&lt;p&gt;Paste the email into the share dialog and make sure you select &lt;strong&gt;Editor&lt;/strong&gt; access, not Viewer. Formgrid needs Editor access to write new rows to your sheet. If you add it as a Viewer, the connection will fail with a permissions error.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yzxxa7cumzx98wj2se7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yzxxa7cumzx98wj2se7.png" alt=" " width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Click &lt;strong&gt;Send&lt;/strong&gt; or &lt;strong&gt;Done&lt;/strong&gt; to confirm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 11: Paste Your Sheet URL Into Formgrid
&lt;/h3&gt;

&lt;p&gt;Go back to your Formgrid dashboard. Copy the full URL of your Google Sheet from the browser address bar of the tab where your sheet is open. The URL will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms/edit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the full URL into the sheet URL field in your Formgrid dashboard. Make sure you are copying from the address bar and that the URL contains the full spreadsheet ID, which is the long alphanumeric string between &lt;code&gt;/d/&lt;/code&gt; and &lt;code&gt;/edit&lt;/code&gt;.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzi667gap3edfb70kgv0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzi667gap3edfb70kgv0n.png" alt=" " width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 12: Choose Whether to Sync Existing Submissions
&lt;/h3&gt;

&lt;p&gt;Before connecting, you will see the following option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sync existing submissions to this sheet?

If you already have submissions, Formgrid can add them all to your
Google Sheets now, so your entire history is in one place.

[ ] Yes, sync my existing submissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg27q6kxhf77azmt4afmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg27q6kxhf77azmt4afmq.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you have been collecting Webflow form submissions through Formgrid for a while and want your full history in the sheet from day one, check this box. Formgrid will write all past submissions to the sheet before it begins syncing new ones.&lt;/p&gt;

&lt;p&gt;If you only want submissions going forward, leave it unchecked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 13: Click Connect
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;Connect Google Sheets&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;Formgrid will verify that it can access your sheet and that the service account has the correct permissions. If everything is in order, you will see a success confirmation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connected successfully

Your sheet is ready. Every new submission will appear as a new row automatically.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc5nz6i0wdp37jubpe15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc5nz6i0wdp37jubpe15.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;







&lt;h2&gt;
  
  
  Part Four: Verify the Full Flow Is Working
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 14: Submit Another Test Entry Through Your Webflow Form
&lt;/h3&gt;

&lt;p&gt;Visit your live Webflow site and submit another test entry through the form. Use realistic-looking data so it is easy to identify in your spreadsheet.&lt;/p&gt;

&lt;p&gt;Open your Google Sheet. Within a few seconds, you should see:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row 1:&lt;/strong&gt; Column headers created automatically from your Webflow field names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Row 2:&lt;/strong&gt; Your test submission data, with a timestamp in the final column showing exactly when the submission was received.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyjiich2rbyllql4nkd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyjiich2rbyllql4nkd5.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;From this point forward, every submission made through your Webflow form will appear as a new row in your Google Sheet in real time. You do not need to log into Formgrid, export anything, or take any manual action. The data moves automatically the moment someone fills in your form.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens on Every Submission
&lt;/h2&gt;

&lt;p&gt;Here is the complete flow from the moment a visitor fills in your Webflow form to the moment a row appears in your spreadsheet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Visitor fills in your Webflow form and clicks Submit
              ↓
The browser sends a POST request to your Formgrid endpoint
              ↓
Formgrid receives and saves the submission to your dashboard
              ↓
Email notification sent to you and any other configured recipients
              ↓
A new row added to your Google Sheet instantly
              ↓
Spam protection runs in the background to filter out bot submissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your submission is available in three places simultaneously: your Formgrid dashboard, your email inbox, and your Google Sheet. If any one of those ever has an issue, you still have the other two as a complete record.&lt;/p&gt;




&lt;h2&gt;
  
  
  Managing Your Google Sheets Connection
&lt;/h2&gt;

&lt;p&gt;Once connected, the Integrations tab in your Formgrid dashboard gives you full control over your Google Sheets connection:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pause the integration:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the Active toggle to pause syncing at any time. When paused, new submissions are still saved to your Formgrid dashboard, and email notifications still go out, but new rows are not written to your sheet. Toggle it back on to resume at any time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disconnect:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Removes the connection entirely. Your existing sheet data stays exactly as it is in Google Sheets. New submissions will not be synced until you reconnect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Sheet:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Takes you directly to your connected Google Sheet with a single click, without having to search for it in your Google Drive.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01x60hsdp0iviyxpo69z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01x60hsdp0iviyxpo69z.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;







&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Submissions not appearing in Formgrid after publishing Webflow:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Confirm that you published your Webflow site after changing the form action URL. Changes made in the Webflow Designer do not go live until you publish. Also, confirm that the action URL is your full Formgrid endpoint and that the method is set to POST.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Could not access this sheet" error when connecting:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means Formgrid does not have write access to your sheet. Open Google Sheets, click Share, and confirm that the Formgrid service account email is listed as an Editor. If it is listed as a Viewer, remove it and re-add it with Editor access, then try connecting again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column headers missing or showing unexpected values:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Column headers come from the name attribute of your Webflow form fields. If a column is missing, the corresponding field likely does not have a name attribute set. If a header looks incorrect, update the field name in your Webflow Designer, republish, and submit a new test entry. Note that existing headers in your sheet will not update automatically. You would need to clear the sheet and reconnect if you want the headers to reflect updated field names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Submissions appearing in Formgrid but not in Google Sheets:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open the Integrations tab in your Formgrid dashboard and check that the Google Sheets integration is showing as Active. If it shows as Paused, click the toggle to resume. If it shows as Active but submissions are still not appearing, try disconnecting and reconnecting the integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webflow's default success message is still showing, but no submission in Formgrid:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This usually means the form is still being handled by Webflow's own submission system rather than being sent to your Formgrid endpoint. Double-check that the Action URL in your Webflow form settings contains your Formgrid endpoint and that you did not accidentally revert it during a subsequent Webflow Designer session.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Formgrid Professional Plan Includes
&lt;/h2&gt;

&lt;p&gt;Google Sheets integration is available on the Professional plan at $16/month. The Professional plan at $16/month includes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Sheets native integration&lt;/strong&gt; (this guide)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Webhooks:&lt;/strong&gt; connect to Zapier, Make, Slack, Notion, Airtable and 5,000+ more&lt;br&gt;&lt;br&gt;
&lt;strong&gt;10,000 submissions per month&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Everything in the Premium plan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No contracts. Cancel at any time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Start your Professional plan at formgrid.dev&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Webflow makes it easy to build forms. Formgrid makes it easy to do something useful with what those forms collect.&lt;/p&gt;

&lt;p&gt;Connecting your Webflow form to Google Sheets through Formgrid requires one change in Webflow, one shared spreadsheet, and a few clicks in your Formgrid dashboard. Once it is set up, every submission lands in your spreadsheet automatically and in real time, without a Zapier subscription, without a Google Apps Script, and without any ongoing maintenance on your part.&lt;/p&gt;

&lt;p&gt;If your team is currently managing Webflow form submissions out of an email inbox, this setup will save you time from the first submission it processes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Get started at formgrid.dev&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Your Contact Form Is Getting Spam (And How to Stop It)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 27 Mar 2026 13:03:58 +0000</pubDate>
      <link>https://dev.to/allenarduino/why-your-contact-form-is-getting-spam-and-how-to-stop-it-1id3</link>
      <guid>https://dev.to/allenarduino/why-your-contact-form-is-getting-spam-and-how-to-stop-it-1id3</guid>
      <description>&lt;p&gt;You built a contact form, published it on your website, and started waiting for enquiries. Then one day, your inbox delivers something unexpected: a wall of foreign text, a string of suspicious links, and a name that does not match any real person you have ever heard of.&lt;/p&gt;

&lt;p&gt;This is contact form spam, and if you have a public-facing form on the internet, it is only a matter of time before it finds you.&lt;/p&gt;

&lt;p&gt;In this post, we will explain exactly what contact form spam is, how bots find your form in the first place, what the real-world consequences of ignoring it are, and most importantly, how to stop it completely using Formgrid's built-in security tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Contact Form Spam?
&lt;/h2&gt;

&lt;p&gt;Contact form spam is the practice of using automated software, commonly referred to as bots, to submit unsolicited and irrelevant content through web-based contact forms. Unlike email spam, which arrives directly in your inbox from an external mail server, contact form spam is generated by a bot that visits your website, locates your form, fills it out programmatically, and submits it just like a real user would.&lt;/p&gt;

&lt;p&gt;The content of these submissions varies widely. Some are promotional, some are gibberish, and some are loaded with links pointing to external websites. What they all have in common is that they are not genuine enquiries from real people. There is no human on the other end waiting for your reply.&lt;/p&gt;

&lt;p&gt;Here is a real example of a contact form spam submission received by a contact form:&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwmbbw6lazifg70zafbt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwmbbw6lazifg70zafbt.png" alt=" " width="800" height="439"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; DannyNef&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Email:&lt;/strong&gt; &lt;a href="mailto:guerfupe@mail.ru"&gt;guerfupe@mail.ru&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Message:&lt;/strong&gt; Автоматы газированной воды серии «АТЛАНТИКА» АП-60, АП-100 &lt;a href="https://vendavtomat.ru/" rel="noopener noreferrer"&gt;https://vendavtomat.ru/&lt;/a&gt;... Автоматы газированной воды «АТЛАНТИКА»: А-150 Эконом &lt;a href="https://vendavtomat.ru/" rel="noopener noreferrer"&gt;https://vendavtomat.ru/&lt;/a&gt;... Редуктор углекислотный &lt;a href="https://vendavtomat.ru/" rel="noopener noreferrer"&gt;https://vendavtomat.ru/&lt;/a&gt;...&lt;/p&gt;

&lt;p&gt;At first glance, this might look confusing or even alarming. But once you understand what is happening, it becomes much easier to deal with.&lt;/p&gt;

&lt;p&gt;Let us break it down:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The name "DannyNef"&lt;/strong&gt; is not a real person. It is a randomly generated or recycled name used by the bot to fill in the required name field. It bears no relation to the actual operator behind the spam campaign.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The email "&lt;a href="mailto:guerfupe@mail.ru"&gt;guerfupe@mail.ru&lt;/a&gt;"&lt;/strong&gt; is a throwaway address. The &lt;code&gt;.ru&lt;/code&gt; domain indicates it is a Russian email service, and the random string of characters before the &lt;code&gt;@&lt;/code&gt; symbol is a strong indicator that this address was generated automatically. No real business or individual would use an address like this for professional correspondence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The message itself&lt;/strong&gt; is a block of Russian promotional text interspersed with URLs pointing to a vending machine supplier website. The text talks about carbonated water machines, product dimensions, and the history of the company. None of it is directed at you or your business. It was not written for you. It was assembled by a bot and blasted across thousands of contact forms automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The phone number "88254351266"&lt;/strong&gt; follows a Russian phone number format and is almost certainly fake or belongs to an unrelated party.&lt;/p&gt;

&lt;p&gt;This type of submission is entirely harmless in terms of your website's security. The bot has not hacked you, stolen your data, or compromised your system in any way. But it is a sign that your form has no protection in place, and that will have consequences over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Do Bots Find Your Form in the First Place?
&lt;/h2&gt;

&lt;p&gt;This is one of the most common questions people ask when they receive their first spam submission. You may not have shared your form widely. Your website may be relatively new. So how did a bot find it?&lt;/p&gt;

&lt;p&gt;The answer is that bots do not need to be directed to your website specifically. They operate at scale across the entire internet, and they use several methods to discover unprotected forms automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search engine indexing:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Search engines like Google and Bing constantly crawl the web, following links from page to page and indexing content. When your website appears in search results, even for very obscure or low-traffic queries, it becomes discoverable. Bots can use the same public search infrastructure to find pages that contain contact forms, often by searching for common form-related HTML elements or keywords.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web crawling:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Many spam bots run their own crawlers that systematically visit websites and scan the page source code for form elements. They do not need to read your content or understand what your business does. They are simply looking for form fields and a submit button. Once found, the form is added to a queue and submitted automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link harvesting:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your website is linked to from another website, a directory, a social media profile, or any other publicly accessible page, a bot that crawls those sources can follow the link to your site and discover your form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data brokers and leaked lists:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Some spammers purchase or obtain lists of URLs known to contain contact forms. These lists are compiled over time and shared or sold within spam networks. Once your URL ends up on one of these lists, it can be repeatedly submitted to by multiple different bots.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Form endpoint scanning:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;More sophisticated bots do not even visit your website visually. They scan for exposed form submission endpoints directly and submit data to them programmatically, bypassing your frontend entirely. This is why domain restrictions, which we will cover later, are an important layer of protection.&lt;/p&gt;

&lt;p&gt;The key takeaway is that no website is too small, too new, or too obscure to be targeted. Bots are not selective. They are automated, indiscriminate, and operating at a scale that means your form will eventually be discovered, regardless of how little traffic your website receives.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens If You Ignore Contact Form Spam?
&lt;/h2&gt;

&lt;p&gt;Receiving one or two spam submissions a month might feel like a minor annoyance, and in isolation, it is. But ignoring contact form spam entirely and taking no steps to protect your forms can lead to a range of problems that compound over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inbox clutter and missed enquiries:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The most immediate consequence is practical. As spam volume increases, your inbox becomes harder to manage. Real enquiries from genuine customers or clients get buried among spam submissions. In a busy period, it is entirely possible to overlook a legitimate message because it was sandwiched between bot submissions. For a small business, a single missed enquiry could represent a lost client or a missed opportunity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wasted time:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even if you never miss a real message, reviewing and deleting spam submissions takes time. If you receive dozens per week, that time adds up. It is time that could be spent on actual work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skewed analytics and data:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you use your form submissions to inform decisions, for example, tracking how many enquiries you receive per week or what topics people are asking about, spam submissions will distort that data. Your numbers will be inflated with junk, making it harder to draw accurate conclusions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reputational risk from scraped email addresses:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a bot submits your form, it often also scrapes any publicly visible email addresses on the same page. If your contact email is visible on your website, it may be harvested and added to spam lists, leading to an increase in email spam in your inbox as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server load and rate abuse:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;High-volume bot attacks can submit your form hundreds or thousands of times in a short period. Depending on your hosting setup, this can put unnecessary load on your server, slow down your website, or, in extreme cases, trigger resource limits that affect your site's availability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data pollution in your CRM or connected tools:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your Formgrid forms are connected to a CRM, email marketing tool, or internal database via integrations or webhooks, spam submissions may be passed through to those systems as well. This can pollute your contact lists with fake entries, trigger automated email sequences to non-existent addresses, and harm your email sender reputation over time.&lt;/p&gt;

&lt;p&gt;None of these outcomes is inevitable if you act early. The good news is that Formgrid gives you everything you need to protect your forms before any of these problems take hold.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Protect Your Formgrid Forms: A Step-by-Step Guide
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt; includes a dedicated Security Settings section for every form, available on all plans, including the free plan. Enabling protection takes less than two minutes and requires no technical knowledge.&lt;/p&gt;

&lt;p&gt;Here is exactly how to do it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Log In to Your Formgrid Account
&lt;/h3&gt;

&lt;p&gt;Navigate to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt; and log in with your credentials. You will land on your dashboard, where all your forms are listed.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonb5a4z9577n038p01ya.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fonb5a4z9577n038p01ya.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 2: Open the Form You Want to Protect
&lt;/h3&gt;

&lt;p&gt;Click on the form you want to secure. This will take you to the &lt;strong&gt;Form Details&lt;/strong&gt; page, where you can manage everything related to that specific form.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjyrlhajkrrocccpy01u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frjyrlhajkrrocccpy01u.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 3: Navigate to the Settings Tab
&lt;/h3&gt;

&lt;p&gt;At the top of the Form Details page, you will see a row of tabs. Click on the &lt;strong&gt;Settings&lt;/strong&gt; tab to open the form's configuration options.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ty9ezbuknoot0k91as9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ty9ezbuknoot0k91as9.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Scroll Down to the Security Settings Section
&lt;/h3&gt;

&lt;p&gt;Within the Settings tab, scroll down until you reach the &lt;strong&gt;Security Settings&lt;/strong&gt; section. This is where all of Formgrid's spam and abuse protection tools are located.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foogg3jcahm0x0b57ypfd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foogg3jcahm0x0b57ypfd.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;You will see the following options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable CAPTCHA:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adds a Google reCAPTCHA "I'm not a robot" verification step to your form. When enabled, anyone submitting your form will need to complete the CAPTCHA challenge before their submission goes through. Real human users can do this easily. Automated bots typically cannot, which stops the majority of spam submissions before they ever reach your inbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable Honeypot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adds a hidden field to your form that is completely invisible to real users but visible to bots. When a bot fills in the form, it fills in every field it can detect, including the hidden honeypot field. Formgrid detects this and automatically discards the submission as spam. Legitimate users never see or interact with this field, so it has no impact on the experience of real visitors filling in your form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Allowed Domains (CORS):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Allows you to specify which domains are permitted to submit data to your form. If your form is embedded on a specific website, you can enter that domain here. Any submission coming from a different domain will be rejected. This is particularly effective against bots that submit directly to your form endpoint without visiting your website at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate Limiting:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sets a maximum number of submissions allowed per IP address per minute. This prevents any single source from flooding your form with repeated submissions in a short period. If you expect normal users to submit your form occasionally, a limit of 3 to 5 submissions per minute per IP is a reasonable starting point.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Enable Your Preferred Protections and Save
&lt;/h3&gt;

&lt;p&gt;Toggle on the settings you want to activate. For most public contact forms, enabling both &lt;strong&gt;CAPTCHA&lt;/strong&gt; and &lt;strong&gt;Honeypot&lt;/strong&gt; together provides strong protection against the vast majority of spam bots.&lt;/p&gt;

&lt;p&gt;Once you have made your selections, click &lt;strong&gt;Save&lt;/strong&gt; to apply the changes.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6ue3biuduntd30oas7p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff6ue3biuduntd30oas7p.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Your form is now protected.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which Security Settings Should You Use?
&lt;/h2&gt;

&lt;p&gt;You do not have to choose just one option. The settings are designed to work together, and combining them gives you layered protection that is significantly harder for bots to bypass.&lt;/p&gt;

&lt;p&gt;Here is a practical guide based on your situation:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a standard public contact form:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enable both CAPTCHA and Honeypot. This combination stops bots at two different points in the submission process and covers both sophisticated and unsophisticated bot behaviour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a high-traffic form receiving frequent spam:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Enable CAPTCHA, Honeypot, and Rate Limiting together. Set your rate limit conservatively. If a single user should never need to submit your form more than once or twice per minute, set the limit accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a form embedded on a single known website:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Add your domain to the Allowed Domains field in addition to enabling CAPTCHA and Honeypot. This prevents bots from submitting directly to your form endpoint, bypassing your website's frontend entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a form used internally or by a known audience:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your form is not intended for the general public, consider using Allowed Domains to whitelist only the specific domains that should have access. This adds a strong access control layer on top of the spam protection tools.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Summary of Security Best Practices
&lt;/h2&gt;

&lt;p&gt;Formgrid's Security Settings section reflects industry-standard guidance for protecting web forms. Here is a summary of the recommended approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable CAPTCHA for all public-facing forms:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Any form that can be accessed and submitted by anyone on the internet should have CAPTCHA enabled. This is the single most impactful step you can take to reduce spam volume immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set rate limits appropriate to your expected traffic:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about how often a real user would realistically need to submit your form. Set your rate limit to reflect that. A rate limit that is too high offers little protection; one that is too low may frustrate legitimate users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure CORS to restrict access to your domains:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you know exactly where your form will be used, lock it down to those domains. This eliminates an entire category of bot attacks that never even visit your website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the Honeypot as a passive, frictionless layer:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Unlike CAPTCHA, the Honeypot requires nothing from your users. It works silently in the background and catches bots that might find ways around other protections. There is no reason not to have it enabled at all times.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Contact form spam is a universal experience for anyone running a public-facing website. It is automated, indiscriminate, and growing in volume as bots become more sophisticated. But it is also entirely preventable with the right tools in place.&lt;/p&gt;

&lt;p&gt;Formgrid gives every user, including those on the free plan, access to a full suite of security settings designed specifically to address this problem. Enabling CAPTCHA and the Honeypot takes under two minutes and will stop the overwhelming majority of spam submissions before they ever reach your inbox.&lt;/p&gt;

&lt;p&gt;Do not wait until your inbox is overwhelmed to take action. Open your form settings today, enable your protections, and get back to focusing on the messages that actually matter.&lt;/p&gt;

&lt;p&gt;If you have any questions about configuring security settings on your Formgrid forms, the support team is always available to help.&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>security</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Connect Your HTML Form to Google Sheets Without a Backend</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 27 Mar 2026 02:59:08 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-connect-your-html-form-to-google-sheets-without-a-backend-31bo</link>
      <guid>https://dev.to/allenarduino/how-to-connect-your-html-form-to-google-sheets-without-a-backend-31bo</guid>
      <description>&lt;p&gt;Most tutorials for connecting an HTML form to Google Sheets send you down a complicated path.&lt;/p&gt;

&lt;p&gt;Set up a Google Apps Script. Deploy it as a web app. Handle CORS errors. Debug broken endpoints. Maintain a script you didn't write and don't fully understand. Then do it all again when something breaks after six months.&lt;/p&gt;

&lt;p&gt;For a developer who just wants form submissions in a spreadsheet, that process is a time sink with too many moving parts. And if you are not a developer at all, it is basically a wall.&lt;/p&gt;

&lt;p&gt;There is a simpler way.&lt;/p&gt;

&lt;p&gt;This guide shows you how to connect any HTML form to Google Sheets in under 3 minutes using Formgrid. No backend. No Google Apps Script. No CORS errors. No Zapier subscription. Just paste one endpoint URL into your form action and share a Google Sheet with one email address. That is the entire setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;This guide is for developers and builders who already have an HTML form and want submissions going straight to Google Sheets without writing any server-side code:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static site developers&lt;/strong&gt; running sites on GitHub Pages, Netlify, Vercel, Cloudflare Pages, or any static host who need a form backend without spinning up a server. Static sites cannot process forms on their own. You need somewhere to send the data. Formgrid is that somewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend developers&lt;/strong&gt; who built a contact form, inquiry form, job application form, or event registration form and want every submission organized in a spreadsheet automatically. You already wrote the HTML. You should not need to write a backend just to collect it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indie hackers and solopreneurs&lt;/strong&gt; who want a lightweight form setup without paying for Zapier on top of everything else. If you are running lean, adding a $20/month Zapier subscription just to move form data into a spreadsheet is a tax you should not have to pay.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No-code builders&lt;/strong&gt; who use HTML forms embedded in Webflow, Framer, Carrd, or similar tools and want data flowing into Google Sheets in real time. The form is already there. You just need the backend to catch it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HR teams and small business owners&lt;/strong&gt; who collect applications, inquiries, or registrations through a form on their website and want every entry in a shared spreadsheet their team can access without logging into a separate tool.&lt;/p&gt;

&lt;p&gt;If you have an HTML form and you want submissions in Google Sheets, this guide gets you there in one sitting.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Google Apps Script
&lt;/h2&gt;

&lt;p&gt;Before getting into the setup, it is worth understanding why the standard approach breaks down. Because you will find dozens of tutorials recommending Google Apps Script, and most of them skip over the parts that actually cause problems.&lt;/p&gt;

&lt;p&gt;The standard flow looks like this: write a doPost function in Apps Script, deploy it as a web app, copy the deployment URL, paste it into your form action, and hope it works. Then every time you make a change to the script, you redeploy and get a new URL. Then you update your form. Then you remember you also have to handle CORS because your HTML file is on a different origin than the Apps Script deployment. Then you spend an hour reading Stack Overflow threads from 2019.&lt;/p&gt;

&lt;p&gt;It works eventually. But it requires you to own a piece of infrastructure that is fragile, annoying to maintain, and breaks in ways that are hard to debug. If you are a developer building your own project, you might be fine with that. If you are setting this up for a client, a team, or a non-technical colleague who will need to manage it later, you are creating a maintenance burden for someone.&lt;/p&gt;

&lt;p&gt;The deeper issue is that Google Apps Script was not really designed for this use case. It is a general-purpose automation tool that happens to be able to do this. Formgrid is specifically built for it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Get With Formgrid
&lt;/h2&gt;

&lt;p&gt;Once your HTML form is connected to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt; and your Google Sheet is linked, here is what happens on every submission:&lt;/p&gt;

&lt;p&gt;Every entry from your HTML form appears as a new row in your spreadsheet automatically. No manual export. No logging into a dashboard every day. No copy and paste.&lt;/p&gt;

&lt;p&gt;Column headers are created automatically from your form field names on the very first submission. You do not need to set up the spreadsheet structure yourself. Name your input fields clearly, and Formgrid handles the rest.&lt;/p&gt;

&lt;p&gt;The integration works in real time. The moment someone submits your form, the row appears in Google Sheets within seconds. Not the next time a Zap runs. Not on a schedule. Instantly.&lt;/p&gt;

&lt;p&gt;You also get email notifications on every submission, so you are not dependent on checking Sheets. Spam protection is built in through honeypot fields and rate limiting, so fake submissions do not pollute your data. And every submission is saved to your Formgrid dashboard as a backup, so if anything ever goes wrong with your Sheet, you have a full record to fall back on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before You Start
&lt;/h2&gt;

&lt;p&gt;You will need three things:&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt; account, which is free to create at formgrid.dev. No credit card required to sign up.&lt;/p&gt;

&lt;p&gt;A Formgrid Professional plan for Google Sheets integration, which is $16/month. If you are on the Free or Premium plan, you will see a prompt to upgrade when you open the Integrations tab.&lt;/p&gt;

&lt;p&gt;An existing HTML form on your site, or a willingness to add a basic one. The only change you will make to your HTML is updating the action attribute on your form tag. Everything else stays exactly as it is.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part One: Point Your HTML Form at Formgrid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create a Form in Your Formgrid Dashboard
&lt;/h3&gt;

&lt;p&gt;Log in at &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; and create a new form. Give it a name that matches what you are collecting, for example, "Contact Form," "Job Applications," or "Event Registrations."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You do not need to use the Formgrid drag-and-drop form builder for this. You are building your own HTML form, and you are only creating a Formgrid form entry to generate your endpoint URL. Think of it as registering your form so Formgrid knows where to route the submissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Copy Your Endpoint URL
&lt;/h3&gt;

&lt;p&gt;Inside your form dashboard, copy your unique endpoint URL. It will look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://formgrid.dev/api/f/your-form-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This URL is permanent. It never changes when you update your form or your settings. You set it once and forget it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Update Your HTML Form
&lt;/h3&gt;

&lt;p&gt;Open your HTML file and change your form's action attribute to your Formgrid endpoint URL. Set the method to POST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://formgrid.dev/api/f/your-form-id"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Name"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Email"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the only change to your HTML. One attribute on one tag. Your form now sends submissions to Formgrid instead of disappearing into nothing.&lt;/p&gt;

&lt;p&gt;One important detail: Formgrid reads the name attribute of each input field and uses those values as the column headers in your Google Sheet. If your input has name="email", then the column in your Sheet will be labelled "email." If it has name="company_name" the column will be "company_name." Make sure every field in your form has a clear, descriptive name attribute before you connect your Sheet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Test That Submissions Are Reaching Formgrid
&lt;/h3&gt;

&lt;p&gt;Before connecting Google Sheets, do a quick sanity check. Submit a test entry through your form and log into your Formgrid dashboard. You should see the submission appear in your form's submissions list.&lt;/p&gt;

&lt;p&gt;If it is not showing up, open your browser developer tools, go to the Network tab, submit the form again, and look for the POST request to formgrid.dev. Check the response status. A 200 means it worked. Anything else means there is a configuration issue to sort out before moving on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part Two: Connect Google Sheets
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 5: Open the Integrations Tab
&lt;/h3&gt;

&lt;p&gt;In your Formgrid dashboard, click on your form and open the Integrations tab at the top of the page. You will see the Google Sheets integration section. If you are on the Professional plan, the connect interface is ready to use immediately.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjahaq8wafbid88ifv1e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjahaq8wafbid88ifv1e1.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg92n733ozbxl0mbop3f8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg92n733ozbxl0mbop3f8.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Create a Blank Google Sheet
&lt;/h3&gt;

&lt;p&gt;Click the Create blank Google Sheet button. This opens a fresh blank spreadsheet in Google Sheets in a new tab.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4c2cwasp562gnxx3pfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4c2cwasp562gnxx3pfn.png" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your sheet a name that is easy to identify later. Something like "Contact Form Submissions 2026" or "Job Applications: Marketing Role" works well. If you manage multiple forms, a consistent naming convention will save you confusion later.&lt;/p&gt;

&lt;p&gt;You do not need to create any columns, add any headers, or set up any structure at all. Formgrid creates the column headers automatically from your form field names on the very first submission. The spreadsheet should be empty when you connect it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 7: Share the Sheet With Formgrid
&lt;/h3&gt;

&lt;p&gt;In your Google Sheet click the Share button in the top right corner of the page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffixdm1jea8hd1dqyg5uf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffixdm1jea8hd1dqyg5uf.png" alt=" " width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the share dialog, add this email address as an Editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;formgrid@sheetrocket.iam.gserviceaccount.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the Formgrid service account email. Rather than typing it out manually, go back to your Formgrid dashboard where the service account email is displayed with a Copy button next to it. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30zmk3eerzw4ficvr223.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30zmk3eerzw4ficvr223.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy it there and paste it directly into the Google Sheets share dialog. It avoids any chance of a typo.&lt;/p&gt;

&lt;p&gt;One thing to get right here: make sure you select Editor access, not Viewer. Formgrid needs Editor access to write new rows to your sheet. If you accidentally add it as a Viewer, the connection will fail with a permissions error when it tries to write.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yzxxa7cumzx98wj2se7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yzxxa7cumzx98wj2se7.png" alt=" " width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Send or Done in the share dialog to confirm.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: Paste Your Sheet URL Into Formgrid
&lt;/h3&gt;

&lt;p&gt;Go back to your browser tab with Formgrid open. Copy the URL of your Google Sheet from the address bar of the tab where your Sheet is open.&lt;/p&gt;

&lt;p&gt;The URL will look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms/edit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the full URL into the sheet URL field in your Formgrid dashboard. Make sure you are copying from the address bar and not from somewhere else. The URL needs to contain the full spreadsheet ID, which is the long string of characters between /d/ and /edit.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzi667gap3edfb70kgv0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzi667gap3edfb70kgv0n.png" alt=" " width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 9: Choose Whether to Sync Existing Submissions
&lt;/h3&gt;

&lt;p&gt;Before clicking Connect, you will see this option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sync existing submissions to this sheet?

If you already have submissions, Formgrid can add them all to your
Google Sheets now, so your entire history is in one place.

[ ] Yes, sync my existing submissions

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg27q6kxhf77azmt4afmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg27q6kxhf77azmt4afmq.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have been collecting submissions for a while and want your full history to appear in the Sheet immediately, check this box. Formgrid will write all past submissions to the sheet in chronological order before it starts adding new ones. Your entire submission history will be there from the moment you connect.&lt;/p&gt;

&lt;p&gt;If you only want new submissions going forward and you do not need historical data in the Sheet, leave it unchecked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 10: Click Connect
&lt;/h3&gt;

&lt;p&gt;Click the Connect Google Sheets button.&lt;/p&gt;

&lt;p&gt;Formgrid will verify it can access your sheet, confirm the service account has the right permissions, and save the connection. If you selected the sync option, it will also write your existing submissions to the sheet now.&lt;/p&gt;

&lt;p&gt;If everything is set up correctly you will see a success message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connected successfully

Your sheet is ready. Every new submission will appear as a new row automatically.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc5nz6i0wdp37jubpe15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc5nz6i0wdp37jubpe15.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Part Three: Verify It Is Working
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 11: Submit a Test Entry Through Your HTML Form
&lt;/h3&gt;

&lt;p&gt;Go to your actual HTML form on your site and submit a test entry with dummy data. Use a realistic-looking name and email so it is easy to spot in the Sheet.&lt;/p&gt;

&lt;p&gt;Open your Google Sheet. Within a few seconds, you should see:&lt;/p&gt;

&lt;p&gt;Row 1 contains the column headers created automatically from your form field names. These come directly from the name attributes you set on your HTML inputs.&lt;/p&gt;

&lt;p&gt;Row 2 contains your test submission data. The last column will contain a timestamp showing exactly when the submission was received.&lt;/p&gt;

&lt;p&gt;Every subsequent submission from your HTML form will appear as a new row below this one in real time. You never need to log into Formgrid or export anything. The data goes straight to Google Sheets the moment someone fills out your form.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgtkew3kl4ugpaisqafq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgtkew3kl4ugpaisqafq.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyjiich2rbyllql4nkd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyjiich2rbyllql4nkd5.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens on Every Submission
&lt;/h2&gt;

&lt;p&gt;Here is the full flow from form fill to spreadsheet row:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Visitor fills out your HTML form on your site
              ↓
The browser sends a POST request to your Formgrid endpoint
              ↓
Formgrid receives the submission and saves it to your dashboard
              ↓
Email notification sent to you (and any other recipients you configured)
              ↓
New row added to your Google Sheet instantly
              ↓
Spam protection runs in the background to filter out fake submissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get the submission in three places simultaneously: your email inbox, your Formgrid dashboard, and your Google Sheet. If any one of those ever has an issue, you still have the other two.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real World Example: Event Registrations for a 200-Person Ride
&lt;/h2&gt;

&lt;p&gt;Annie manages endurance horse riding events in San Diego. Her team collects registrations through a form on their website. Before Formgrid, every registration arrived as an email with all the details dumped in one long, unformatted block. Rider name, horse details, session selection, and payment status are all mixed with no labels and no structure. Her event manager had to manually scan through every single registration to pull out the information she needed. For a 200-person event, that was hours of unnecessary work before the event even started.&lt;/p&gt;

&lt;p&gt;She now uses Formgrid with Google Sheets connected to her registration form. Every new registration appears instantly as a new row in a shared Google Sheet that her entire team can see in real time. Rider name in one column, horse details in the next, session selection after that, payment status at the end. Organized. Automatic. No manual work.&lt;/p&gt;

&lt;p&gt;Her event manager can sort by session, filter by payment status, and share the sheet with volunteers on the day of the event. All from a Google Sheet that fills itself.&lt;/p&gt;

&lt;p&gt;She is on the Professional plan at $16/month.&lt;/p&gt;

&lt;p&gt;"The level of personal support was impressive."&lt;br&gt;
&lt;strong&gt;Annie Libby, Event Manager, San Diego Endurance Riders&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Managing Your Connection
&lt;/h2&gt;

&lt;p&gt;Once connected, the Integrations tab in your Formgrid dashboard shows your current connection status and gives you a few controls:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pause the integration&lt;/strong&gt; using the Active toggle. When paused, new submissions are still saved to your Formgrid dashboard, and you still receive email notifications, but they are not sent to Google Sheets. Toggle it back on to resume syncing at any time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disconnect&lt;/strong&gt; removes the connection entirely. Your existing sheet data stays in Google Sheets exactly as it is. New submissions will no longer be synced until you reconnect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Sheet&lt;/strong&gt; takes you directly to your connected Google Sheet with one click, so you do not have to go hunting for it in your Drive.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01x60hsdp0iviyxpo69z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01x60hsdp0iviyxpo69z.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Compares to Google Apps Script
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Google Apps Script&lt;/th&gt;
&lt;th&gt;Formgrid Native&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;30 to 60 minutes&lt;/td&gt;
&lt;td&gt;Under 3 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;You own the script&lt;/td&gt;
&lt;td&gt;Zero maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CORS handling&lt;/td&gt;
&lt;td&gt;Manual, error-prone&lt;/td&gt;
&lt;td&gt;Built in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Endpoint stability&lt;/td&gt;
&lt;td&gt;New URL on every redeploy&lt;/td&gt;
&lt;td&gt;Never changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;None built in&lt;/td&gt;
&lt;td&gt;Honeypot + rate limiting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email notifications&lt;/td&gt;
&lt;td&gt;Requires extra setup&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical data sync&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;One checkbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Support&lt;/td&gt;
&lt;td&gt;Stack Overflow&lt;/td&gt;
&lt;td&gt;Direct access to the founder&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How This Compares to Using Zapier
&lt;/h2&gt;

&lt;p&gt;A common alternative is to use a form backend to collect submissions and then use a Zapier Zap to push them into Google Sheets. It works, but you are paying for two services instead of one and adding a delay between submission and Sheet row because Zapier runs on a schedule rather than in real time.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Zapier Route&lt;/th&gt;
&lt;th&gt;Formgrid Native&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Extra monthly cost&lt;/td&gt;
&lt;td&gt;$19.99/month for Zapier&lt;/td&gt;
&lt;td&gt;Included in $29/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup steps&lt;/td&gt;
&lt;td&gt;6 to 8 steps across two tools&lt;/td&gt;
&lt;td&gt;3 steps in one place&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real time sync&lt;/td&gt;
&lt;td&gt;Depends on Zap frequency&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure points&lt;/td&gt;
&lt;td&gt;Two services that can break&lt;/td&gt;
&lt;td&gt;One&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Form submissions not appearing in Formgrid at all&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check that your form action URL is pointing to your Formgrid endpoint and that the method attribute on your form tag is set to POST, not GET. Open your browser developer tools, go to the Network tab, submit the form, and look for the POST request to formgrid.dev. A 200 response means the submission was received. Any other status code means something is misconfigured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Could not access this sheet" error on connect&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means Formgrid cannot write to your sheet. Go back to Google Sheets, click Share, and confirm that the Formgrid service account email is added as an Editor, not a Viewer. If you added it as a Viewer, remove it and re-add it with Editor access, then try connecting again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Column headers not appearing or appearing incorrectly&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Column headers come from the name attribute of your HTML input fields. If a column is missing, check that the corresponding input has a name attribute set. Fields without a name attribute are not included in the submission. If a header looks wrong, update the name value on that input and resubmit a test entry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Submissions appearing in Formgrid but not in Google Sheets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check that the Google Sheets integration is showing as Active in your Integrations tab. If it shows as Paused, click the toggle to resume. If it shows as Active but submissions are still not appearing, disconnect and reconnect the integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Invalid Google Sheets URL error&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make sure you copied the full URL from your browser address bar, not just the spreadsheet title or a partial URL. The URL must contain /spreadsheets/d/ followed by a long alphanumeric string. Always copy from the address bar of the tab where your Sheet is open.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Formgrid Professional Plan Includes
&lt;/h2&gt;

&lt;p&gt;Google Sheets integration is available on the Professional plan at $16/month. The Professional plan at $16/month includes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Sheets native integration&lt;/strong&gt; (this guide)&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Webhooks:&lt;/strong&gt; connect to Zapier, Make, Slack, Notion, Airtable and 5,000+ more&lt;br&gt;&lt;br&gt;
&lt;strong&gt;10,000 submissions per month&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Everything in the Premium plan&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No contracts. Cancel anytime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Start your Professional plan at formgrid.dev&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Connecting an HTML form to Google Sheets does not require a backend, a Google Apps Script, a Zapier subscription, or an afternoon of debugging CORS errors.&lt;/p&gt;

&lt;p&gt;Update one attribute in your form tag. Share a Google Sheet with one email address. Click connect.&lt;/p&gt;

&lt;p&gt;Every submission lands in your spreadsheet automatically, in real time, from that moment forward.&lt;/p&gt;

&lt;p&gt;That is what Formgrid delivers.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Try Formgrid free at formgrid.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>html</category>
      <category>tooling</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Send Form Submissions to Google Sheets Automatically (No Zapier Required)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Thu, 26 Mar 2026 17:10:22 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-send-form-submissions-to-google-sheets-automatically-no-zapier-required-7o2</link>
      <guid>https://dev.to/allenarduino/how-to-send-form-submissions-to-google-sheets-automatically-no-zapier-required-7o2</guid>
      <description>&lt;p&gt;Most form tools make this harder than it needs to be.&lt;/p&gt;

&lt;p&gt;Formspree charges $90/month for Google Sheets integration. Other tools send you to the Google Cloud Console to set up OAuth &lt;br&gt;
credentials, create a project, enable APIs, &lt;br&gt;
and configure consent screens.&lt;/p&gt;

&lt;p&gt;For a non-technical user who just wants their form submissions in a spreadsheet, that process is a nightmare.&lt;/p&gt;

&lt;p&gt;Formgrid does it differently.&lt;/p&gt;

&lt;p&gt;No Zapier. No Google Cloud Console. &lt;br&gt;
No OAuth setup. Just share a Google Sheet with one email address and paste the URL. Every new submission appears as a new row &lt;br&gt;
automatically.&lt;/p&gt;

&lt;p&gt;This guide shows you exactly how to set &lt;br&gt;
it up in under 3 minutes.&lt;/p&gt;


&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;This guide is for anyone who collects &lt;br&gt;
form submissions and wants them organized &lt;br&gt;
in a Google Sheet automatically:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event organizers&lt;/strong&gt; collecting registrations &lt;br&gt;
for workshops, rides, conferences, or community events who need submissions in a spreadsheet for their team to review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small business owners&lt;/strong&gt; collecting client &lt;br&gt;
inquiries, booking requests, or service &lt;br&gt;
applications that manage everything in Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HR teams and hiring managers&lt;/strong&gt; are collecting &lt;br&gt;
job applications and want every submission in a shared spreadsheet for the team to review together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Course creators and coaches&lt;/strong&gt; collecting student inquiries or enrollment requests who track leads in Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nonprofits&lt;/strong&gt; collecting volunteer applications, membership forms, or donation inquiries who need a simple, organized record of every submission.&lt;/p&gt;

&lt;p&gt;If you collect forms and live in Google &lt;br&gt;
Sheets, this integration was built for you.&lt;/p&gt;


&lt;h2&gt;
  
  
  What You Get
&lt;/h2&gt;

&lt;p&gt;When Google Sheets is connected to your &lt;br&gt;
Formgrid form:&lt;/p&gt;

&lt;p&gt;Every new submission appears as a new row in your spreadsheet automatically. &lt;br&gt;
No manual export. No copy and paste. &lt;br&gt;
No checking a dashboard every day.&lt;/p&gt;

&lt;p&gt;Column headers are created automatically from your form field names on the first submission. You do not need to set up &lt;br&gt;
the spreadsheet yourself.&lt;/p&gt;

&lt;p&gt;Existing submissions can be synced to your sheet on connection, so your entire submission history appears immediately.&lt;/p&gt;

&lt;p&gt;The integration works in real time. The moment someone submits your form the row appears in Google Sheets.&lt;/p&gt;


&lt;h2&gt;
  
  
  Before You Start
&lt;/h2&gt;

&lt;p&gt;Google Sheets integration is available &lt;br&gt;
on the &lt;strong&gt;Formgrid Business plan&lt;/strong&gt; at &lt;br&gt;
$29/month.&lt;/p&gt;

&lt;p&gt;If you are on the Free or Premium plan you will see a prompt to upgrade when you open the Integrations tab.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step by Step: Connect Google Sheets
&lt;/h2&gt;
&lt;h2&gt;
  
  
  to Your Form
&lt;/h2&gt;


&lt;h3&gt;
  
  
  Step 1: Open Your Form and Go to
&lt;/h3&gt;
&lt;h3&gt;
  
  
  the Integrations Tab
&lt;/h3&gt;

&lt;p&gt;Log in to your Formgrid dashboard at &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click on the form you want to connect &lt;br&gt;
to Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjahaq8wafbid88ifv1e1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjahaq8wafbid88ifv1e1.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the &lt;strong&gt;Integrations&lt;/strong&gt; tab at the &lt;br&gt;
top of your form page.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg92n733ozbxl0mbop3f8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg92n733ozbxl0mbop3f8.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see the Google Sheets integration section. If you are on the Business plan the connect interface is ready to use.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Create a Blank Google Sheet
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;Create blank Google Sheet&lt;/strong&gt; &lt;br&gt;
button. This opens Google Sheets in a &lt;br&gt;
new tab with a fresh blank spreadsheet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4c2cwasp562gnxx3pfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4c2cwasp562gnxx3pfn.png" alt=" " width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your sheet a name that makes it easy to identify. Something like &lt;br&gt;
"Formgrid: Contact Form Submissions" &lt;br&gt;
or "Event Registrations 2026."&lt;/p&gt;

&lt;p&gt;You do not need to create any columns or set up any structure. Formgrid will create the column headers automatically &lt;br&gt;
from your form fields on the first &lt;br&gt;
submission.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 3: Share the Sheet with Formgrid
&lt;/h3&gt;

&lt;p&gt;In your Google Sheet click the &lt;strong&gt;Share&lt;/strong&gt; &lt;br&gt;
button in the top right corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffixdm1jea8hd1dqyg5uf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffixdm1jea8hd1dqyg5uf.png" alt=" " width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Share dialog add this email &lt;br&gt;
address as an &lt;strong&gt;Editor:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;formgrid@sheetrocket.iam.gserviceaccount.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Back in your Formgrid dashboard the &lt;br&gt;
service account email is shown with a &lt;br&gt;
&lt;strong&gt;Copy&lt;/strong&gt; button so you can copy it &lt;br&gt;
with one click and paste it directly &lt;br&gt;
into Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30zmk3eerzw4ficvr223.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F30zmk3eerzw4ficvr223.png" alt=" " width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make sure you select &lt;strong&gt;Editor&lt;/strong&gt;, not Viewer. Formgrid needs an Editor &lt;br&gt;
access to write new rows to your sheet.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Send&lt;/strong&gt; or &lt;strong&gt;Done&lt;/strong&gt; in the &lt;br&gt;
Google Sheets share dialog.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yzxxa7cumzx98wj2se7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yzxxa7cumzx98wj2se7.png" alt=" " width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 4: Paste Your Sheet URL
&lt;/h3&gt;
&lt;h3&gt;
  
  
  into Formgrid
&lt;/h3&gt;

&lt;p&gt;Go back to your Formgrid dashboard. &lt;br&gt;
Copy the URL of your Google Sheet from your browser address bar.&lt;/p&gt;

&lt;p&gt;It will look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://docs.google.com/spreadsheets/d/
1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms/edit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the full URL into the sheet &lt;br&gt;
URL field in Formgrid.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzi667gap3edfb70kgv0n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzi667gap3edfb70kgv0n.png" alt=" " width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 5: Choose Whether to Sync
&lt;/h3&gt;
&lt;h3&gt;
  
  
  Existing Submissions
&lt;/h3&gt;

&lt;p&gt;Before clicking Connect you will see &lt;br&gt;
this option:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sync existing submissions to this sheet?

If you already have submissions, Formgrid can add them all to your 
Google Sheet now so your entire 
history is in one place.

[ ] Yes, sync my existing submissions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Check this box&lt;/strong&gt; if you want your &lt;br&gt;
existing submission history to appear in the sheet immediately after connecting. &lt;br&gt;
Formgrid will write all past submissions to the sheet in chronological order &lt;br&gt;
before adding new ones.&lt;/p&gt;

&lt;p&gt;Leave it unchecked if you only want &lt;br&gt;
new submissions going forward.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg27q6kxhf77azmt4afmq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg27q6kxhf77azmt4afmq.png" alt=" " width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 6: Click Connect
&lt;/h3&gt;

&lt;p&gt;Click the &lt;strong&gt;Connect Google Sheets&lt;/strong&gt; &lt;br&gt;
button.&lt;/p&gt;

&lt;p&gt;Formgrid will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Verify it can access your sheet&lt;/li&gt;
&lt;li&gt;Confirm the service account 
has Editor access&lt;/li&gt;
&lt;li&gt;Save the connection&lt;/li&gt;
&lt;li&gt;Sync existing submissions 
if you selected that option&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If everything is set up correctly &lt;br&gt;
you will see this success message:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connected successfully

Your sheet is ready. Every new 
submission will appear as a new row 
automatically.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc5nz6i0wdp37jubpe15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc5nz6i0wdp37jubpe15.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 7: Submit a Test Entry
&lt;/h3&gt;

&lt;p&gt;Go to your form and submit a test &lt;br&gt;
entry with dummy data.&lt;/p&gt;

&lt;p&gt;Open your Google Sheet. Within seconds &lt;br&gt;
you will see:&lt;/p&gt;

&lt;p&gt;Row 1 contains the column headers &lt;br&gt;
created automatically from your form &lt;br&gt;
field names.&lt;/p&gt;

&lt;p&gt;Row 2 contains the test submission &lt;br&gt;
data with a timestamp in the last column.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgtkew3kl4ugpaisqafq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmgtkew3kl4ugpaisqafq.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyjiich2rbyllql4nkd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnyjiich2rbyllql4nkd5.png" alt=" " width="800" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every subsequent submission will &lt;br&gt;
appear as a new row below this one &lt;br&gt;
automatically. You never need to &lt;br&gt;
log in to Formgrid to get your data. &lt;br&gt;
It goes straight to Google Sheets.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Happens For Every New Submission
&lt;/h2&gt;

&lt;p&gt;When someone fills out your form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Visitor fills out your form
          ↓
Formgrid receives the submission
          ↓
Submission saved to Formgrid dashboard
          ↓
Email notification sent to you
          ↓
New row added to your Google Sheet
          ↓
All of this happens in seconds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get the submission in three places &lt;br&gt;
simultaneously: your email inbox, your &lt;br&gt;
Formgrid dashboard, and your Google Sheet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Managing Your Connection
&lt;/h2&gt;

&lt;p&gt;Once connected the Integrations tab &lt;br&gt;
shows your connection status:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01x60hsdp0iviyxpo69z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01x60hsdp0iviyxpo69z.png" alt=" " width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pause the integration&lt;/strong&gt; using the &lt;br&gt;
Active toggle. When paused new &lt;br&gt;
submissions are saved to Formgrid &lt;br&gt;
but not sent to Google Sheets. &lt;br&gt;
Toggle it back on to resume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disconnect&lt;/strong&gt; removes the connection &lt;br&gt;
entirely. Your existing sheet data &lt;br&gt;
stays in Google Sheets but new &lt;br&gt;
submissions will no longer be synced.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Sheet&lt;/strong&gt; takes you directly to &lt;br&gt;
your Google Sheet with one click.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;"Could not access this sheet"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This means Formgrid does not have &lt;br&gt;
Editor access to your sheet. Go back &lt;br&gt;
to Google Sheets, click Share, and &lt;br&gt;
make sure the Formgrid service account &lt;br&gt;
email is added as an Editor not a Viewer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Invalid Google Sheets URL"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Make sure you copied the full URL &lt;br&gt;
from your browser address bar &lt;br&gt;
including the spreadsheet ID. &lt;br&gt;
The URL should contain &lt;br&gt;
&lt;code&gt;/spreadsheets/d/&lt;/code&gt; followed by &lt;br&gt;
a long string of characters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Submissions not appearing in sheet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Check that the integration is Active &lt;br&gt;
in your Integrations tab. If it shows &lt;br&gt;
Paused click the toggle to resume.&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Compares to Zapier
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Zapier Route&lt;/th&gt;
&lt;th&gt;Formgrid Native&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;20 to 40 minutes&lt;/td&gt;
&lt;td&gt;Under 3 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Extra cost&lt;/td&gt;
&lt;td&gt;$19.99/month for Zapier&lt;/td&gt;
&lt;td&gt;Included in $29/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Steps required&lt;/td&gt;
&lt;td&gt;6 to 8 steps&lt;/td&gt;
&lt;td&gt;3 steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real time&lt;/td&gt;
&lt;td&gt;Depends on Zap frequency&lt;/td&gt;
&lt;td&gt;Instant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Technical knowledge&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  How This Compares to Formspree
&lt;/h2&gt;

&lt;p&gt;Formspree charges $90/month for &lt;br&gt;
Google Sheets integration as part &lt;br&gt;
of their Business plan.&lt;/p&gt;

&lt;p&gt;Formgrid includes Google Sheets &lt;br&gt;
integration in the Business plan &lt;br&gt;
at $29/month. Along with:&lt;/p&gt;

&lt;p&gt;Custom HTML email templates&lt;br&gt;
Auto-responder emails to submitters&lt;br&gt;
Webhooks for connecting to 5,000+ tools&lt;br&gt;
Multiple notification recipients&lt;br&gt;
15,000 submissions per month&lt;br&gt;
Priority support&lt;/p&gt;

&lt;p&gt;The same feature. A third of the price.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Formgrid Business Plan Includes
&lt;/h2&gt;

&lt;p&gt;At $29/month the Business plan gives you:&lt;/p&gt;

&lt;p&gt;Google Sheets native integration (this guide)&lt;br&gt;
Custom HTML email templates&lt;br&gt;
Auto-responder emails to form submitters&lt;br&gt;
Webhooks: connect to Zapier, Make, &lt;br&gt;
Slack, Notion, Airtable and 5,000+ more&lt;br&gt;
Multiple email notification recipients&lt;br&gt;
Custom email subject lines&lt;br&gt;
15,000 submissions per month&lt;br&gt;
Priority support: direct access to &lt;br&gt;
the founder&lt;/p&gt;

&lt;p&gt;No contracts. Cancel anytime.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Start your Business plan at formgrid.dev&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Real World Example
&lt;/h2&gt;

&lt;p&gt;Annie manages endurance horse riding &lt;br&gt;
events in San Diego.&lt;/p&gt;

&lt;p&gt;Every time someone registered for her &lt;br&gt;
ride she received an email with all &lt;br&gt;
the registration details in one long &lt;br&gt;
unformatted block. No labels. &lt;br&gt;
No sections. No structure.&lt;/p&gt;

&lt;p&gt;Her event manager had to manually &lt;br&gt;
scan through every registration to &lt;br&gt;
find the information she needed. &lt;br&gt;
For a 200 person event that was &lt;br&gt;
hours of unnecessary work.&lt;/p&gt;

&lt;p&gt;She now uses Formgrid with Google &lt;br&gt;
Sheets connected. Every registration &lt;br&gt;
appears instantly in a shared Google &lt;br&gt;
Sheet her entire team can see. &lt;br&gt;
Rider name, horse details, session &lt;br&gt;
selection, payment status. All &lt;br&gt;
organized. All automatic.&lt;/p&gt;

&lt;p&gt;She is on the Business plan at &lt;br&gt;
$29/month and has not looked back.&lt;/p&gt;

&lt;p&gt;"The level of personal support &lt;br&gt;
was impressive."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Annie Libby&lt;/strong&gt;&lt;br&gt;
Event Manager, San Diego Endurance Riders&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Google Sheets integration should not &lt;br&gt;
cost $90/month or require 40 minutes &lt;br&gt;
of technical setup. It should just work.&lt;/p&gt;

&lt;p&gt;Three steps. Under 3 minutes. &lt;br&gt;
Every submission in your spreadsheet &lt;br&gt;
automatically.&lt;/p&gt;

&lt;p&gt;That is what Formgrid delivers.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Try Formgrid free at formgrid.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upgrade to Business when you are &lt;br&gt;
ready for Google Sheets integration.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. &lt;br&gt;
Written as honestly as I could. &lt;br&gt;
Let me know in the comments if &lt;br&gt;
anything looks off.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #webdev #nocode #googlesheets &lt;/p&gt;

&lt;h1&gt;
  
  
  tutorial #productivity #smallbusiness
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>automation</category>
      <category>google</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Remove Form Builder Branding Without Paying $59/Month</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sat, 21 Mar 2026 01:09:26 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-remove-form-builder-branding-without-paying-59month-2e69</link>
      <guid>https://dev.to/allenarduino/how-to-remove-form-builder-branding-without-paying-59month-2e69</guid>
      <description>&lt;p&gt;If you've ever shared a form with a client or &lt;br&gt;
customer and noticed a &lt;strong&gt;"Powered by Typeform"&lt;/strong&gt; or &lt;strong&gt;"Made with Jotform"&lt;/strong&gt; badge sitting at the bottom, &lt;br&gt;
You already know how unprofessional it looks.&lt;/p&gt;

&lt;p&gt;You built the form. You collected the responses. &lt;br&gt;
But someone else's logo is stamped all over your &lt;br&gt;
work.&lt;/p&gt;

&lt;p&gt;And when you go to remove it? Most form builders &lt;br&gt;
want $29, $49, or even $59 per month just to take their branding off your form.&lt;/p&gt;

&lt;p&gt;This guide shows you how to get a completely branded, watermark-free form for a fraction of that price.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Form Builders Put Their Branding on Your Forms
&lt;/h2&gt;

&lt;p&gt;It's a deliberate freemium strategy. The free plan &lt;br&gt;
turns your form into a billboard for their product. &lt;br&gt;
Every person who fills out your form sees their &lt;br&gt;
brand. Every client you share a form with becomes &lt;br&gt;
a potential new user for them.&lt;/p&gt;

&lt;p&gt;You're doing their marketing for free.&lt;/p&gt;

&lt;p&gt;Here's what the major players charge to remove it:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Form Builder&lt;/th&gt;
&lt;th&gt;Branding Removal Plan&lt;/th&gt;
&lt;th&gt;Monthly Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Typeform&lt;/td&gt;
&lt;td&gt;Plus plan&lt;/td&gt;
&lt;td&gt;$59/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jotform&lt;/td&gt;
&lt;td&gt;Bronze plan&lt;/td&gt;
&lt;td&gt;$34/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tally&lt;/td&gt;
&lt;td&gt;Pro plan&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formgrid&lt;/td&gt;
&lt;td&gt;Premium plan&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Typeform charges $59/month. Per month. Just to &lt;br&gt;
remove their logo from your form.&lt;/p&gt;

&lt;p&gt;For a freelancer, small business owner, or event &lt;br&gt;
organizer collecting a few hundred responses &lt;br&gt;
per month, that's completely unjustifiable.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Real Cost of Keeping the Branding
&lt;/h2&gt;

&lt;p&gt;You might think, "It's just a small logo, who &lt;br&gt;
cares?" But consider these situations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sending a client intake form&lt;/strong&gt;&lt;br&gt;
You're a freelancer or agency. You send a &lt;br&gt;
beautiful intake form to a new client. At &lt;br&gt;
the bottom, it says "Powered by Typeform." &lt;br&gt;
Your client sees you're using a free tool. &lt;br&gt;
It undermines the professional impression &lt;br&gt;
you're trying to make.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Running an event registration&lt;/strong&gt;&lt;br&gt;
You're collecting registrations for a &lt;br&gt;
corporate event or workshop. Attendees &lt;br&gt;
fill out the form and see a third-party &lt;br&gt;
brand prominently displayed. It looks &lt;br&gt;
unpolished and raises questions about &lt;br&gt;
your organization.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sharing on social media or WhatsApp&lt;/strong&gt;&lt;br&gt;
You share a form link in a WhatsApp group &lt;br&gt;
or Instagram bio. People open it and &lt;br&gt;
immediately see someone else's branding. &lt;br&gt;
It looks like you didn't build it yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collecting job applications&lt;/strong&gt;&lt;br&gt;
Candidates fill out the application form. &lt;br&gt;
They see "Made with Jotform" at the bottom. &lt;br&gt;
It signals that you haven't invested in &lt;br&gt;
your own tools. Not the impression you &lt;br&gt;
want to make as an employer.&lt;/p&gt;

&lt;p&gt;In all these cases, the branding creates &lt;br&gt;
unnecessary friction and doubt. Removing &lt;br&gt;
it is not vanity. It's professionalism.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Get a Watermark-Free Form for $8/Month
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt; is an open-source &lt;br&gt;
form builder and form backend that removes all &lt;br&gt;
branding on the Premium plan at just $8/month.&lt;/p&gt;

&lt;p&gt;No "Powered by Formgrid" on your forms. No &lt;br&gt;
watermarks. No third-party logos. Just your &lt;br&gt;
form, your brand, your submissions.&lt;/p&gt;

&lt;p&gt;Here's how to set it up step by step.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 1: Create Your Formgrid Account
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; and &lt;br&gt;
sign up with Google or Email.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb8j0xm8xwt4vvoen2f4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb8j0xm8xwt4vvoen2f4s.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The free plan lets you explore the form builder &lt;br&gt;
and test everything before upgrading. No credit &lt;br&gt;
card required.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Build Your Form
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;New Form&lt;/strong&gt; from your dashboard and give &lt;br&gt;
it a name.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have two options:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option A: Use the drag-and-drop form builder&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Perfect if you don't have a website or just &lt;br&gt;
need a shareable link. Drag fields onto the &lt;br&gt;
canvas, customize labels and placeholders, &lt;br&gt;
and your form is ready in minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvj9tow03vok1qtaqtd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhvj9tow03vok1qtaqtd2.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33qn31p0fp8v6xxwoxhi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F33qn31p0fp8v6xxwoxhi.png" alt=" " width="800" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option B: Use the form endpoint with your &lt;br&gt;
existing HTML form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you already have a form on your website, &lt;br&gt;
just point the action attribute at your &lt;br&gt;
Formgrid endpoint URL. No rebuilding needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://formgrid.dev/api/f/your-form-id"&lt;/span&gt; 
      &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
         &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send Message&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 3: Upgrade to Premium
&lt;/h3&gt;

&lt;p&gt;Go to your account billing page and upgrade &lt;br&gt;
to the Premium plan at $8/month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjaza6797hznj5swgzf6x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjaza6797hznj5swgzf6x.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this moment on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No "Powered by Formgrid" badge on your forms&lt;/li&gt;
&lt;li&gt;No watermarks on submission confirmation pages&lt;/li&gt;
&lt;li&gt;No third-party branding in notification emails&lt;/li&gt;
&lt;li&gt;Your form looks 100% like yours&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Step 4: Share Your Branded Form
&lt;/h3&gt;

&lt;p&gt;If you used the form builder, go to your form's &lt;br&gt;
Overview tab, copy the shareable link.&lt;/p&gt;

&lt;p&gt;Share it anywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WhatsApp groups&lt;/li&gt;
&lt;li&gt;Email campaigns&lt;/li&gt;
&lt;li&gt;Instagram bio&lt;/li&gt;
&lt;li&gt;LinkedIn messages&lt;/li&gt;
&lt;li&gt;Embed it on your website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you used the HTML endpoint, your existing &lt;br&gt;
form is already live. Just submit a test &lt;br&gt;
entry to confirm everything is working.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Receive Submissions in Your Inbox
&lt;/h3&gt;

&lt;p&gt;Every submission lands in your inbox instantly, &lt;br&gt;
cleanly formatted with the submitter's details. &lt;br&gt;
No dashboard login required, just to check &lt;br&gt;
if someone filled out your form.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzh2g5v8nug7inj63cxxp.png" alt=" " width="800" height="388"&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  What You Get on the Formgrid Premium Plan
&lt;/h2&gt;

&lt;p&gt;At $8/month, the Premium plan includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Formgrid branding on any of your forms&lt;/li&gt;
&lt;li&gt;5,000 submissions per month&lt;/li&gt;
&lt;li&gt;Unlimited forms&lt;/li&gt;
&lt;li&gt;Drag-and-drop form builder with shareable link&lt;/li&gt;
&lt;li&gt;Form endpoint for existing HTML forms&lt;/li&gt;
&lt;li&gt;File uploads up to 5MB per file&lt;/li&gt;
&lt;li&gt;CSV export of all submissions&lt;/li&gt;
&lt;li&gt;Honeypot and CAPTCHA spam protection&lt;/li&gt;
&lt;li&gt;Email notifications on every submission&lt;/li&gt;
&lt;li&gt;Works on any website or static site&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's everything you need to run a professional &lt;br&gt;
branded forms for less than the cost of a &lt;br&gt;
coffee per week.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comparison: Branding Removal Across Form Builders
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Branding Removal&lt;/th&gt;
&lt;th&gt;Cost&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;Typeform&lt;/td&gt;
&lt;td&gt;Plus plan&lt;/td&gt;
&lt;td&gt;$59/month&lt;/td&gt;
&lt;td&gt;1,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jotform&lt;/td&gt;
&lt;td&gt;Bronze plan&lt;/td&gt;
&lt;td&gt;$34/month&lt;/td&gt;
&lt;td&gt;1,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tally&lt;/td&gt;
&lt;td&gt;Pro plan&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Formgrid&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Premium plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$8/month&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5,000/month&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Formgrid removes branding at a fraction of &lt;br&gt;
what competitors charge. And you get 5,000 &lt;br&gt;
submissions per month, more than most &lt;br&gt;
small businesses will ever need.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who This is For
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Freelancers and agencies&lt;/strong&gt; who send client &lt;br&gt;
intake forms and don't want another company's &lt;br&gt;
logo on their work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event organizers&lt;/strong&gt; collecting registrations &lt;br&gt;
for workshops, webinars, and community events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small business owners&lt;/strong&gt; with contact forms, &lt;br&gt;
booking forms and inquiry forms on their website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Course creators&lt;/strong&gt; collecting student inquiries &lt;br&gt;
and enrollment forms shared via social media.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HR teams and hiring managers&lt;/strong&gt; are collecting &lt;br&gt;
job applications and want the form to look &lt;br&gt;
like it belongs to their company.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Real Users Are Saying
&lt;/h2&gt;

&lt;p&gt;"We needed a reliable registration form for our &lt;br&gt;
endurance ride events that would send clean, &lt;br&gt;
organized emails to our event manager. Formgrid &lt;br&gt;
solved the problem quickly and even created a &lt;br&gt;
custom email template tailored to our form. &lt;br&gt;
The level of personal support was impressive!"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Annie Libby&lt;/strong&gt;&lt;br&gt;
Event Manager, San Diego Endurance Riders&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Paying $59/month just to remove a logo from &lt;br&gt;
Your form is not a reasonable ask for a &lt;br&gt;
freelancer, small business, or event organizer &lt;br&gt;
with real budget constraints.&lt;/p&gt;

&lt;p&gt;Form builder branding removal should be &lt;br&gt;
affordable. At $8/month, Formgrid makes it &lt;br&gt;
accessible to anyone who needs professional &lt;br&gt;
looking forms without the premium price tag.&lt;/p&gt;

&lt;p&gt;Start free and upgrade when you're ready to &lt;br&gt;
remove the branding.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Try Formgrid free at formgrid.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. Written &lt;br&gt;
as honestly as I could. If anything looks &lt;br&gt;
inaccurate, let me know in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #webdev #nocode #smallbusiness #tutorial&lt;/p&gt;

</description>
      <category>formbuilder</category>
      <category>nocode</category>
      <category>forms</category>
      <category>webforms</category>
    </item>
    <item>
      <title>Getform Alternatives in 2026. Cheaper, Open Source, and Self-Hostable</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Tue, 17 Mar 2026 23:50:40 +0000</pubDate>
      <link>https://dev.to/allenarduino/getform-alternatives-in-2026-cheaper-open-source-and-self-hostable-5h62</link>
      <guid>https://dev.to/allenarduino/getform-alternatives-in-2026-cheaper-open-source-and-self-hostable-5h62</guid>
      <description>&lt;p&gt;If you've been using Getform and recently looked at &lt;br&gt;
your bill, you're not alone. A lot of developers are &lt;br&gt;
actively searching for alternatives, and for good reason.&lt;/p&gt;

&lt;p&gt;Getform is a decent product. But its paid plans start &lt;br&gt;
at $19/month for basic features. The free plan is limited &lt;br&gt;
and once you need webhooks, file uploads, or more &lt;br&gt;
submissions, you're immediately pushed onto a paid tier &lt;br&gt;
that costs more than most comparable tools.&lt;/p&gt;

&lt;p&gt;In this article, I'll walk through the best Getform &lt;br&gt;
alternatives in 2026, covering price, features, &lt;br&gt;
self-hosting options, and which one is right for &lt;br&gt;
your use case.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Developers Look for Getform Alternatives
&lt;/h2&gt;

&lt;p&gt;Before jumping into the list, here are the most common &lt;br&gt;
reasons people switch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; Getform's paid plans start at $19/month 
which is more expensive than most alternatives for 
similar submission limits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No form builder:&lt;/strong&gt; Getform is purely a backend. 
If you need a shareable form link without writing HTML, 
you're out of luck&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No self-hosting:&lt;/strong&gt; If you care about data ownership 
or GDPR compliance, Getform gives you no option to 
run it yourself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No open source option:&lt;/strong&gt; You're locked in with 
no transparency or customisation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited free tier:&lt;/strong&gt; The free plan is restrictive 
and quickly pushes you toward a paid upgrade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of those hit home, keep reading.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Best Getform Alternatives in 2026
&lt;/h2&gt;


&lt;h3&gt;
  
  
  1. Formgrid.dev. Form Builder + Form Backend in One Place
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a form backend AND &lt;br&gt;
non-technical users who need a shareable form link. &lt;br&gt;
Both in one tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most form tools pick a lane; either a form backend &lt;br&gt;
for developers or a no-code form builder for everyone &lt;br&gt;
else. Formgrid does both.&lt;/p&gt;

&lt;p&gt;You can point your existing HTML form to a Formgrid &lt;br&gt;
endpoint URL, exactly like Getform. Or you can use &lt;br&gt;
the drag-and-drop form builder, get a shareable link, &lt;br&gt;
and send it via WhatsApp or email without touching &lt;br&gt;
any code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Your existing HTML form — unchanged --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://formgrid.dev/api/f/your-form-id"&lt;/span&gt; 
      &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; 
         &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Name"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
         &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Email"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; 
            &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Honeypot spam protection --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
         &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send Message&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drag-and-drop form builder with shareable link&lt;/li&gt;
&lt;li&gt;HTML form endpoint; works with any static site&lt;/li&gt;
&lt;li&gt;Spam protection: honeypot and rate limiting&lt;/li&gt;
&lt;li&gt;Instant email notifications&lt;/li&gt;
&lt;li&gt;Custom branded email templates (Business plan)&lt;/li&gt;
&lt;li&gt;Auto-responder emails (Business plan)&lt;/li&gt;
&lt;li&gt;Webhooks: connect to Zapier, Make, Slack, 
Notion, Google Sheets, and more&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;CSV export&lt;/li&gt;
&lt;li&gt;Self-hostable with Docker&lt;/li&gt;
&lt;li&gt;100% open source (MIT license)&lt;/li&gt;
&lt;li&gt;GDPR friendly: no tracking, no data selling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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/month&lt;/td&gt;
&lt;td&gt;50/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;5,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;15,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The bottom line:&lt;/strong&gt; Getform starts at $19/month with &lt;br&gt;
no form builder and no self-hosting. Formgrid gives &lt;br&gt;
you a form backend, a no-code builder, webhooks, &lt;br&gt;
custom email templates, and self-hosting; starting &lt;br&gt;
at $8/month.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Formgrid Landing Page:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynxv2cw4xc6wizg3qojc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fynxv2cw4xc6wizg3qojc.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Formgrid Dashboard:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy53t32u8tq7h02yxmket.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy53t32u8tq7h02yxmket.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Example Form Built By Formgrid:
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7gbuigg0yhd1liqa0pt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7gbuigg0yhd1liqa0pt.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Formspree. Most Established Alternative
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a battle-tested &lt;br&gt;
form backend with a large community.&lt;/p&gt;

&lt;p&gt;Formspree has been around since 2013 and is one of &lt;br&gt;
the most trusted form backends available. Simple to &lt;br&gt;
set up, reliable, and well-documented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML form endpoint&lt;/li&gt;
&lt;li&gt;Email notifications&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;Spam protection&lt;/li&gt;
&lt;li&gt;Zapier integration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan with 50 submissions/month. &lt;br&gt;
Paid plans start at $10/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No form builder. No self-hosting. &lt;br&gt;
30-day submission history on free plan; data &lt;br&gt;
disappears if you don't export it in time.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Basin. Minimal and No-Frills
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want the simplest &lt;br&gt;
possible form backend with no distractions.&lt;/p&gt;

&lt;p&gt;Basin is intentionally minimal. Point your form &lt;br&gt;
at their endpoint, receive emails, and you're done. No dashboard &lt;br&gt;
overload, no feature creep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTML form endpoint&lt;/li&gt;
&lt;li&gt;Email notifications&lt;/li&gt;
&lt;li&gt;Spam protection&lt;/li&gt;
&lt;li&gt;Simple dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier available. Paid plans &lt;br&gt;
start at $8/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; Very limited compared to other options. &lt;br&gt;
No form builder, no self-hosting, minimal integrations.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. Netlify Forms. Great If You're Already on Netlify
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers whose sites are deployed &lt;br&gt;
on Netlify.&lt;/p&gt;

&lt;p&gt;If you're already deploying on Netlify, this is the &lt;br&gt;
easiest possible option; just add &lt;code&gt;netlify&lt;/code&gt; to your &lt;br&gt;
form tag and you're done.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"contact"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt; &lt;span class="na"&gt;data-netlify=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Zero setup if you're on Netlify&lt;/li&gt;
&lt;li&gt;Spam filtering&lt;/li&gt;
&lt;li&gt;Email notifications&lt;/li&gt;
&lt;li&gt;Dashboard in Netlify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; 100 submissions/month free with Netlify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; Only works if your site is on Netlify. &lt;br&gt;
If you host anywhere else, this isn't an option.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Web3Forms. Most Generous Free Plan
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who need a completely free &lt;br&gt;
form backend for low-volume projects.&lt;/p&gt;

&lt;p&gt;Web3Forms offers an impressive free tier, unlimited &lt;br&gt;
forms and up to 250 submissions per month at no cost. &lt;br&gt;
No account required to get started; just an API key &lt;br&gt;
sent to your email.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completely free&lt;/li&gt;
&lt;li&gt;250 submissions/month free&lt;/li&gt;
&lt;li&gt;No account required&lt;/li&gt;
&lt;li&gt;Email notifications&lt;/li&gt;
&lt;li&gt;Honeypot spam protection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No dashboard, no submission history, &lt;br&gt;
no file uploads, no self-hosting. Works for basic &lt;br&gt;
contact forms, but nothing more.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Getform&lt;/th&gt;
&lt;th&gt;Formgrid&lt;/th&gt;
&lt;th&gt;Formspree&lt;/th&gt;
&lt;th&gt;Basin&lt;/th&gt;
&lt;th&gt;Netlify Forms&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Form builder&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML endpoint&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable form link&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hostable&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom email templates&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Business&lt;/td&gt;
&lt;td&gt;✅ $60/mo&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Webhooks&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Business&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File uploads&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free submissions&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;50/mo&lt;/td&gt;
&lt;td&gt;50/mo&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;100/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starting price&lt;/td&gt;
&lt;td&gt;$19/mo&lt;/td&gt;
&lt;td&gt;$8/mo&lt;/td&gt;
&lt;td&gt;$10/mo&lt;/td&gt;
&lt;td&gt;$8/mo&lt;/td&gt;
&lt;td&gt;Bundled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR friendly&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Which One Should You Use?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use Formgrid if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want a form backend AND a form builder in one tool&lt;/li&gt;
&lt;li&gt;You care about open source and self-hosting&lt;/li&gt;
&lt;li&gt;You're paying too much for Getform and want to 
cut costs&lt;/li&gt;
&lt;li&gt;You need custom email templates for non-technical 
recipients&lt;/li&gt;
&lt;li&gt;You need webhooks to connect to Zapier, Notion, 
Google Sheets, or Slack&lt;/li&gt;
&lt;li&gt;GDPR compliance matters to you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Formspree if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want a battle-tested service with a large community&lt;/li&gt;
&lt;li&gt;You don't need a form builder&lt;/li&gt;
&lt;li&gt;You're comfortable with the pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Basin if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want the most minimal option possible&lt;/li&gt;
&lt;li&gt;You just need basic form submission handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Netlify Forms if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your site is already on Netlify&lt;/li&gt;
&lt;li&gt;You want zero additional setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Web3Forms if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need something completely free&lt;/li&gt;
&lt;li&gt;Volume is low, and you don't need a dashboard&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Getform is a solid product, but it's no longer the &lt;br&gt;
obvious choice in 2026. At $19/month with no form &lt;br&gt;
builder, no self-hosting, and no open source option, &lt;br&gt;
there are better alternatives at lower prices.&lt;/p&gt;

&lt;p&gt;If I were switching today, I'd go with &lt;strong&gt;Formgrid.&lt;/strong&gt; &lt;br&gt;
It's the only tool on this list that gives you a &lt;br&gt;
form backend for developers AND a no-code form builder &lt;br&gt;
for non-technical users, at a lower price than Getform, &lt;br&gt;
with webhooks, custom email templates, and full &lt;br&gt;
self-hosting support.&lt;/p&gt;

&lt;p&gt;You can try it free at &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; &lt;br&gt;
No credit card required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. I wrote this &lt;br&gt;
comparison as honestly as I could. If anything looks &lt;br&gt;
inaccurate, let me know in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #webdev #html #opensource #tutorial&lt;/p&gt;

</description>
      <category>backend</category>
      <category>opensource</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Customize Your Form Submission Email Notifications (And Why It Matters)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Tue, 17 Mar 2026 22:14:22 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-customize-your-form-submission-email-notifications-and-why-it-matters-21d2</link>
      <guid>https://dev.to/allenarduino/how-to-customize-your-form-submission-email-notifications-and-why-it-matters-21d2</guid>
      <description>&lt;p&gt;If you've ever received a form submission email &lt;br&gt;
that looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;name&lt;/span&gt;=&lt;span class="n"&gt;John&lt;/span&gt;+&lt;span class="n"&gt;Smith&lt;/span&gt;&amp;amp;&lt;span class="n"&gt;email&lt;/span&gt;=&lt;span class="n"&gt;john&lt;/span&gt;%&lt;span class="m"&gt;40&lt;/span&gt;&lt;span class="n"&gt;example&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;
&amp;amp;&lt;span class="n"&gt;message&lt;/span&gt;=&lt;span class="n"&gt;Hello&lt;/span&gt;+&lt;span class="n"&gt;there&lt;/span&gt;&amp;amp;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;next&lt;/span&gt;=&lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;yoursite&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;
&amp;amp;&lt;span class="err"&gt;_&lt;/span&gt;&lt;span class="n"&gt;gotcha&lt;/span&gt;=&amp;amp;&lt;span class="n"&gt;session&lt;/span&gt;=&lt;span class="n"&gt;Morning&lt;/span&gt;+&lt;span class="n"&gt;Workshop&lt;/span&gt;
&amp;amp;&lt;span class="n"&gt;totalAmount&lt;/span&gt;=%&lt;span class="m"&gt;24150&lt;/span&gt;.&lt;span class="m"&gt;00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You know exactly how frustrating it is. &lt;br&gt;
Raw field data dumped into an email with no structure, no &lt;br&gt;
labels, and no context. &lt;br&gt;
If you're the one reading &lt;br&gt;
those emails or worse, forwarding them to a &lt;br&gt;
colleague or client, it's a nightmare.&lt;/p&gt;

&lt;p&gt;The problem gets worse when your form has many fields. &lt;br&gt;
Registration forms, event entries, client intake forms, and job applications. &lt;br&gt;
These forms can have 20, 30, or even 40 fields. &lt;br&gt;
When all of that arrives as one unformatted block of text, the &lt;br&gt;
person reading it has to hunt for the information &lt;br&gt;
they need every single time.&lt;/p&gt;

&lt;p&gt;This guide shows you how to fix that completely &lt;br&gt;
using Formgrid's custom email template feature &lt;br&gt;
so every submission email arrives clean, organized, &lt;br&gt;
and readable by anyone.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Default Form Emails Look So Bad
&lt;/h2&gt;

&lt;p&gt;Most form backends send notification emails by simply dumping whatever data they received into the email body. &lt;br&gt;
They don't know your form's &lt;br&gt;
structure. They don't know which fields are important. &lt;br&gt;
They don't know that your recipient needs to see Attendee Information before Session Selection, before Payment Details.&lt;/p&gt;

&lt;p&gt;They just send everything in one flat list or worse, as raw URL-encoded data.&lt;/p&gt;

&lt;p&gt;This is fine for a simple 3-field contact form. &lt;br&gt;
But the moment your form gets complex, the default &lt;br&gt;
email becomes unreadable.&lt;/p&gt;

&lt;p&gt;Here are the most common complaints:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal fields showing up:&lt;/strong&gt; hidden fields &lt;br&gt;
like &lt;code&gt;_next&lt;/code&gt;, &lt;code&gt;_gotcha&lt;/code&gt;, and &lt;code&gt;_subject&lt;/code&gt; appear &lt;br&gt;
in the email even though they're not real data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No section headers:&lt;/strong&gt; All fields listed in &lt;br&gt;
one flat list with no grouping or context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No formatting:&lt;/strong&gt; Long text values show as &lt;br&gt;
one unbroken paragraph with no line breaks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong field order:&lt;/strong&gt; Fields appear in &lt;br&gt;
submission order not in a logical reading order.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Generic subject line:&lt;/strong&gt; Every email says &lt;br&gt;
"New form submission" with no context about &lt;br&gt;
who submitted or what they selected.&lt;/p&gt;

&lt;p&gt;All of these problems are solved with a custom email template.&lt;/p&gt;


&lt;h2&gt;
  
  
  What a Custom Email Template Looks Like
&lt;/h2&gt;

&lt;p&gt;Instead of a raw data dump, imagine receiving &lt;br&gt;
this for every workshop registration:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgj3fqhj8l8ufng57r9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgj3fqhj8l8ufng57r9v.png" alt=" " width="800" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clean. Organized. Readable by anyone. &lt;br&gt;
Whether they're a developer, an event coordinator, or &lt;br&gt;
an office manager who just needs to know who's &lt;br&gt;
coming and what they paid.&lt;/p&gt;

&lt;p&gt;That's exactly what Formgrid's custom email &lt;br&gt;
template feature delivers.&lt;/p&gt;


&lt;h2&gt;
  
  
  Who Needs Custom Email Templates
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Event organizers:&lt;/strong&gt; Workshop registrations, conference entries, seminar signups. Your coordinator needs to see the attendee details in a logical order, not a random field dump.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small businesses:&lt;/strong&gt; Client intake forms, &lt;br&gt;
service booking forms, and quote request forms. &lt;br&gt;
Your team needs to act on submissions quickly. &lt;br&gt;
A clean email means faster response times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freelancers:&lt;/strong&gt; Project brief forms, &lt;br&gt;
onboarding forms. When a new client submits &lt;br&gt;
their brief, you want it formatted like a &lt;br&gt;
document you can actually work from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nonprofits:&lt;/strong&gt; Volunteer applications, &lt;br&gt;
membership forms, donation forms. Your coordinator needs to process applications efficiently without deciphering raw data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agencies:&lt;/strong&gt; Building forms for clients. &lt;br&gt;
Your clients expect professional emails that &lt;br&gt;
match their brand and workflow.&lt;/p&gt;

&lt;p&gt;If you're sending form submission emails to anyone who isn't a developer, custom email &lt;br&gt;
templates are not optional. They're essential.&lt;/p&gt;


&lt;h2&gt;
  
  
  How Formgrid Custom Email Templates Work
&lt;/h2&gt;

&lt;p&gt;Formgrid uses &lt;strong&gt;Mustache templating:&lt;/strong&gt; A simple, &lt;br&gt;
widely used templating language that lets you &lt;br&gt;
write an HTML email with placeholders that get &lt;br&gt;
replaced with real submission data automatically.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Available Variables
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight handlebars"&gt;&lt;code&gt;&lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_formName&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;    — name of your form
&lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_time&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;        — submission timestamp
&lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;fieldName&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;    — any field by its exact name
&lt;span class="k"&gt;{{#&lt;/span&gt; &lt;span class="nv"&gt;fields&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;      — loop through all fields
  &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_name&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;      — field label inside the loop
  &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;_value&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;     — field value inside the loop
&lt;span class="k"&gt;{{/&lt;/span&gt; &lt;span class="nv"&gt;fields&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;      — close the loop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;{{ fieldName }}&lt;/code&gt; variable is the most &lt;br&gt;
powerful one. It maps directly to the &lt;code&gt;name&lt;/code&gt; &lt;br&gt;
attribute of your HTML input field. So if your &lt;br&gt;
form has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"attendeeName"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use &lt;code&gt;{{ attendeeName }}&lt;/code&gt; anywhere in &lt;br&gt;
your email template and it will be replaced &lt;br&gt;
with whatever the user typed.&lt;/p&gt;


&lt;h2&gt;
  
  
  Two Ways to Use Custom Email Templates
&lt;/h2&gt;


&lt;h3&gt;
  
  
  Option 1: The Simple Loop (Works for Any Form)
&lt;/h3&gt;

&lt;p&gt;If you just want clean, formatted emails without thinking too much about structure, use the &lt;br&gt;
fields loop. This works for any form automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-family: sans-serif; 
            max-width: 600px; 
            margin: 0 auto;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    New Submission — {{ _formName }}
  &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

  {{# fields }}
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-bottom: 16px; 
              border-bottom: 1px solid #eee; 
              padding-bottom: 16px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin: 0; 
              font-size: 12px; 
              color: #888; 
              text-transform: uppercase;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {{ _name }}
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin: 4px 0 0; 
              font-size: 15px; 
              color: #333;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {{ _value }}
    &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  {{/ fields }}

  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 12px; color: #999;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Submitted: {{ _time }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This renders every field cleanly with its label above and value below. &lt;br&gt;
No internal fields, no raw data, no mess. &lt;br&gt;
Just clean readable output &lt;br&gt;
for every submission automatically.&lt;/p&gt;


&lt;h3&gt;
  
  
  Option 2: Sectioned Template
&lt;/h3&gt;
&lt;h3&gt;
  
  
  (For Complex Registration Forms)
&lt;/h3&gt;

&lt;p&gt;If your form has multiple sections, like a &lt;br&gt;
workshop registration with attendee details, &lt;br&gt;
session selection, dietary requirements, and &lt;br&gt;
payment. &lt;br&gt;
You can group fields into sections &lt;br&gt;
with clear headers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-family: sans-serif; 
            max-width: 600px; 
            margin: 0 auto; 
            color: #1f2937;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h2&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             border-bottom: 2px solid #e8f3ee; 
             padding-bottom: 10px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    New Registration: {{ _formName }}
  &lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Attendee Information
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Name:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ attendeeName }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Email:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ email }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Company:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ company }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Phone:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ phone }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             margin-top: 24px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Session Selection
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Workshop:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ workshopName }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Date:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ workshopDate }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Format:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ format }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             margin-top: 24px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Dietary Requirements
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Dietary Preference:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; 
    {{ dietaryPreference }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Allergies:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ allergies }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             margin-top: 24px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Payment
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Ticket Type:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ ticketType }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Total:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; {{ totalAmount }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Payment Method:&lt;span class="nt"&gt;&amp;lt;/strong&amp;gt;&lt;/span&gt; 
    {{ paymentMethod }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"color: #1d4f3d; 
             margin-top: 24px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Notes
  &lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ notes }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;hr&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"margin-top: 32px; 
             border: none; 
             border-top: 1px solid #e5e7eb;"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"font-size: 12px; 
            color: #9ca3af; 
            margin-top: 12px;"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    Submitted: {{ _time }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variable names, &lt;code&gt;{{ attendeeName }}&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;{{ workshopName }}&lt;/code&gt;, &lt;code&gt;{{ totalAmount }}&lt;/code&gt;, must &lt;br&gt;
match the &lt;code&gt;name&lt;/code&gt; attributes of your HTML form &lt;br&gt;
inputs exactly.&lt;/p&gt;

&lt;p&gt;So if your form has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"attendeeName"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"workshopName"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;...&lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"totalAmount"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The variables &lt;code&gt;{{ attendeeName }}&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;{{ workshopName }}&lt;/code&gt;, and &lt;code&gt;{{ totalAmount }}&lt;/code&gt; &lt;br&gt;
will be replaced with the actual submitted &lt;br&gt;
values automatically.&lt;/p&gt;

&lt;p&gt;This gives you complete control over the layout, &lt;br&gt;
grouping, and the order of every notification email.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Set Up Custom Email Templates
&lt;/h2&gt;
&lt;h2&gt;
  
  
  in Formgrid
&lt;/h2&gt;

&lt;p&gt;Custom email templates are available on the &lt;br&gt;
&lt;strong&gt;Business plan&lt;/strong&gt; at $29/month.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 1: Go to Your Form Settings
&lt;/h3&gt;

&lt;p&gt;Log in to your Formgrid dashboard, open your &lt;br&gt;
form, and click the &lt;strong&gt;Settings&lt;/strong&gt; tab.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5wdsoxjh25y6sjxmhmx3.png" alt=" " width="800" height="443"&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 2: Find the Custom Email Template Section
&lt;/h3&gt;

&lt;p&gt;Scroll down to the &lt;strong&gt;Custom Email Template&lt;/strong&gt; &lt;br&gt;
section. &lt;br&gt;
If you're on the Business plan, you'll &lt;br&gt;
see the full template editor. &lt;br&gt;
If you're on the free or Premium plan, you'll see a prompt to &lt;br&gt;
upgrade.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcgnp5fhfen6snz58in2y.png" alt=" " width="800" height="443"&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 3: Enable the Custom Template
&lt;/h3&gt;

&lt;p&gt;Toggle the custom template on. The editor pre-populates with a starter template using the simple fields loop, a clean starting &lt;br&gt;
point that works for any form immediately.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 4: Customize Your Template
&lt;/h3&gt;

&lt;p&gt;Edit the HTML to match your needs. &lt;br&gt;
Use the simple loop for basic forms or build a sectioned template for complex registration forms.&lt;/p&gt;

&lt;p&gt;The available variables panel shows every variable you can use. &lt;br&gt;
Click any variable chip to copy it to your clipboard instantly.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 5: Preview and Save
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Preview&lt;/strong&gt; to see exactly how your &lt;br&gt;
email will look with sample data substituted &lt;br&gt;
in. When you're happy, click &lt;strong&gt;Save Template&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;From this point on every submission to your &lt;br&gt;
form will use your custom template, clean, &lt;br&gt;
organized, and formatted exactly the way &lt;br&gt;
you designed it.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 6: Test It
&lt;/h3&gt;

&lt;p&gt;Submit a test entry on your form and check your inbox. &lt;br&gt;
Your notification email should &lt;br&gt;
arrive formatted exactly as you designed it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Custom Subject Lines
&lt;/h2&gt;

&lt;p&gt;You can also control the email subject line using the &lt;code&gt;_subject&lt;/code&gt; hidden field in your &lt;br&gt;
HTML form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
  &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; 
  &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_subject"&lt;/span&gt; 
  &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"Workshop Registration — {{ attendeeName }}"&lt;/span&gt;
&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or set it dynamically with JavaScript before &lt;br&gt;
submission:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subjectField&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Registration - &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; - &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;ticketType&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means every submission email has a &lt;br&gt;
meaningful subject line: "Workshop Registration. &lt;br&gt;
Sarah Johnson. Early Bird", instead of &lt;br&gt;
the generic "New form submission."&lt;/p&gt;




&lt;h2&gt;
  
  
  What Else Is Included in the Business Plan
&lt;/h2&gt;

&lt;p&gt;Custom email templates are part of the Formgrid &lt;br&gt;
Business plan that also includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;15,000 submissions/month&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks:&lt;/strong&gt; Connect to Zapier, Make, 
Slack, Notion, Google Sheets, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-responder emails:&lt;/strong&gt; Automatically 
Send confirmation emails to your form 
submitters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority support&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All for &lt;strong&gt;$29/month.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Default form notification emails are fine for simple contact forms. But the moment your form gets complex, with multiple sections and many fields, &lt;br&gt;
non-technical recipients, a raw data dump &lt;br&gt;
in your inbox, it becomes a real problem.&lt;/p&gt;

&lt;p&gt;Custom email templates solve this completely. &lt;br&gt;
Your emails arrive formatted, organized, and &lt;br&gt;
readable by anyone. Whether they're a developer, an event coordinator, or an office manager, processing registrations.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt; &lt;br&gt;
you get:&lt;/p&gt;

&lt;p&gt;✅ Full HTML email template control&lt;br&gt;&lt;br&gt;
✅ Mustache variables for any field&lt;br&gt;&lt;br&gt;
✅ Sectioned layouts for complex forms&lt;br&gt;&lt;br&gt;
✅ Custom subject lines&lt;br&gt;&lt;br&gt;
✅ Preview before saving&lt;br&gt;&lt;br&gt;
✅ Works with any HTML form on any website  &lt;/p&gt;

&lt;p&gt;Start free and upgrade to Business when &lt;br&gt;
you're ready for custom templates.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Try Formgrid free at formgrid.dev&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. &lt;br&gt;
Written as honestly as I could let you know in the &lt;br&gt;
comments if anything looks off.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #webdev #javascript #tutorial #productivity #formapi&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Add a Custom Form to Your Squarespace Site</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sun, 15 Mar 2026 17:48:49 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-add-a-custom-form-to-your-squarespace-site-ldp</link>
      <guid>https://dev.to/allenarduino/how-to-add-a-custom-form-to-your-squarespace-site-ldp</guid>
      <description>&lt;p&gt;Squarespace makes it easy to build a beautiful website. &lt;br&gt;
But when it comes to forms, a lot of users hit a wall quickly.&lt;/p&gt;

&lt;p&gt;The native Squarespace form block is fine for simple contact &lt;br&gt;
forms. But the moment you need something more dynamic. Fee &lt;br&gt;
calculations, multi-section registration forms, and custom email &lt;br&gt;
formatting, or more than 30 fields, the native block runs out &lt;br&gt;
of the road fast.&lt;/p&gt;

&lt;p&gt;Squarespace recommends adding no more than 30 fields to keep &lt;br&gt;
a form that is user-friendly and quick to load, and that's the &lt;br&gt;
hard limit for forms connected to Mailchimp. For anyone running &lt;br&gt;
event registrations, membership applications, or client intake &lt;br&gt;
forms, 30 fields are not enough.&lt;/p&gt;

&lt;p&gt;In this guide, you'll learn how to add a fully custom HTML form &lt;br&gt;
to your Squarespace site using a code block with dynamic &lt;br&gt;
calculations, custom email notifications, and spam protection &lt;br&gt;
included using &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Squarespace's Native Form Isn't Always Enough
&lt;/h2&gt;

&lt;p&gt;Squarespace's built-in form block covers the basics well. But &lt;br&gt;
here are the most common reasons people look for something more:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limited email formatting:&lt;/strong&gt; The notification email you &lt;br&gt;
receive when someone submits is a basic field dump. You can't &lt;br&gt;
control how it looks, how fields are grouped, or what the &lt;br&gt;
subject line says. If you're forwarding submissions to a &lt;br&gt;
client or a non-technical colleague, it looks messy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No dynamic calculations:&lt;/strong&gt; Squarespace's native form block &lt;br&gt;
cannot calculate totals, apply pricing tiers, or update &lt;br&gt;
fees dynamically as users fill in the form. You need a &lt;br&gt;
custom HTML form with JavaScript for that and which is &lt;br&gt;
exactly what this guide shows you how to build.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;30 field limit:&lt;/strong&gt; Complex registration forms, event entries, &lt;br&gt;
and application forms often need more than 30 fields.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unreliable email notifications:&lt;/strong&gt; Squarespace forum users &lt;br&gt;
regularly report form notifications not being delivered to &lt;br&gt;
their email at all, with no clear explanation from the platform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No submission dashboard:&lt;/strong&gt; Squarespace stores submissions, but the interface for reviewing them is limited. No search, &lt;br&gt;
no filtering, no CSV export on lower plans.&lt;/p&gt;

&lt;p&gt;If any of those hit home, keep reading.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Solution: A Custom HTML Form in a Squarespace Code Block
&lt;/h2&gt;

&lt;p&gt;Squarespace allows you to embed custom HTML, CSS, and &lt;br&gt;
JavaScript directly into any page using a &lt;strong&gt;Code Block&lt;/strong&gt;. &lt;br&gt;
This means you can build a fully custom form with any &lt;br&gt;
fields, any layout, any logic, and embed it on your &lt;br&gt;
Squarespace page.&lt;/p&gt;

&lt;p&gt;The only thing a custom HTML form needs is a backend to &lt;br&gt;
receive submissions, send email notifications, and store &lt;br&gt;
the data. That's exactly what &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt; provides.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Use Formgrid.dev
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt; is a privacy-first form &lt;br&gt;
backend that works with any HTML form on any website,&lt;br&gt;
including Squarespace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free plan includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited forms&lt;/li&gt;
&lt;li&gt;50 submissions/month&lt;/li&gt;
&lt;li&gt;Email notifications on every submission&lt;/li&gt;
&lt;li&gt;Built-in spam protection (honeypot + rate limiting)&lt;/li&gt;
&lt;li&gt;Submission dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Premium plan: $8/month&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5,000 submissions/month&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;Custom redirect after submission&lt;/li&gt;
&lt;li&gt;Webhook support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business plan: $19/month&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;15,000 submissions/month&lt;/li&gt;
&lt;li&gt;Custom branded email templates&lt;/li&gt;
&lt;li&gt;Priority support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike Squarespace's native form, Formgrid lets you control &lt;br&gt;
exactly how your notification email looks with proper &lt;br&gt;
sections, headers, and formatting that even a non-technical &lt;br&gt;
recipient can read clearly.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step-by-Step: Adding a Custom Form to Squarespace
&lt;/h2&gt;


&lt;h3&gt;
  
  
  Step 1: Create Your Formgrid Account
&lt;/h3&gt;

&lt;p&gt;Head to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;https://formgrid.dev&lt;/a&gt; and &lt;br&gt;
sign up using &lt;strong&gt;Google&lt;/strong&gt; or &lt;strong&gt;Email&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjigvrqx9ko4dex0r3udb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjigvrqx9ko4dex0r3udb.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No credit card required. You're on the free plan immediately.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Create a New Form
&lt;/h3&gt;

&lt;p&gt;Once logged in, click &lt;strong&gt;New Form&lt;/strong&gt; from your dashboard.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your form a descriptive name:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Contact Form"&lt;/li&gt;
&lt;li&gt;"Event Registration"&lt;/li&gt;
&lt;li&gt;"Client Intake Form"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;Create Form&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 3: Copy Your Endpoint URL
&lt;/h3&gt;

&lt;p&gt;Go to the &lt;strong&gt;Overview&lt;/strong&gt; tab and copy your unique &lt;br&gt;
endpoint URL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://formgrid.dev/api/f/your-form-id
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the URL your HTML form will submit data to.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Open Your Squarespace Page Editor
&lt;/h3&gt;

&lt;p&gt;In your Squarespace dashboard:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Pages&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Open the page where you want the form&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Edit&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click the &lt;strong&gt;+&lt;/strong&gt; button to add a new block&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Code&lt;/strong&gt; from the block options&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5g8clx89djom1unuock.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5g8clx89djom1unuock.webp" alt=" " width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This opens a code editor where you can paste raw HTML, &lt;br&gt;
CSS, and JavaScript.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 5:  Paste Your Custom Form
&lt;/h3&gt;

&lt;p&gt;Here is a clean, ready-to-use contact form. Paste this &lt;br&gt;
into your Squarespace code block and replace &lt;br&gt;
&lt;code&gt;YOUR_FORMGRID_ENDPOINT_URL&lt;/code&gt; with your endpoint from Step 3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;style&amp;gt;&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-form&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inherit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-form&lt;/span&gt; &lt;span class="nc"&gt;.fg-field&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-form&lt;/span&gt; &lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;6px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-form&lt;/span&gt; &lt;span class="nt"&gt;input&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-form&lt;/span&gt; &lt;span class="nt"&gt;textarea&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-form&lt;/span&gt; &lt;span class="nt"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="m"&gt;14px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="m"&gt;#d1d5db&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inherit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-form&lt;/span&gt; &lt;span class="nt"&gt;textarea&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;min-height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;vertical&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-form&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#1d4f3d&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#fff&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12px&lt;/span&gt; &lt;span class="m"&gt;28px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border-radius&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;999px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;700&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;pointer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.fg-status&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin-top&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.95rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/style&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"fg-contact-form"&lt;/span&gt; 
      &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-form"&lt;/span&gt;
      &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_FORMGRID_ENDPOINT_URL"&lt;/span&gt; 
      &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Your Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
           &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; 
           &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; 
           &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"John Doe"&lt;/span&gt; 
           &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email Address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
           &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
           &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
           &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"john@example.com"&lt;/span&gt; 
           &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Your Message&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; 
              &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; 
              &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"How can I help you?"&lt;/span&gt; 
              &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Honeypot spam protection — invisible to humans --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
         &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
         &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; 
         &lt;span class="na"&gt;tabindex=&lt;/span&gt;&lt;span class="s"&gt;"-1"&lt;/span&gt; 
         &lt;span class="na"&gt;autocomplete=&lt;/span&gt;&lt;span class="s"&gt;"off"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Optional: redirect after submission --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; 
         &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_redirect"&lt;/span&gt; 
         &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"https://yoursite.com/thank-you"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send Message&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-status"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"fg-status"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fg-contact-form&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fg-status&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sending...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Thanks! Your message has been sent.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
          &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Something went wrong. Please try again.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Network error. Please check your connection.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click &lt;strong&gt;Apply&lt;/strong&gt; in Squarespace to save the code block.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 6: Email Notifications Are Already Set Up
&lt;/h3&gt;

&lt;p&gt;Formgrid automatically uses the email address you signed &lt;br&gt;
up with as your default notification address. The moment &lt;br&gt;
someone submits your form, the alert goes straight to &lt;br&gt;
your inbox — no extra configuration needed.&lt;/p&gt;

&lt;p&gt;If you want submissions sent to a different email,&lt;br&gt;
a client's address or a team inbox, go to your form's &lt;br&gt;
&lt;strong&gt;Settings&lt;/strong&gt; tab and update it under &lt;br&gt;
&lt;strong&gt;Email Notifications&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kp2sswbjh2dvwvi41ed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kp2sswbjh2dvwvi41ed.png" alt=" " width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every submission email includes the submitter's name, &lt;br&gt;
email, message, and timestamp, cleanly formatted and &lt;br&gt;
easy to read.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0lu1tjfb1gpstvhesgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0lu1tjfb1gpstvhesgu.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 7: Test Your Form
&lt;/h3&gt;

&lt;p&gt;Preview your Squarespace page and submit a test entry. &lt;br&gt;
Within seconds, you should receive:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A notification email in your inbox&lt;/li&gt;
&lt;li&gt;The submission is logged in your Formgrid dashboard&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If the email doesn't arrive, check your spam folder and &lt;br&gt;
confirm the notification email is saved in your form &lt;br&gt;
settings.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 8: View All Submissions
&lt;/h3&gt;

&lt;p&gt;All submissions are stored in your Formgrid dashboard. &lt;br&gt;
Go to the &lt;strong&gt;Submissions&lt;/strong&gt; tab to view, search, and &lt;br&gt;
export as CSV at any time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nothing gets lost even if an email slips into spam.&lt;/p&gt;


&lt;h2&gt;
  
  
  Building a More Complex Form
&lt;/h2&gt;

&lt;p&gt;The example above is a basic contact form. But because &lt;br&gt;
you're writing raw HTML and JavaScript, you can build &lt;br&gt;
anything, multi-section registration forms, dynamic &lt;br&gt;
fee calculators, conditional fields, and file uploads.&lt;/p&gt;

&lt;p&gt;Here's a quick example of a registration form with &lt;br&gt;
a dynamic total calculation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"fg-reg-form"&lt;/span&gt;
      &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-form"&lt;/span&gt;
      &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_FORMGRID_ENDPOINT_URL"&lt;/span&gt;
      &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_subject"&lt;/span&gt; 
         &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"subjectField"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"regName"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Full Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"regName"&lt;/span&gt; 
           &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"regName"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"regEmail"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email Address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"regEmail"&lt;/span&gt; 
           &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"regEmail"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"ticketType"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Ticket Type&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;select&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"ticketType"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"ticketType"&lt;/span&gt; 
            &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fee-input"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Select ticket&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"50"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Standard - $50&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;option&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"25"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Early Bird - $25&lt;span class="nt"&gt;&amp;lt;/option&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/select&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"fg-field"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;strong&amp;gt;&lt;/span&gt;Total: &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"totalDisplay"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      $0.00
    &lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&amp;lt;/strong&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"totalField"&lt;/span&gt; 
           &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"totalAmount"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Honeypot --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
         &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; &lt;span class="na"&gt;tabindex=&lt;/span&gt;&lt;span class="s"&gt;"-1"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Register&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;formatCurrency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NumberFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en-US&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;currency&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;USD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;val&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;updateTotal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fees&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.fee-input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fees&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;totalDisplay&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;formatCurrency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;totalField&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;formatCurrency&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.fee-input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;change&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;updateTotal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fg-reg-form&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;regName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Unknown&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;totalField&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$0.00&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;subjectField&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Registration - &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; - &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you a fully dynamic registration form with &lt;br&gt;
real-time fee calculation. Something Squarespace's &lt;br&gt;
native form block simply cannot do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Spam Protection: What's Already Included
&lt;/h2&gt;

&lt;p&gt;Formgrid includes two layers of spam protection &lt;br&gt;
out of the box:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honeypot field:&lt;/strong&gt; a hidden input that real users &lt;br&gt;
never see or fill in. Bots that auto-fill every field &lt;br&gt;
get caught immediately. You added this with &lt;br&gt;
&lt;code&gt;name="_honey"&lt;/code&gt; in the form above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rate limiting:&lt;/strong&gt; Formgrid automatically blocks &lt;br&gt;
repeated submissions from the same IP address, &lt;br&gt;
stopping bot floods before they reach your inbox.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Use a Form Service vs Squarespace's Native Form
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use a custom form with Formgrid if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need more than 30 fields&lt;/li&gt;
&lt;li&gt;You need dynamic calculations or conditional logic&lt;/li&gt;
&lt;li&gt;You want full control over how your notification 
email looks&lt;/li&gt;
&lt;li&gt;You need a reliable submission dashboard with 
search and CSV export&lt;/li&gt;
&lt;li&gt;You're building a registration or application form 
with multiple sections&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Squarespace's native form if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You just need a simple 3-5 field contact form&lt;/li&gt;
&lt;li&gt;You don't need dynamic logic or calculations&lt;/li&gt;
&lt;li&gt;Basic email notifications are sufficient&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Squarespace is one of the best website builders available &lt;br&gt;
but its native form block has real limitations for anyone &lt;br&gt;
running complex forms. The good news is that Squarespace's &lt;br&gt;
code block gives you complete freedom to embed any HTML &lt;br&gt;
form you want — and Formgrid handles everything on the &lt;br&gt;
backend.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt; you get:&lt;/p&gt;

&lt;p&gt;✅ Custom HTML forms on any Squarespace page&lt;br&gt;&lt;br&gt;
✅ Dynamic calculations and multi-section layouts&lt;br&gt;&lt;br&gt;
✅ Instant email notifications&lt;br&gt;&lt;br&gt;
✅ Built-in spam protection&lt;br&gt;&lt;br&gt;
✅ A clean submission dashboard&lt;br&gt;&lt;br&gt;
✅ No backend required  &lt;/p&gt;

&lt;p&gt;Free to start. No credit card required.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Try Formgrid free at formgrid.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>forms</category>
      <category>squarespace</category>
      <category>formapi</category>
    </item>
    <item>
      <title>The Best Typeform Alternatives in 2026 (Free and Paid)</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sat, 14 Mar 2026 16:24:41 +0000</pubDate>
      <link>https://dev.to/allenarduino/the-best-typeform-alternatives-in-2026-free-and-paid-556j</link>
      <guid>https://dev.to/allenarduino/the-best-typeform-alternatives-in-2026-free-and-paid-556j</guid>
      <description>&lt;p&gt;If you've been using Typeform and recently looked at your &lt;br&gt;
bill, you're not alone. Typeform's free plan limits you to &lt;br&gt;
10 responses per month, and their paid plans start at &lt;br&gt;
$25/month just to get basic features. For a lot of &lt;br&gt;
developers, indie hackers, and small businesses, that's &lt;br&gt;
hard to justify.&lt;/p&gt;

&lt;p&gt;In this article, I'll walk through the best Typeform &lt;br&gt;
alternatives in 2026, covering price, features, &lt;br&gt;
self-hosting options, and which one is right for &lt;br&gt;
Your use case.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Developers and Businesses Look for Typeform Alternatives
&lt;/h2&gt;

&lt;p&gt;Before jumping into the list, here are the most common &lt;br&gt;
reasons people switch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Price:&lt;/strong&gt; Typeform's free plan is almost unusable 
at 10 responses per month. Paid plans are expensive 
for what you get&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No HTML form backend:&lt;/strong&gt; Typeform is a hosted form 
builder only. You can't point your existing HTML form 
at a Typeform endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No self-hosting:&lt;/strong&gt; If you care about data ownership 
or GDPR compliance, Typeform gives you no option to 
run it yourself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overkill for simple use cases:&lt;/strong&gt; Typeform's 
conversational UI is beautiful but completely 
unnecessary if you just need a contact form or 
a registration form&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No open source option:&lt;/strong&gt; You're locked in with 
no transparency or customisation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If any of those hit home, keep reading.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Best Typeform Alternatives in 2026
&lt;/h2&gt;


&lt;h3&gt;
  
  
  1. Formgrid.dev: Form Builder + Form Backend in One Place
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a form backend AND &lt;br&gt;
non-technical users who need a shareable form link. &lt;br&gt;
Both in one tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes it different:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most form tools pick a lane. Either a form backend &lt;br&gt;
for developers or a no-code form builder for everyone &lt;br&gt;
else. Formgrid does both.&lt;/p&gt;

&lt;p&gt;You can point your existing HTML form to a Formgrid &lt;br&gt;
endpoint URL, just like you would with Formspree. Or &lt;br&gt;
you can use the drag-and-drop form builder, get a &lt;br&gt;
shareable link, and send it via WhatsApp or email &lt;br&gt;
without touching any code.&lt;/p&gt;

&lt;p&gt;Here is how both workflows look:&lt;/p&gt;


&lt;h4&gt;
  
  
  Option A: Use Your Existing HTML Form
&lt;/h4&gt;

&lt;p&gt;If you already have an HTML form on your static site, &lt;br&gt;
just point the action attribute at your Formgrid &lt;br&gt;
endpoint. No other changes needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"https://formgrid.dev/api/f/your-form-id"&lt;/span&gt; 
      &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; 
         &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Name"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
         &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Email"&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; 
            &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Honeypot spam protection --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
         &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send Message&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your form stays exactly as it is. Formgrid handles &lt;br&gt;
receiving submissions, sending email notifications, &lt;br&gt;
and storing the data.&lt;/p&gt;




&lt;h4&gt;
  
  
  Option B: Build a Form With the Drag-and-Drop Builder
&lt;/h4&gt;

&lt;p&gt;If you're non-technical or just want a shareable form &lt;br&gt;
link without writing any HTML, Formgrid has a full &lt;br&gt;
drag-and-drop form builder built in.&lt;/p&gt;

&lt;p&gt;Here's how it works step by step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Sign Up and Create a Form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Head to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; and sign &lt;br&gt;
up using Google or Email. No credit card required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1cqi77okjivpv89ffsp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm1cqi77okjivpv89ffsp.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once logged in, you'll land on your dashboard. &lt;br&gt;
Click &lt;strong&gt;New Form&lt;/strong&gt; to get started.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 2: Choose Your Path&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After creating your form, you'll be taken to the &lt;br&gt;
form overview page. Scroll down, and you'll see &lt;br&gt;
two options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build with Form Builder:&lt;/strong&gt; Opens the 
drag-and-drop editor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Endpoint URL:&lt;/strong&gt; Gives you the URL to 
point your existing HTML form at&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqoy2c2w7bryqr9obfqe6.png" alt=" " width="800" height="441"&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Build Your Form&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Build with Form Builder&lt;/strong&gt;, and you'll be &lt;br&gt;
taken to the builder page. Drag fields from the &lt;br&gt;
left panel onto the canvas: text fields, email &lt;br&gt;
fields, dropdowns, checkboxes, file uploads, and more.&lt;/p&gt;

&lt;p&gt;Each field is fully customisable. Click any field &lt;br&gt;
to edit its label, placeholder, required status, &lt;br&gt;
and validation rules.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nc7en2b8mjlrtqghdhg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1nc7en2b8mjlrtqghdhg.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 4: Customise Your Brand&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Formgrid includes a colour picker so you can match &lt;br&gt;
the form to your brand or your client's brand. &lt;br&gt;
Change the primary colour, background, and button &lt;br&gt;
style directly in the builder.&lt;/p&gt;

&lt;p&gt;This means every form you share looks as if it &lt;br&gt;
belongs to your brand. Not like a generic &lt;br&gt;
third-party tool.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 5: Preview and Share&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you're happy with the form, click &lt;strong&gt;Preview&lt;/strong&gt; &lt;br&gt;
to see exactly how it looks to your users. When &lt;br&gt;
it's ready, click &lt;strong&gt;Share&lt;/strong&gt; to get your shareable &lt;br&gt;
form link.&lt;/p&gt;

&lt;p&gt;You can send that link via:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;SMS&lt;/li&gt;
&lt;li&gt;Embed it on any website&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No code. No hosting. Just a link.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9rg67rirrfoqjhehcm1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft9rg67rirrfoqjhehcm1.png" alt=" " width="800" height="742"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 6: Configure Settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Go to the &lt;strong&gt;Settings&lt;/strong&gt; tab on your form to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add notification email addresses.
Receive an email every time someone submits&lt;/li&gt;
&lt;li&gt;Enable spam protection, honeypot, and 
rate limiting built in&lt;/li&gt;
&lt;li&gt;Set a custom redirect URL after submission&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe0d8ayuksfp1tmakip36.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe0d8ayuksfp1tmakip36.png" alt=" " width="800" height="441"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Step 7 — View Submissions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All submissions are stored in your Formgrid dashboard. &lt;br&gt;
Go to the &lt;strong&gt;Submissions&lt;/strong&gt; tab to view, search, filter, &lt;br&gt;
and export your data as CSV.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drag-and-drop form builder with shareable link&lt;/li&gt;
&lt;li&gt;HTML form endpoint. Works with any static site&lt;/li&gt;
&lt;li&gt;Spam protection (honeypot + rate limiting)&lt;/li&gt;
&lt;li&gt;Instant email notifications&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;CSV export&lt;/li&gt;
&lt;li&gt;Colour picker for brand matching&lt;/li&gt;
&lt;li&gt;Self-hostable with Docker&lt;/li&gt;
&lt;li&gt;100% open source (MIT license)&lt;/li&gt;
&lt;li&gt;GDPR friendly — no tracking, no data selling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&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/month&lt;/td&gt;
&lt;td&gt;50/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;5,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business&lt;/td&gt;
&lt;td&gt;$19/month&lt;/td&gt;
&lt;td&gt;15,000/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The bottom line:&lt;/strong&gt; Typeform charges $25/month for &lt;br&gt;
basic features. Formgrid gives you a form builder, &lt;br&gt;
a form backend, self-hosting, and open source code &lt;br&gt;
for $8/month. If you're paying for Typeform just to &lt;br&gt;
build and share forms, this is the obvious switch.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Google Forms: Best Free Option
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Anyone who needs a completely free &lt;br&gt;
form builder for basic use cases.&lt;/p&gt;

&lt;p&gt;Google Forms is completely free with no submission &lt;br&gt;
limits. It's the most widely used form of tool in the &lt;br&gt;
world for good reason. It works, it's fast, and &lt;br&gt;
everyone knows how to use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Completely free&lt;/li&gt;
&lt;li&gt;Unlimited responses&lt;/li&gt;
&lt;li&gt;Google Sheets integration&lt;/li&gt;
&lt;li&gt;Conditional logic&lt;/li&gt;
&lt;li&gt;Simple analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No custom branding. No custom domain. &lt;br&gt;
No HTML form backend. No self-hosting. Forms look &lt;br&gt;
like Google Forms. Not like your brand. Not &lt;br&gt;
suitable for professional client work.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Tally: Clean and Free Form Builder
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Non-technical users who want a &lt;br&gt;
Typeform-like experience at a lower price.&lt;/p&gt;

&lt;p&gt;Tally is a popular Typeform alternative with a &lt;br&gt;
clean, minimal interface. Their free plan is &lt;br&gt;
genuinely useful. Unlimited forms and unlimited &lt;br&gt;
responses, though some features are locked behind &lt;br&gt;
the paid plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited forms on the free plan&lt;/li&gt;
&lt;li&gt;Unlimited responses&lt;/li&gt;
&lt;li&gt;Conditional logic&lt;/li&gt;
&lt;li&gt;File uploads (paid)&lt;/li&gt;
&lt;li&gt;Notion integration&lt;/li&gt;
&lt;li&gt;Embeddable forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan available. Paid plan at &lt;br&gt;
$29/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No HTML form backend. No self-hosting. &lt;br&gt;
No open source. Heavier than you need for a simple &lt;br&gt;
contact form.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Jotform: Most Feature-Rich
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Businesses that need an advanced form &lt;br&gt;
logic, payment integration, and a full form &lt;br&gt;
management suite.&lt;/p&gt;

&lt;p&gt;Jotform is one of the most feature-rich form &lt;br&gt;
builders available. Hundreds of templates, payment &lt;br&gt;
integrations, conditional logic, approval workflows, &lt;br&gt;
and more. If you need advanced functionality, &lt;br&gt;
Jotform has it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10,000+ templates&lt;/li&gt;
&lt;li&gt;Payment integrations (Stripe, PayPal, Square)&lt;/li&gt;
&lt;li&gt;Conditional logic&lt;/li&gt;
&lt;li&gt;PDF generation&lt;/li&gt;
&lt;li&gt;E-signatures&lt;/li&gt;
&lt;li&gt;Approval workflows&lt;/li&gt;
&lt;li&gt;150+ integrations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan available (100 monthly &lt;br&gt;
responses). Paid plans start at $34/month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; Expensive at scale. No self-hosting. &lt;br&gt;
No open source. Overkill for simple contact forms.&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Paperform: Best for Beautiful Forms
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Marketers and creators who want &lt;br&gt;
visually stunning forms with a strong brand feel.&lt;/p&gt;

&lt;p&gt;Paperform focuses on beautiful, landing-page-style &lt;br&gt;
forms that feel like a designed experience rather &lt;br&gt;
than a generic form. Strong media embedding, &lt;br&gt;
payment support, and good conditional logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Beautiful form design&lt;/li&gt;
&lt;li&gt;Payment integrations&lt;/li&gt;
&lt;li&gt;Conditional logic&lt;/li&gt;
&lt;li&gt;Calculator fields&lt;/li&gt;
&lt;li&gt;Media embedding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Starts at $24/month. No free plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No free plan. No HTML form backend. &lt;br&gt;
No self-hosting. Expensive for what it offers &lt;br&gt;
compared to alternatives.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Typeform&lt;/th&gt;
&lt;th&gt;Formgrid&lt;/th&gt;
&lt;th&gt;Google Forms&lt;/th&gt;
&lt;th&gt;Tally&lt;/th&gt;
&lt;th&gt;Jotform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Form builder&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML endpoint&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable link&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hostable&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom branding&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File uploads&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free responses&lt;/td&gt;
&lt;td&gt;10/month&lt;/td&gt;
&lt;td&gt;50/month&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;100/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starting price&lt;/td&gt;
&lt;td&gt;$25/month&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;$34/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR friendly&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Which One Should You Use?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use Formgrid if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want a form backend AND a form builder in one tool&lt;/li&gt;
&lt;li&gt;You need to point an existing HTML form at an endpoint&lt;/li&gt;
&lt;li&gt;You care about open source and self-hosting&lt;/li&gt;
&lt;li&gt;You're paying too much for Typeform and want to cut costs&lt;/li&gt;
&lt;li&gt;You need to share a form link with someone non-technical&lt;/li&gt;
&lt;li&gt;GDPR compliance matters to you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Google Forms if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need something completely free&lt;/li&gt;
&lt;li&gt;Branding doesn't matter&lt;/li&gt;
&lt;li&gt;You're collecting internal data or running simple surveys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Tally if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want a clean Typeform-like experience for free&lt;/li&gt;
&lt;li&gt;You don't need an HTML form backend&lt;/li&gt;
&lt;li&gt;You're a Notion user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Jotform if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need advanced logic, payments, and workflows&lt;/li&gt;
&lt;li&gt;Budget is not a constraint&lt;/li&gt;
&lt;li&gt;You're building complex multi-step forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Use Paperform if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual design is your top priority&lt;/li&gt;
&lt;li&gt;You're building landing-page-style forms&lt;/li&gt;
&lt;li&gt;You need strong payment integration&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Typeform built a beautiful product, but it's hard to &lt;br&gt;
justify the price in 2026 when better alternatives &lt;br&gt;
exist at a fraction of the cost.&lt;/p&gt;

&lt;p&gt;If you're a developer who needs both a form backend &lt;br&gt;
for your static site AND a no-code builder for &lt;br&gt;
non-technical clients or teammates, there is no &lt;br&gt;
better option than Formgrid. It's the only tool &lt;br&gt;
on this list that does both — at $8/month.&lt;/p&gt;

&lt;p&gt;If you just need something free and simple, &lt;br&gt;
Google Forms or Tally will serve you well.&lt;/p&gt;

&lt;p&gt;But if you're paying $25/month or more for Typeform &lt;br&gt;
and not using its advanced conversational features, &lt;br&gt;
you're overpaying.&lt;/p&gt;

&lt;p&gt;You can try Formgrid free at &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; &lt;br&gt;
No credit card required.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full disclosure: I built Formgrid. I wrote this &lt;br&gt;
comparison as honestly as I could. If anything &lt;br&gt;
looks inaccurate, let me know in the comments.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #webdev #nocode #opensource #tutorial #forms&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>resources</category>
      <category>saas</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Netlify Forms Is Getting Expensive. Here Are the Best Alternatives in 2026</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Thu, 12 Mar 2026 22:37:29 +0000</pubDate>
      <link>https://dev.to/allenarduino/netlify-forms-is-getting-expensive-here-are-the-best-alternatives-in-2026-3a7k</link>
      <guid>https://dev.to/allenarduino/netlify-forms-is-getting-expensive-here-are-the-best-alternatives-in-2026-3a7k</guid>
      <description>&lt;p&gt;If you've been using Netlify Forms for your static site, you've &lt;br&gt;
probably noticed something uncomfortable: the moment your site &lt;br&gt;
When it starts getting real traffic, the costs and confusion start fast.&lt;/p&gt;

&lt;p&gt;Netlify's free plan gives you just &lt;strong&gt;100 form submissions per month&lt;/strong&gt;.&lt;br&gt;
That sounds reasonable until your contact form actually starts &lt;br&gt;
working.&lt;/p&gt;

&lt;p&gt;And here's the part that frustrates most developers: Netlify &lt;br&gt;
recently migrated to a &lt;strong&gt;credit-based billing system&lt;/strong&gt;. Form &lt;br&gt;
submissions now consume credits shared across your entire account.&lt;br&gt;
If one site exceeds its limits, &lt;strong&gt;all projects on your account &lt;br&gt;
get paused&lt;/strong&gt; — not just the one that went over.&lt;/p&gt;

&lt;p&gt;That's a stressful way to run a website.&lt;/p&gt;

&lt;p&gt;In this post, we'll break down exactly how Netlify Forms pricing works &lt;br&gt;
works, why developers are actively looking for alternatives, and &lt;br&gt;
walk you through setting up a better solution, step by step.&lt;/p&gt;


&lt;h2&gt;
  
  
  How Netlify Forms Pricing Actually Works
&lt;/h2&gt;

&lt;p&gt;Let's be specific, because the Netlify docs are genuinely confusing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the legacy free plan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 submissions per month per site&lt;/li&gt;
&lt;li&gt;Once you hit 100, Netlify automatically upgrades you to 
Forms Level 1 (1,000 submissions) and charges you at the 
end of the billing cycle&lt;/li&gt;
&lt;li&gt;Every level upgrade is automatic. You don't have to approve it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;On the new credit-based plans:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Form submissions consume credits from a shared monthly pool&lt;/li&gt;
&lt;li&gt;There is no longer a separate free tier for forms on 
new credit-based accounts&lt;/li&gt;
&lt;li&gt;If your credit pool runs out, all your projects. Not just 
The one with the form gets paused until the next billing cycle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The unpredictability is the real problem. A traffic spike, a &lt;br&gt;
contact form going slightly viral, or a bot hitting your form &lt;br&gt;
could burn through your credits and take down your entire &lt;br&gt;
Netlify account.&lt;/p&gt;

&lt;p&gt;For something as simple as a contact form, that's a lot of &lt;br&gt;
Risk to accept.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Other Problem: You're Locked Into Netlify
&lt;/h2&gt;

&lt;p&gt;Netlify Forms only works if your site is &lt;strong&gt;deployed on Netlify&lt;/strong&gt;.&lt;br&gt;
The moment you want to move to Vercel, Render, GitHub Pages, &lt;br&gt;
Cloudflare Pages, or your own VPS — your forms stop working entirely.&lt;/p&gt;

&lt;p&gt;You have to find a new solution anyway. Better to pick a &lt;br&gt;
platform-independent form backend from the start.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Best Netlify Forms Alternatives in 2026
&lt;/h2&gt;

&lt;p&gt;Here are the most reliable alternatives, starting with the &lt;br&gt;
best overall option.&lt;/p&gt;


&lt;h3&gt;
  
  
  1. Formgrid.dev: Best Overall Alternative
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt; is a privacy-first form backend&lt;br&gt;
that works with &lt;strong&gt;any HTML form on any website&lt;/strong&gt; regardless &lt;br&gt;
of where it's hosted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free plan includes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited forms&lt;/li&gt;
&lt;li&gt;50 submissions/month&lt;/li&gt;
&lt;li&gt;Email notifications on every submission&lt;/li&gt;
&lt;li&gt;Built-in spam protection (honeypot + rate limiting)&lt;/li&gt;
&lt;li&gt;Submission dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Premium plan: $8/month&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Higher submission limits&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;Custom redirect after submission&lt;/li&gt;
&lt;li&gt;Webhook support&lt;/li&gt;
&lt;li&gt;Priority support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Unlike Netlify Forms, Formgrid works on Vercel, GitHub Pages, &lt;br&gt;
Render, Cloudflare, or any custom server. You're never locked in.&lt;/p&gt;

&lt;p&gt;We'll walk through setting it up step by step below.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Formspree: Most Established
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://formspree.io" rel="noopener noreferrer"&gt;Formspree&lt;/a&gt; has been the go-to form backend&lt;br&gt;
since 2013. Battle-tested, reliable, and widely documented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free plan:&lt;/strong&gt; 50 submissions/month&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Paid plan:&lt;/strong&gt; starts at $10/month&lt;/p&gt;

&lt;p&gt;The downside is that paid plans get expensive if you're managing&lt;br&gt;
forms across multiple client sites. But for a single project, &lt;br&gt;
it's a solid choice.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Web3Forms: Most Generous Free Plan
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://web3forms.com" rel="noopener noreferrer"&gt;Web3Forms&lt;/a&gt; offers an impressive free &lt;br&gt;
tier — unlimited forms and up to 250 submissions per month &lt;br&gt;
at no cost.&lt;/p&gt;

&lt;p&gt;Setup takes about 2 minutes. No account required to get started.&lt;br&gt;
Just an API key sent to your email. Great for developers who &lt;br&gt;
want maximum free submissions without paying anything.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. Basin: Clean and Simple
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://usebasin.com" rel="noopener noreferrer"&gt;Basin&lt;/a&gt; is a straightforward form backend&lt;br&gt;
with a clean dashboard and good spam filtering. Their free plan&lt;br&gt;
allows 100 submissions per month — matching Netlify's free tier&lt;br&gt;
but without the platform lock-in.&lt;/p&gt;


&lt;h3&gt;
  
  
  5. Formspark: Good for High Volume
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://formspark.io" rel="noopener noreferrer"&gt;Formspark&lt;/a&gt; offers a one-time payment &lt;br&gt;
model instead of monthly subscriptions. You buy a bundle of &lt;br&gt;
submissions and use them at your own pace. Good option if your &lt;br&gt;
form traffic is unpredictable.&lt;/p&gt;


&lt;h2&gt;
  
  
  Side by Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Free Submissions&lt;/th&gt;
&lt;th&gt;Paid Plan&lt;/th&gt;
&lt;th&gt;Works Anywhere&lt;/th&gt;
&lt;th&gt;Email Notifications&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Netlify Forms&lt;/td&gt;
&lt;td&gt;100/month&lt;/td&gt;
&lt;td&gt;Credit-based&lt;/td&gt;
&lt;td&gt;❌ Netlify only&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formgrid.dev&lt;/td&gt;
&lt;td&gt;50/month&lt;/td&gt;
&lt;td&gt;$8/month flat&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formspree&lt;/td&gt;
&lt;td&gt;50/month&lt;/td&gt;
&lt;td&gt;$10/month&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web3Forms&lt;/td&gt;
&lt;td&gt;250/month&lt;/td&gt;
&lt;td&gt;$15/month&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basin&lt;/td&gt;
&lt;td&gt;100/month&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formspark&lt;/td&gt;
&lt;td&gt;250 lifetime&lt;/td&gt;
&lt;td&gt;One-time purchase&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  Step-by-Step: Setting Up Formgrid on Any Static Site
&lt;/h2&gt;

&lt;p&gt;Let's replace Netlify Forms with Formgrid right now. This takes &lt;br&gt;
under 5 minutes.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 1: Create Your Formgrid Account
&lt;/h3&gt;

&lt;p&gt;Head to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;https://formgrid.dev&lt;/a&gt; and sign &lt;br&gt;
up using &lt;strong&gt;Google&lt;/strong&gt; or &lt;strong&gt;Email&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F310xfqath10n7nc84kyz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F310xfqath10n7nc84kyz.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The free plan requires no credit card. You get unlimited forms &lt;br&gt;
and 50 submissions per month immediately.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 2: Create a New Form
&lt;/h3&gt;

&lt;p&gt;Once logged in, you'll land on your dashboard. Click &lt;strong&gt;New Form&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozar28d2u9v4whi05ogg.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your form a name. Something descriptive works well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Contact Form"&lt;/li&gt;
&lt;li&gt;"Portfolio Enquiry"&lt;/li&gt;
&lt;li&gt;"Landing Page Leads"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click &lt;strong&gt;Create Form&lt;/strong&gt;.&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 3: Copy Your Endpoint URL
&lt;/h3&gt;

&lt;p&gt;After creating your form, you'll be taken to the form's overview page.&lt;/p&gt;

&lt;p&gt;Click on the &lt;strong&gt;Overview&lt;/strong&gt; tab and copy your unique endpoint URL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl2n2wk1glt9b8u3dp89g.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It will look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://formgrid.dev/api/f/dcffghhnjj
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the URL your HTML form will submit to.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 4: Add the Form to Your HTML
&lt;/h3&gt;

&lt;p&gt;Here is a complete, copy-paste-ready contact form. Replace &lt;br&gt;
&lt;code&gt;YOUR_ENDPOINT_URL&lt;/code&gt; with the URL you just copied:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"YOUR_ENDPOINT_URL"&lt;/span&gt; &lt;span class="na"&gt;method=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Your Name&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt; 
    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"John Doe."&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt; 
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Email Address&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt; 
    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"john@example.com"&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt; 
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;label&lt;/span&gt; &lt;span class="na"&gt;for=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Your Message&lt;span class="nt"&gt;&amp;lt;/label&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;textarea&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"message"&lt;/span&gt; 
    &lt;span class="na"&gt;rows=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; 
    &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"How can I help you?"&lt;/span&gt;
    &lt;span class="na"&gt;required&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Honeypot: keeps bots out, invisible to real users --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none."&lt;/span&gt; 
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="c"&gt;&amp;lt;!-- Optional: redirect after submission --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"hidden"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_redirect"&lt;/span&gt; 
    &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"https://yoursite.com/thank-you"&lt;/span&gt; 
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send Message&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's your entire form. No server. No PHP. No backend code.&lt;/p&gt;




&lt;h3&gt;
  
  
  Step 5: Email Notifications Are Already Set Up
&lt;/h3&gt;

&lt;p&gt;Good news! You don't have to configure anything here.&lt;/p&gt;

&lt;p&gt;Formgrid automatically uses the email address you signed &lt;br&gt;
up with as your default notification email. The moment &lt;br&gt;
someone submits your form, the alert goes straight to &lt;br&gt;
your inbox. No extra setup required.&lt;/p&gt;

&lt;p&gt;If you'd like, submissions can be sent to a different email. &lt;br&gt;
For example, a client's email or a team inbox, go to &lt;br&gt;
your form's &lt;strong&gt;Settings&lt;/strong&gt; tab, find &lt;strong&gt;Email Notifications&lt;/strong&gt;, &lt;br&gt;
and update it there.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kp2sswbjh2dvwvi41ed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8kp2sswbjh2dvwvi41ed.png" alt=" " width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this point on, every time someone fills out your form &lt;br&gt;
You'll get an email like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0lu1tjfb1gpstvhesgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0lu1tjfb1gpstvhesgu.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Submitter's name&lt;/li&gt;
&lt;li&gt;Their email address&lt;/li&gt;
&lt;li&gt;Their message&lt;/li&gt;
&lt;li&gt;Timestamp of the submission&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Submissions come straight to your inbox. No more logging in&lt;br&gt;
just to check if someone reached out.&lt;/p&gt;

&lt;p&gt;That said, if you prefer to review, search, or manage all &lt;br&gt;
Your submissions are in one place, and everything is also saved in &lt;br&gt;
Your Formgrid dashboard. Every submission is stored there &lt;br&gt;
automatically, so nothing ever gets lost, even if an email &lt;br&gt;
slips into spam.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;View all your submissions anytime from the dashboard:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9avjnvjdz3vq950iznj8.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Step 6: Test Your Form
&lt;/h3&gt;

&lt;p&gt;Fill out your own form and submit it. Within seconds, you &lt;br&gt;
should receive:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A confirmation email in your inbox&lt;/li&gt;
&lt;li&gt;The submission is logged in your Formgrid dashboard&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you don't receive the email, check your spam folder and &lt;br&gt;
Make sure you saved the notification email in settings.&lt;/p&gt;


&lt;h3&gt;
  
  
  Optional: Using JavaScript for a Better UX
&lt;/h3&gt;

&lt;p&gt;If you want to submit the form without a full page reload, &lt;br&gt;
here's a clean fetch-based approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;contact-form&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_ENDPOINT_URL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;Thanks! Your message was sent.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;Something went wrong. Please try again.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;innerHTML&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;p&amp;gt;Network error. Please try again.&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add &lt;code&gt;id="contact-form"&lt;/code&gt; to your form element, and this &lt;br&gt;
script handles the rest. No page redirect, clean user &lt;br&gt;
experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Use a Form Service vs Building Your Own Backend
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Use Formgrid or a form service if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need a contact, enquiry, or waitlist form&lt;/li&gt;
&lt;li&gt;You're building a static site, landing page, or portfolio&lt;/li&gt;
&lt;li&gt;You want instant email notifications without configuring SMTP&lt;/li&gt;
&lt;li&gt;You want spam protection without implementing it yourself&lt;/li&gt;
&lt;li&gt;You want a submission dashboard without building one&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Build your own backend if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need custom business logic on form submission&lt;/li&gt;
&lt;li&gt;You need to write data to your own database directly&lt;/li&gt;
&lt;li&gt;You're building a full SaaS product with complex flows&lt;/li&gt;
&lt;li&gt;You need custom authentication tied to submissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For 90% of landing pages, portfolios, and indie projects — &lt;br&gt;
A form service is more than enough. You don't need a backend &lt;br&gt;
for a contact form.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Netlify Forms was a great idea that got complicated. &lt;br&gt;
Credit-based billing, platform lock-in, and the risk of &lt;br&gt;
Your entire account is getting paused over a form submission &lt;br&gt;
Spikes make it hard to recommend anything serious in 2026.&lt;/p&gt;

&lt;p&gt;The good news: switching takes less than 10 minutes.&lt;/p&gt;

&lt;p&gt;With &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid.dev&lt;/a&gt; you get:&lt;/p&gt;

&lt;p&gt;✅ Flat predictable pricing&lt;br&gt;&lt;br&gt;
✅ Works on any hosting platform&lt;br&gt;&lt;br&gt;
✅ Instant email notifications&lt;br&gt;&lt;br&gt;
✅ Built-in spam protection&lt;br&gt;&lt;br&gt;
✅ A clean submission dashboard&lt;br&gt;&lt;br&gt;
✅ No backend required  &lt;/p&gt;

&lt;p&gt;If you're building on GitHub Pages, Vercel, Render, &lt;br&gt;
Cloudflare Pages, or any static site generator like &lt;br&gt;
Hugo, Jekyll, Astro, or Eleventy, Formgrid plugs in &lt;br&gt;
with a single line change to your form's action attribute.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Start free at formgrid.dev&lt;/a&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>serverless</category>
      <category>tooling</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
