<?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>Formspree Custom Email Templates Cost $60 Per Month. Here is the $29 Alternative.</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Thu, 14 May 2026 14:14:05 +0000</pubDate>
      <link>https://dev.to/allenarduino/formspree-custom-email-templates-cost-60-per-month-here-is-the-29-alternative-54h9</link>
      <guid>https://dev.to/allenarduino/formspree-custom-email-templates-cost-60-per-month-here-is-the-29-alternative-54h9</guid>
      <description>&lt;p&gt;You set up Formspree for your contact form or &lt;br&gt;
event registration. Submissions arrive in your inbox. You open the first one, and it looks 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%2Fu1yw6jfar6wrxazc08wt.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%2Fu1yw6jfar6wrxazc08wt.png" alt=" " width="800" height="828"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Raw field data. Internal Formspree variables. &lt;br&gt;
No structure. No labels. No context.&lt;/p&gt;

&lt;p&gt;You think: I will upgrade to get better email formatting. &lt;br&gt;
You open Formspree's pricing page and discover that custom HTML email templates are locked behind their Business plan at $60 per month.&lt;/p&gt;

&lt;p&gt;That is the moment most people start looking for an alternative.&lt;/p&gt;

&lt;p&gt;This post covers exactly why Formspree charges so much for custom templates, what you actually get for that price, and how Formgrid gives you the same capability for $29 per month with a lead pipeline included.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Formspree Charges $60 for Custom Email Templates
&lt;/h2&gt;

&lt;p&gt;Formspree's pricing tiers look reasonable until you need anything beyond basic notifications.&lt;br&gt;
Formspree Free: $0/month&lt;br&gt;
50 submissions, basic notifications&lt;br&gt;
Formspree Basic: $10/month&lt;br&gt;
200 submissions, still basic notifications&lt;br&gt;
Formspree Plus: $40/month&lt;br&gt;
1,000 submissions, still basic notifications&lt;br&gt;
Formspree Business: $60/month&lt;br&gt;
Custom email templates finally available&lt;/p&gt;

&lt;p&gt;You have to pay $60 per month just to control how your notification emails look. There is no middle ground. No custom templates at $20 or &lt;br&gt;
$30. Just $60 or raw data dumps forever.&lt;/p&gt;

&lt;p&gt;For a small business owner, an event organizer, or a freelancer who needs clean, organized emails that their team can actually read, $60 per month is a hard number to justify.&lt;/p&gt;

&lt;p&gt;Especially when the alternative costs $29.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a Professional Form Notification Email Actually Looks Like
&lt;/h2&gt;

&lt;p&gt;Instead of receiving a raw data dump every time someone submits your form, imagine receiving 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%2Fnjgpgd8470kygupsmkcy.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%2Fnjgpgd8470kygupsmkcy.png" alt="Custom email template in Formgrid showing clean, organized sections" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Clean. Organized. Readable by anyone on your team whether they are a developer, an event coordinator, or an office manager who just needs to know who submitted and what they said.&lt;/p&gt;

&lt;p&gt;That is what $29 per month gets you with Formgrid.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Formgrid Gives You for $29 Per Month
&lt;/h2&gt;

&lt;p&gt;Formgrid is an open-source form backend and form builder. The Business plan at $29 per month includes full HTML email template control using Mustache templating alongside everything else a growing business needs.&lt;/p&gt;

&lt;p&gt;Here is the complete Business plan at $29:&lt;br&gt;
Custom HTML email templates&lt;br&gt;
Auto-responder emails to submitters&lt;br&gt;
Multiple notification recipients&lt;br&gt;
Unlimited Google Sheets sync&lt;br&gt;
Webhooks and Zapier integration&lt;br&gt;
15,000 submissions per month&lt;br&gt;
Priority support&lt;br&gt;
Direct access to the founder&lt;/p&gt;

&lt;p&gt;Formspree charges $60 per month for custom templates alone. Formgrid charges $29 per month for templates plus every feature listed above.&lt;/p&gt;

&lt;p&gt;That is $31 per month less for significantly more.&lt;/p&gt;
&lt;h2&gt;
  
  
  How Custom Email Templates Work in Formgrid
&lt;/h2&gt;

&lt;p&gt;Formgrid uses Mustache templating for email customization. &lt;br&gt;
It is a simple, widely used templating language that lets you write an HTML email with placeholders that get replaced with real submission data automatically.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Available Template 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 attribute

&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
  &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
&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;h3&gt;
  
  
  Option A: The Simple Loop for Any Form
&lt;/h3&gt;

&lt;p&gt;If you want clean, formatted emails without thinking about structure, use the 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. No internal fields. No raw data. No mess. Clean, readable output for every submission automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B: Sectioned Template for Complex Forms
&lt;/h3&gt;

&lt;p&gt;If your form has multiple sections like a registration form with attendee details, session selection, dietary requirements, and payment, you can group fields into sections 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; {{ name }}&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;&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;&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; {{ date }}&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;
    Payment
  &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;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;&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;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 like &lt;code&gt;{{ name }}&lt;/code&gt;, &lt;br&gt;
&lt;code&gt;{{ workshopName }}&lt;/code&gt;, and &lt;code&gt;{{ totalAmount }}&lt;/code&gt; &lt;br&gt;
must match the name attributes of your form inputs exactly.&lt;/p&gt;
&lt;h3&gt;
  
  
  Custom Subject Lines
&lt;/h3&gt;

&lt;p&gt;You can control the email subject line using the &lt;code&gt;_subject&lt;/code&gt; hidden field in your 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;"New Registration from {{ name }}"&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;Every submission email now has a meaningful subject line like "New Registration from Sarah Johnson" instead of the generic one &lt;br&gt;
"New form submission."&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Set Up Custom Email Templates in Formgrid
&lt;/h2&gt;

&lt;p&gt;Custom email templates are available on the Business plan at $29 per 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 form, and click the Settings 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%2F5wdsoxjh25y6sjxmhmx3.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%2F5wdsoxjh25y6sjxmhmx3.png" alt="Formgrid form settings tab" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Find the Custom Email Template Section
&lt;/h3&gt;

&lt;p&gt;Scroll down to the Custom Email Template section. &lt;br&gt;
In the Business plan, you will see the full template editor. On free or Premium, you will see a prompt to upgrade.&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%2Fcgnp5fhfen6snz58in2y.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%2Fcgnp5fhfen6snz58in2y.png" alt="Formgrid custom email template editor" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&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 point &lt;br&gt;
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. Use the simple loop for basic forms or build a sectioned template for complex registration forms. The available variables panel shows every variable you can use.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: Preview and Save
&lt;/h3&gt;

&lt;p&gt;Click Preview to see exactly how your email will look with sample data substituted in. When you are happy, click Save Template.&lt;/p&gt;

&lt;p&gt;From this point on, every submission to your form will use your custom template. Clean, organized, and formatted exactly the way you designed.&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. Your notification email should arrive formatted exactly as you designed.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Real Example: What Annie's Event Emails Look Like Now
&lt;/h2&gt;

&lt;p&gt;One of Formgrid's customers runs endurance horse riding events in San Diego. She was using a basic form backend and receiving raw field data for every rider registration. Her 75-year-old event manager was receiving emails she could not read.&lt;/p&gt;

&lt;p&gt;After switching to Formgrid's Business plan, she built a custom email template that organizes every registration into clean sections: rider information, horse details, division selection, and emergency &lt;br&gt;
contacts. Every registration email now arrives looking like a professional document that her event manager can act on immediately.&lt;/p&gt;

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

&lt;p&gt;She pays $29 per month. Formspree would charge $60 per month for custom templates alone, without any of the lead tracking, follow-up reminders, or Google Sheets sync that Formgrid includes.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Formgrid Includes Beyond Email Templates
&lt;/h2&gt;

&lt;p&gt;This is where the comparison becomes completely one-sided.&lt;/p&gt;

&lt;p&gt;Formspree Business at $60 per month gives you custom email templates plus higher submission limits. That is essentially it.&lt;/p&gt;

&lt;p&gt;Formgrid Business at $29 per month gives you:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom HTML email templates&lt;/strong&gt;&lt;br&gt;
Full Mustache templating with section headers, &lt;br&gt;
branded colors, and organized field groups. Preview before going live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lead pipeline&lt;/strong&gt;&lt;br&gt;
Every submission becomes a tracked lead with &lt;br&gt;
New, Contacted, and Converted stages. Your conversion rate updates automatically.&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%2Fjbb7apqksbzpmgijsmj5.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%2Fjbb7apqksbzpmgijsmj5.png" alt="Formgrid leads tab showing tracked submissions" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes on every lead&lt;/strong&gt;&lt;br&gt;
After every conversation, add a private note &lt;br&gt;
directly on the lead. What they said. What you quoted. What is the next step?&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%2Fjpl2u4j43dpklj6zfzhp.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%2Fjpl2u4j43dpklj6zfzhp.png" alt="Lead detail view showing notes field in Formgrid" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow-up reminders&lt;/strong&gt;&lt;br&gt;
Set a follow-up date on any lead and get an email on that date with their details and your notes. Warm leads never go cold.&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%2Fohsj1btyitpsmn08cc31.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%2Fohsj1btyitpsmn08cc31.png" alt="Follow up date picker on lead detail page" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Sheets sync&lt;/strong&gt;&lt;br&gt;
Every submission appears as a new row in your Google Sheet automatically. No Zapier needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auto-responder emails&lt;/strong&gt;&lt;br&gt;
Automatically acknowledge every lead the moment they submit your form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiple notification recipients&lt;/strong&gt;&lt;br&gt;
Your whole team gets notified simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webhooks&lt;/strong&gt;&lt;br&gt;
Connect to Slack, Notion, Zapier, and any other tool you already use.&lt;/p&gt;

&lt;p&gt;Formspree does not have a lead pipeline at any price point. There are no notes on submissions. No follow-up reminders. No conversion tracking. Just submissions in a flat list.&lt;/p&gt;

&lt;p&gt;You get all of that from Formgrid at $29 per &lt;br&gt;
month versus paying $60 per month to Formspree just for email templates.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Switch From Formspree to Formgrid
&lt;/h2&gt;

&lt;p&gt;If you are already using Formspree, the migration takes about five minutes, and your HTML form does not change at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign up for free at formgrid.dev. &lt;br&gt;
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%2Fa590ejt2zmv83285bt64.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%2Fa590ejt2zmv83285bt64.png" alt="Formgrid signup page" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Create a new form and copy your &lt;br&gt;
Formgrid endpoint URL from the Overview 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%2Flafra8ygljruiylpilbc.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%2Flafra8ygljruiylpilbc.png" alt="Formgrid endpoint URL on form details page" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Replace your Formspree endpoint &lt;br&gt;
in your HTML form with your Formgrid endpoint. &lt;br&gt;
One line change:&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;!-- Before: Formspree --&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://formspree.io/f/your-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="c"&gt;&amp;lt;!-- After: Formgrid --&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/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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Upgrade to the Business plan at $29 per month and build your custom email template in the Settings tab.&lt;/p&gt;

&lt;p&gt;That is the entire migration. Your form works exactly as before. Every submission now arrives as a clean, organized email you designed plus a tracked lead in your pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full 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;Formspree Business&lt;/th&gt;
&lt;th&gt;Formgrid Business&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Custom email templates&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monthly price&lt;/td&gt;
&lt;td&gt;$60&lt;/td&gt;
&lt;td&gt;$29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Submissions per month&lt;/td&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;15,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead pipeline&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes on leads&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow up reminders&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversion tracking&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 sync&lt;/td&gt;
&lt;td&gt;❌ Extra cost&lt;/td&gt;
&lt;td&gt;✅ Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-responder emails&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple recipients&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;✅&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;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;GDPR friendly&lt;/td&gt;
&lt;td&gt;⚠️ Partial&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 costs $31 per month less and includes &lt;br&gt;
7,500 more monthly submissions, plus a complete lead management system that Formspree does not offer at any price.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Use Formgrid Business if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You are paying $60 per month for Formspree &lt;br&gt;
Business and want to cut your bill in half while getting more features.&lt;/p&gt;

&lt;p&gt;You manage event registrations, client intake forms, or any complex form where readable, organized emails matter.&lt;/p&gt;

&lt;p&gt;You want to track what happens to form submissions after they arrive not just collect them in a flat list.&lt;/p&gt;

&lt;p&gt;You need your whole team to see new submissions in Google Sheets without anyone logging into a dashboard.&lt;/p&gt;

&lt;p&gt;You care about open source, self-hosting, and complete data ownership.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stay on Formspree if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You are deeply integrated with Formspree's &lt;br&gt;
specific features and the migration cost &lt;br&gt;
outweighs the savings.&lt;/p&gt;

&lt;p&gt;You only need a basic contact form with simple &lt;br&gt;
notifications and have no plans to scale.&lt;/p&gt;

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

&lt;p&gt;Formspree is a reliable product that does what it promises. But charging $60 per month just for custom email templates in 2026 is hard to justify when Formgrid offers the same capability &lt;br&gt;
at $29 per month with a complete lead management system on top.&lt;/p&gt;

&lt;p&gt;If you are currently paying Formspree $60 per month for custom templates, you are overpaying by $31 every month. Over a year, that is $372 spent on a feature that costs half as much elsewhere, with significantly more included.&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;br&gt;
No credit card required. Business plan at $29 per month. Switch from Formspree in five minutes, and your form does not change at all.&lt;/p&gt;

&lt;p&gt;If you have questions about switching or setting up custom email templates for your specific situation, reply in the comments or email &lt;br&gt;
&lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt; directly.&lt;/p&gt;




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

</description>
    </item>
    <item>
      <title>Formspree Charges $90/month for Google Sheets. Here Are Better Options in 2026.</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Wed, 13 May 2026 00:14:11 +0000</pubDate>
      <link>https://dev.to/allenarduino/formspree-charges-90-for-google-sheets-here-are-better-options-in-2026-dee</link>
      <guid>https://dev.to/allenarduino/formspree-charges-90-for-google-sheets-here-are-better-options-in-2026-dee</guid>
      <description>&lt;p&gt;If you just opened your Formspree settings and discovered that Google Sheets integration requires their Business plan at $90 per month, you are not alone in being surprised by that number.&lt;/p&gt;

&lt;p&gt;For most developers and small business owners, $90 per month just to get form submissions into a spreadsheet is a hard number to justify. &lt;br&gt;
Especially when Google Sheets is free, and the integration itself is not a particularly complex feature.&lt;/p&gt;

&lt;p&gt;This post covers the best alternatives to Formspree for teams that need form submissions to go to Google Sheets automatically, without paying $90 per month to make it happen.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Formspree Charges So Much for Google Sheets
&lt;/h2&gt;

&lt;p&gt;Formspree's pricing tiers look reasonable at first glance. &lt;br&gt;
The Basic plan starts at $15 per month. But Google Sheets integration is locked to the Business plan, which starts at $90 per month.&lt;/p&gt;

&lt;p&gt;That is not a typo. $90 per month. For a spreadsheet integration.&lt;/p&gt;

&lt;p&gt;For a developer who just wants form submissions organized in a shared sheet so their client or team can see them without logging into a separate dashboard, paying $90 per month is simply not sensible.&lt;/p&gt;

&lt;p&gt;The good news is that several alternatives include Google Sheets sync at a fraction of that price or completely free. Here is the full comparison.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Best Formspree Alternatives With Google Sheets Sync
&lt;/h2&gt;


&lt;h3&gt;
  
  
  1. Formgrid: Google Sheets Sync on Every Plan, Including Free
&lt;/h3&gt;

&lt;p&gt;Formgrid includes Google Sheets sync on all plans, including the free plan. Not locked behind a premium tier. Not an add-on that costs extra. Included from the moment you sign up.&lt;/p&gt;

&lt;p&gt;The free plan syncs your first 10 rows per form. The Premium plan at $12 per month syncs up to 500 rows per month. The Business plan at $29 per month syncs unlimited rows automatically.&lt;/p&gt;

&lt;p&gt;At $29 per month for unlimited Google Sheets sync, &lt;br&gt;
Formgrid costs $61 per month, less than Formspree for the same feature.&lt;/p&gt;

&lt;p&gt;But the price difference is only part of the story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes Formgrid different from Formspree:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Formspree receives your form submissions and forwards them to your inbox. That is where the workflow ends.&lt;/p&gt;

&lt;p&gt;Formgrid turns every submission into a tracked lead with a status, a notes field, and a follow-up reminder you can set in one click. Your conversion rate updates automatically as you move leads through the pipeline.&lt;/p&gt;

&lt;p&gt;At the top of your leads tab, you see your full &lt;br&gt;
pipeline at a glance:&lt;br&gt;
New: 12    Contacted: 8    Converted: 3&lt;br&gt;
Conversion rate: 13%&lt;/p&gt;

&lt;p&gt;That is the number Formspree can never give you.&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%2Fhgxb4tk93agho0nxvof9.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%2Fhgxb4tk93agho0nxvof9.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up Google Sheets sync in Formgrid:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 1: Create a form in your Formgrid 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="Formgrid dashboard and new form creation" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Copy your unique endpoint URL from the &lt;br&gt;
Overview tab and paste it into your HTML form action attribute.&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="Formgrid endpoint URL on form details page" width="800" height="447"&gt;&lt;/a&gt;&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://api.formgrid.dev/f/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="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&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;Step 3: Open the Integrations tab in your Formgrid 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%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="Formgrid integrations tab" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Click Create blank Google Sheet.&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="Formgrid Google Sheets integration section" width="800" height="443"&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%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="Create blank Google Sheet button in Formgrid" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 5: Share the sheet with the Formgrid service account email as an Editor. Copy the email directly from your &lt;br&gt;
Formgrid dashboard to avoid typing errors.&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="Formgrid service account email copy button" width="800" height="337"&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%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="Google Sheets editor access setting" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Paste your Google Sheet URL into &lt;br&gt;
Formgrid and click Connect.&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="Paste Google Sheet URL into Formgrid" width="800" height="253"&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%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="Google Sheets connected successfully in Formgrid" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this point, every form submission appears as a new row in your Google Sheet automatically within seconds. Column headers are created from your form field names on the very first submission. &lt;br&gt;
No manual setup 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%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="Google Sheets showing form submissions as rows" width="800" height="752"&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="Google Sheets rows with timestamp" width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formgrid 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;th&gt;Google Sheets&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;25/month&lt;/td&gt;
&lt;td&gt;10 rows per form&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;td&gt;$12/month&lt;/td&gt;
&lt;td&gt;1,000/month&lt;/td&gt;
&lt;td&gt;500 rows/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;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The bottom line on Formgrid:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You pay $29 per month for unlimited Google Sheets sync, a full lead pipeline, follow-up reminders, UTM source tracking, custom email templates, and 15,000 submissions per month.&lt;/p&gt;

&lt;p&gt;Formspree charges $90 per month for Google Sheets &lt;br&gt;
sync alone with none of the lead management features.&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;


&lt;h3&gt;
  
  
  2. Netlify Forms: Free Google Sheets Via Zapier if You Are on Netlify
&lt;/h3&gt;

&lt;p&gt;Netlify Forms is built into the Netlify platform. &lt;br&gt;
If your site is already deployed on Netlify, it is the lowest friction option available. Add the Netlify attribute to your form tag, and submissions are captured 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;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;The catch is that native Google Sheets sync is not included. You would need to use Zapier or Make to push submissions to a spreadsheet, which adds another monthly cost on top of whatever Netlify plan you are on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Sites already hosted on Netlify &lt;br&gt;
that do not need Google Sheets sync or are comfortable paying for Zapier separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Anyone who wants Google Sheets sync included without adding a Zapier subscription.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Basin: Affordable but Limited
&lt;/h3&gt;

&lt;p&gt;Basin is a minimal form backend that keeps things simple. It supports HTML form endpoints, email notifications, and basic integrations.&lt;/p&gt;

&lt;p&gt;Google Sheets sync is available on Basin but requires connecting through Zapier. The paid plan starts at $12 per month, which &lt;br&gt;
is competitive on price, but you still need a separate Zapier subscription to get data into Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a very minimal form backend and are already paying for Zapier for other workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Anyone who wants native Google Sheets sync without a Zapier dependency.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. Getform (Now Forminit): Decent but Pricier
&lt;/h3&gt;

&lt;p&gt;Getform rebranded to Forminit in early 2026. &lt;br&gt;
The product is largely the same. It is a clean, developer-friendly form backend with a good dashboard.&lt;/p&gt;

&lt;p&gt;Google Sheets integration is available on paid plans starting at $19 per month. That is significantly cheaper than Formspree's $90 per month, but still more expensive than Formgrid's $12 per month for &lt;br&gt;
similar functionality.&lt;/p&gt;

&lt;p&gt;There is no form builder and no lead management pipeline. Forminit is purely a form backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a clean, simple form backend with Google Sheets at a reasonable price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Anyone who needs a form builder or wants to track leads after they arrive.&lt;/p&gt;


&lt;h3&gt;
  
  
  5. Web3Forms: Completely Free With Google Sheets
&lt;/h3&gt;

&lt;p&gt;Web3Forms offers a free tier that includes basic form handling and some integrations. Google Sheets connectivity is available through their free plan.&lt;/p&gt;

&lt;p&gt;The free plan is genuinely useful for low-volume projects. But the feature set is limited compared to paid options. No lead management. No file uploads. No follow-up reminders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a completely free option for low-volume forms with basic Google Sheets sync.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Anyone managing real business leads who needs more than basic submission forwarding.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Full Comparison
&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;Google Sheets&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Lead Pipeline&lt;/th&gt;
&lt;th&gt;Form Builder&lt;/th&gt;
&lt;th&gt;Open Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Formspree&lt;/td&gt;
&lt;td&gt;$90/month&lt;/td&gt;
&lt;td&gt;$15 to $90/month&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formgrid&lt;/td&gt;
&lt;td&gt;Free on all plans&lt;/td&gt;
&lt;td&gt;$0 to $29/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netlify Forms&lt;/td&gt;
&lt;td&gt;Via Zapier only&lt;/td&gt;
&lt;td&gt;Bundled with Netlify&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basin&lt;/td&gt;
&lt;td&gt;Via Zapier only&lt;/td&gt;
&lt;td&gt;$12/month&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forminit&lt;/td&gt;
&lt;td&gt;$19/month+&lt;/td&gt;
&lt;td&gt;$19/month+&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web3Forms&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  What Happens After Submissions Hit Your Sheet
&lt;/h2&gt;

&lt;p&gt;This is the part most comparisons skip entirely.&lt;/p&gt;

&lt;p&gt;Every tool on this list can get form submissions into a Google Sheet. The real question is what happens to those submissions after they arrive.&lt;/p&gt;

&lt;p&gt;With Formspree, Netlify Forms, Basin, Forminit, and Web3Forms, the answer is nothing. The data lands in the sheet. What you do with it is entirely up to you.&lt;/p&gt;

&lt;p&gt;With Formgrid, the submission also becomes a tracked lead in your pipeline. You mark it Contacted when you follow up. You mark it &lt;br&gt;
Converted when it becomes a customer. &lt;br&gt;
You add notes from every conversation. &lt;br&gt;
You set a follow-up reminder and get an email on the exact date you need to act.&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%2Fc0circ45ya7viy4olo3s.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%2Fc0circ45ya7viy4olo3s.png" alt=" " width="800" height="395"&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%2Fjpl2u4j43dpklj6zfzhp.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%2Fjpl2u4j43dpklj6zfzhp.png" alt="Lead detail view showing notes field in Formgrid" width="800" height="563"&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%2Fohsj1btyitpsmn08cc31.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%2Fohsj1btyitpsmn08cc31.png" alt="Follow up date picker on lead detail page" 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%2Fqomp8ege8stlze7tpq7p.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%2Fqomp8ege8stlze7tpq7p.png" alt="Follow up reminder email from Formgrid" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a developer building a portfolio site, where submissions are just notifications, that extra capability adds no value. &lt;br&gt;
But for a small business where every form submission is a potential customer, having a system that tracks what happens after the submission arrives is the difference between winning that customer &lt;br&gt;
and losing them to a buried email.&lt;/p&gt;
&lt;h2&gt;
  
  
  A Real Example
&lt;/h2&gt;

&lt;p&gt;One of Formgrid's customers runs endurance horse riding events in San Diego. She manages registrations through a form on her website. Before Formgrid, every registration arrived as an unformatted email that her non-technical event manager struggled to read.&lt;/p&gt;

&lt;p&gt;She connected Formgrid to her registration form, set up Google Sheets sync, and configured a custom email template so every registration &lt;br&gt;
arrived as a clean, structured email with labeled fields her team could actually read.&lt;/p&gt;

&lt;p&gt;Every registration now appears as a new row in a shared Google Sheet that her whole team accesses in real time. Every registrant is &lt;br&gt;
tracked as a lead in her pipeline. She knows exactly how many riders &lt;br&gt;
are registered, confirmed, and pending.&lt;/p&gt;

&lt;p&gt;She is on the Business plan at $29 per month. &lt;br&gt;
Formspree would charge $90 per month for Google Sheets alone, without any of the lead tracking or custom email features.&lt;/p&gt;

&lt;p&gt;"The level of personal support was impressive."&lt;br&gt;
&lt;strong&gt;A. Libby, Event Manager, San Diego Endurance Riders&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Switch From Formspree to Formgrid
&lt;/h2&gt;

&lt;p&gt;If you are already using Formspree, the migration takes about five minutes, and your HTML form does not change at all.&lt;/p&gt;

&lt;p&gt;Step 1: Sign up for free at formgrid.dev. &lt;br&gt;
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%2Fa590ejt2zmv83285bt64.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%2Fa590ejt2zmv83285bt64.png" alt="Formgrid signup page" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Create a new form and copy your Formgrid endpoint URL.&lt;/p&gt;

&lt;p&gt;Step 3: Replace your Formspree endpoint in your HTML form with your Formgrid endpoint URL. One line change:&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;!-- Before: Formspree --&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://formspree.io/f/your-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="c"&gt;&amp;lt;!-- After: Formgrid --&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://api.formgrid.dev/forms/
your-form-id/submissions"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Connect your Google Sheet in the Integrations tab. Takes about three minutes as shown above.&lt;/p&gt;

&lt;p&gt;That is the entire migration. &lt;br&gt;
Your form works exactly as before. &lt;br&gt;
You now have Google Sheets sync &lt;br&gt;
at $29 per month instead of $90 per month, plus a full lead pipeline you did not have before.&lt;/p&gt;
&lt;h2&gt;
  
  
  Is There Any Reason to Stay on Formspree?
&lt;/h2&gt;

&lt;p&gt;To be honest, yes. One situation.&lt;/p&gt;

&lt;p&gt;If you are a developer using Formspree purely as a form backend for static sites where submissions are just notifications and you &lt;br&gt;
have no need for Google Sheets, Formspree &lt;br&gt;
at $10 per month is a reasonable choice. It is reliable and well-documented.&lt;/p&gt;

&lt;p&gt;But the moment Google Sheets sync is part of your requirements, Formspree becomes one of the most expensive ways to get it. &lt;br&gt;
Every other tool on this list gets you there for significantly less.&lt;/p&gt;
&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Paying $90 per month for Google Sheets integration is not something most developers or small business owners should accept as normal. &lt;br&gt;
It is a pricing decision Formspree made, and there are better options available at every price point.&lt;/p&gt;

&lt;p&gt;If you want native Google Sheets sync included without Zapier and without paying $90 per month, Formgrid is the most complete &lt;br&gt;
option available. &lt;/p&gt;

&lt;p&gt;You get Google Sheets sync on every plan, including free, a full lead pipeline, follow-up reminders, and UTM tracking. &lt;br&gt;
and a form builder in one tool, starting at $0 per month.&lt;/p&gt;

&lt;p&gt;[Start free at formgrid.dev](If you just opened your Formspree settings and discovered that Google Sheets integration requires their Business plan at $90 per month, you are not alone in being surprised by that number.&lt;/p&gt;

&lt;p&gt;For most developers and small business owners, $90 per month just to get form submissions into a spreadsheet is a hard number to justify. &lt;br&gt;
Especially when Google Sheets is free, and the integration itself is not a particularly complex feature.&lt;/p&gt;

&lt;p&gt;This post covers the best alternatives to Formspree for teams that need form submissions to go to Google Sheets automatically, without paying $90 per month to make it happen.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Formspree Charges So Much for Google Sheets
&lt;/h2&gt;

&lt;p&gt;Formspree's pricing tiers look reasonable at first glance. &lt;br&gt;
The Basic plan starts at $15 per month. But Google Sheets integration is locked to the Business plan, which starts at $90 per month.&lt;/p&gt;

&lt;p&gt;That is not a typo. $90 per month. For a spreadsheet integration.&lt;/p&gt;

&lt;p&gt;For a developer who just wants form submissions organized in a shared sheet so their client or team can see them without logging into a separate dashboard, paying $90 per month is simply not sensible.&lt;/p&gt;

&lt;p&gt;The good news is that several alternatives include Google Sheets sync at a fraction of that price or completely free. Here is the full comparison.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Best Formspree Alternatives With Google Sheets Sync
&lt;/h2&gt;


&lt;h3&gt;
  
  
  1. Formgrid: Google Sheets Sync on Every Plan, Including Free
&lt;/h3&gt;

&lt;p&gt;Formgrid includes Google Sheets sync on all plans, including the free plan. Not locked behind a premium tier. Not an add-on that costs extra. Included from the moment you sign up.&lt;/p&gt;

&lt;p&gt;The free plan syncs your first 10 rows per form. The Premium plan at $12 per month syncs up to 500 rows per month. The Business plan at $29 per month syncs unlimited rows automatically.&lt;/p&gt;

&lt;p&gt;At $29 per month for unlimited Google Sheets sync, &lt;br&gt;
Formgrid costs $61 per month, less than Formspree for the same feature.&lt;/p&gt;

&lt;p&gt;But the price difference is only part of the story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What makes Formgrid different from Formspree:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Formspree receives your form submissions and forwards them to your inbox. That is where the workflow ends.&lt;/p&gt;

&lt;p&gt;Formgrid turns every submission into a tracked lead with a status, a notes field, and a follow-up reminder you can set in one click. Your conversion rate updates automatically as you move leads through the pipeline.&lt;/p&gt;

&lt;p&gt;At the top of your leads tab, you see your full &lt;br&gt;
pipeline at a glance:&lt;br&gt;
New: 12    Contacted: 8    Converted: 3&lt;br&gt;
Conversion rate: 13%&lt;/p&gt;

&lt;p&gt;That is the number Formspree can never give you.&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%2Fhgxb4tk93agho0nxvof9.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%2Fhgxb4tk93agho0nxvof9.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up Google Sheets sync in Formgrid:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Step 1: Create a form in your Formgrid 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="Formgrid dashboard and new form creation" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Copy your unique endpoint URL from the &lt;br&gt;
Overview tab and paste it into your HTML form action attribute.&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="Formgrid endpoint URL on form details page" width="800" height="447"&gt;&lt;/a&gt;&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://api.formgrid.dev/f/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="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&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;Step 3: Open the Integrations tab in your Formgrid 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%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="Formgrid integrations tab" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Click Create blank Google Sheet.&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="Formgrid Google Sheets integration section" width="800" height="443"&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%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="Create blank Google Sheet button in Formgrid" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 5: Share the sheet with the Formgrid service account email as an Editor. Copy the email directly from your &lt;br&gt;
Formgrid dashboard to avoid typing errors.&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="Formgrid service account email copy button" width="800" height="337"&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%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="Google Sheets editor access setting" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Paste your Google Sheet URL into &lt;br&gt;
Formgrid and click Connect.&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="Paste Google Sheet URL into Formgrid" width="800" height="253"&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%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="Google Sheets connected successfully in Formgrid" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this point, every form submission appears as a new row in your Google Sheet automatically within seconds. Column headers are created from your form field names on the very first submission. &lt;br&gt;
No manual setup 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%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="Google Sheets showing form submissions as rows" width="800" height="752"&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="Google Sheets rows with timestamp" width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Formgrid 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;th&gt;Google Sheets&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;25/month&lt;/td&gt;
&lt;td&gt;10 rows one-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;td&gt;$12/month&lt;/td&gt;
&lt;td&gt;1,000/month&lt;/td&gt;
&lt;td&gt;500 rows/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;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The bottom line on Formgrid:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You pay $29 per month for unlimited Google Sheets sync, a full lead pipeline, follow-up reminders, UTM source tracking, custom email templates, and 15,000 submissions per month.&lt;/p&gt;

&lt;p&gt;Formspree charges $90 per month for Google Sheets &lt;br&gt;
sync alone with none of the lead management features.&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;


&lt;h3&gt;
  
  
  2. Netlify Forms: Free Google Sheets Via Zapier if You Are on Netlify
&lt;/h3&gt;

&lt;p&gt;Netlify Forms is built into the Netlify platform. &lt;br&gt;
If your site is already deployed on Netlify, it is the lowest friction option available. Add the Netlify attribute to your form tag, and submissions are captured 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;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;The catch is that native Google Sheets sync is not included. You would need to use Zapier or Make to push submissions to a spreadsheet, which adds another monthly cost on top of whatever Netlify plan you are on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Sites already hosted on Netlify &lt;br&gt;
that do not need Google Sheets sync or are comfortable paying for Zapier separately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Anyone who wants Google Sheets sync included without adding a Zapier subscription.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Basin: Affordable but Limited
&lt;/h3&gt;

&lt;p&gt;Basin is a minimal form backend that keeps things simple. It supports HTML form endpoints, email notifications, and basic integrations.&lt;/p&gt;

&lt;p&gt;Google Sheets sync is available on Basin but requires connecting through Zapier. The paid plan starts at $8 per month, which &lt;br&gt;
is competitive on price, but you still need a separate Zapier subscription to get data into Google Sheets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a very minimal form backend and are already paying for Zapier for other workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Anyone who wants native Google Sheets sync without a Zapier dependency.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. Getform (Now Forminit): Decent but Pricier
&lt;/h3&gt;

&lt;p&gt;Getform rebranded to Forminit in early 2026. &lt;br&gt;
The product is largely the same. It is a clean, developer-friendly form backend with a good dashboard.&lt;/p&gt;

&lt;p&gt;Google Sheets integration is available on paid plans starting at $19 per month. That is significantly cheaper than Formspree's $90 per month, but still more expensive than Formgrid's $8 per month for &lt;br&gt;
similar functionality.&lt;/p&gt;

&lt;p&gt;There is no form builder and no lead management pipeline. Forminit is purely a form backend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a clean, simple form backend with Google Sheets at a reasonable price.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Anyone who needs a form builder or wants to track leads after they arrive.&lt;/p&gt;


&lt;h3&gt;
  
  
  5. Web3Forms: Completely Free With Google Sheets
&lt;/h3&gt;

&lt;p&gt;Web3Forms offers a free tier that includes basic form handling and some integrations. Google Sheets connectivity is available through their free plan.&lt;/p&gt;

&lt;p&gt;The free plan is genuinely useful for low-volume projects. But the feature set is limited compared to paid options. No lead management. No file uploads. No follow-up reminders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a completely free option for low-volume forms with basic Google Sheets sync.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not ideal for:&lt;/strong&gt; Anyone managing real business leads who needs more than basic submission forwarding.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Full Comparison
&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;Google Sheets&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;th&gt;Lead Pipeline&lt;/th&gt;
&lt;th&gt;Form Builder&lt;/th&gt;
&lt;th&gt;Open Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Formspree&lt;/td&gt;
&lt;td&gt;$90/month&lt;/td&gt;
&lt;td&gt;$15 to $90/month&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Formgrid&lt;/td&gt;
&lt;td&gt;Free on all plans&lt;/td&gt;
&lt;td&gt;$0 to $29/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Netlify Forms&lt;/td&gt;
&lt;td&gt;Via Zapier only&lt;/td&gt;
&lt;td&gt;Bundled with Netlify&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basin&lt;/td&gt;
&lt;td&gt;Via Zapier only&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Forminit&lt;/td&gt;
&lt;td&gt;$19/month+&lt;/td&gt;
&lt;td&gt;$19/month+&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web3Forms&lt;/td&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  What Happens After Submissions Hit Your Sheet
&lt;/h2&gt;

&lt;p&gt;This is the part most comparisons skip entirely.&lt;/p&gt;

&lt;p&gt;Every tool on this list can get form submissions into a Google Sheet. The real question is what happens to those submissions after they arrive.&lt;/p&gt;

&lt;p&gt;With Formspree, Netlify Forms, Basin, Forminit, and Web3Forms, the answer is nothing. The data lands in the sheet. What you do with it is entirely up to you.&lt;/p&gt;

&lt;p&gt;With Formgrid, the submission also becomes a tracked lead in your pipeline. You mark it Contacted when you follow up. You mark it &lt;br&gt;
Converted when it becomes a customer. &lt;br&gt;
You add notes from every conversation. &lt;br&gt;
You set a follow-up reminder and get an email on the exact date you need to act.&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%2Fc0circ45ya7viy4olo3s.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%2Fc0circ45ya7viy4olo3s.png" alt=" " width="800" height="395"&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%2Fjpl2u4j43dpklj6zfzhp.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%2Fjpl2u4j43dpklj6zfzhp.png" alt="Lead detail view showing notes field in Formgrid" width="800" height="563"&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%2Fohsj1btyitpsmn08cc31.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%2Fohsj1btyitpsmn08cc31.png" alt="Follow up date picker on lead detail page" 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%2Fqomp8ege8stlze7tpq7p.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%2Fqomp8ege8stlze7tpq7p.png" alt="Follow up reminder email from Formgrid" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a developer building a portfolio site, where submissions are just notifications, that extra capability adds no value. &lt;br&gt;
But for a small business where every form submission is a potential customer, having a system that tracks what happens after the submission arrives is the difference between winning that customer &lt;br&gt;
and losing them to a buried email.&lt;/p&gt;
&lt;h2&gt;
  
  
  A Real Example
&lt;/h2&gt;

&lt;p&gt;One of Formgrid's customers runs endurance horse riding events in San Diego. She manages registrations through a form on her website. Before Formgrid, every registration arrived as an unformatted email that her non-technical event manager struggled to read.&lt;/p&gt;

&lt;p&gt;She connected Formgrid to her registration form, set up Google Sheets sync, and configured a custom email template so every registration &lt;br&gt;
arrived as a clean, structured email with labeled fields her team could actually read.&lt;/p&gt;

&lt;p&gt;Every registration now appears as a new row in a shared Google Sheet that her whole team accesses in real time. Every registrant is &lt;br&gt;
tracked as a lead in her pipeline. She knows exactly how many riders &lt;br&gt;
are registered, confirmed, and pending.&lt;/p&gt;

&lt;p&gt;She is on the Business plan at $29 per month. &lt;br&gt;
Formspree would charge $90 per month for Google Sheets alone, without any of the lead tracking or custom email features.&lt;/p&gt;

&lt;p&gt;"The level of personal support was impressive."&lt;br&gt;
&lt;strong&gt;A. Libby, Event Manager, San Diego Endurance Riders&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Switch From Formspree to Formgrid
&lt;/h2&gt;

&lt;p&gt;If you are already using Formspree, the migration takes about five minutes, and your HTML form does not change at all.&lt;/p&gt;

&lt;p&gt;Step 1: Sign up for free at formgrid.dev. &lt;br&gt;
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%2Fa590ejt2zmv83285bt64.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%2Fa590ejt2zmv83285bt64.png" alt="Formgrid signup page" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Create a new form and copy your Formgrid endpoint URL.&lt;/p&gt;

&lt;p&gt;Step 3: Replace your Formspree endpoint in your HTML form with your Formgrid endpoint URL. One line change:&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;!-- Before: Formspree --&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://formspree.io/f/your-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="c"&gt;&amp;lt;!-- After: Formgrid --&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://api.formgrid.dev/forms/
your-form-id/submissions"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Connect your Google Sheet in the Integrations tab. Takes about three minutes as shown above.&lt;/p&gt;

&lt;p&gt;That is the entire migration. &lt;br&gt;
Your form works exactly as before. &lt;br&gt;
You now have Google Sheets sync &lt;br&gt;
at $29 per month instead of $90 per month, plus a full lead pipeline you did not have before.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is There Any Reason to Stay on Formspree?
&lt;/h2&gt;

&lt;p&gt;To be honest, yes. One situation.&lt;/p&gt;

&lt;p&gt;If you are a developer using Formspree purely as a form backend for static sites where submissions are just notifications and you &lt;br&gt;
have no need for Google Sheets, Formspree &lt;br&gt;
at $15 per month is a reasonable choice. It is reliable and well-documented.&lt;/p&gt;

&lt;p&gt;But the moment Google Sheets sync is part of your requirements, Formspree becomes one of the most expensive ways to get it. &lt;br&gt;
Every other tool on this list gets you there for significantly less.&lt;/p&gt;

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

&lt;p&gt;Paying $90 per month for Google Sheets integration is not something most developers or small business owners should accept as normal. &lt;br&gt;
It is a pricing decision Formspree made, and there are better options available at every price point.&lt;/p&gt;

&lt;p&gt;If you want native Google Sheets sync included without Zapier and without paying $90 per month, Formgrid is the most complete &lt;br&gt;
option available. &lt;/p&gt;

&lt;p&gt;You get Google Sheets sync on every plan, including free, a full lead pipeline, follow-up reminders, and UTM tracking. &lt;br&gt;
and a form builder in one tool, starting at $0 per month.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev/app/signup" rel="noopener noreferrer"&gt;Start free at formgrid.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No credit card required. Free plan available. &lt;br&gt;
Switching from Formspree takes five minutes, and your form does not change at all.&lt;/p&gt;

&lt;p&gt;If you have questions about switching or setting up Google Sheets sync for your specific situation, reply in the &lt;br&gt;
comments or email &lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt; directly.&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 inaccurate.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;No credit card required. Free plan available. &lt;br&gt;
Switching from Formspree takes five minutes, and your form does not change at all.&lt;/p&gt;

&lt;p&gt;If you have questions about switching or setting up Google Sheets sync for your specific situation, reply in the &lt;br&gt;
comments or email &lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt; directly.&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 inaccurate.&lt;/em&gt;&lt;/p&gt;




</description>
    </item>
    <item>
      <title>Formspree vs Formgrid in 2026: Which One Actually Helps You Win Customers?</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Tue, 12 May 2026 23:37:34 +0000</pubDate>
      <link>https://dev.to/allenarduino/formspree-vs-formgrid-in-2026-which-one-actually-helps-you-win-customers-5dfc</link>
      <guid>https://dev.to/allenarduino/formspree-vs-formgrid-in-2026-which-one-actually-helps-you-win-customers-5dfc</guid>
      <description>&lt;p&gt;Formspree is one of the most popular form backends for static sites, and it deserves that reputation. It is reliable, well-documented, and easy to set up. If you need a form backend that just works, Formspree works.&lt;/p&gt;

&lt;p&gt;But if you have ever received a form submission, replied to it a day later, and watched the lead go cold. Formspree cannot help you with that. It was never designed to.&lt;/p&gt;

&lt;p&gt;That is the gap Formgrid was built to fill.&lt;/p&gt;

&lt;p&gt;This comparison covers every meaningful difference between the two tools in 2026 so you can decide which one is right for your situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The One Line Summary
&lt;/h2&gt;

&lt;p&gt;Formspree collects submissions.&lt;br&gt;
Formgrid manages leads.&lt;/p&gt;

&lt;p&gt;That distinction sounds small. In practice, it changes everything about how you run your business.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Formspree Does
&lt;/h2&gt;

&lt;p&gt;Formspree is a form backend service. You point your HTML form at a Formspree endpoint, and every submission is received. spam filtered, stored, and forwarded to your inbox.&lt;/p&gt;

&lt;p&gt;It does that job cleanly and reliably. No complaints there.&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;!-- Formspree endpoint --&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://formspree.io/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="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;What happens after the submission hits your inbox is entirely up to you.&lt;/p&gt;

&lt;p&gt;Did you reply? Did you follow up? Did they become a customer? &lt;br&gt;
Formspree has no idea. Neither do you unless you are tracking it somewhere else.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Formgrid Does
&lt;/h2&gt;

&lt;p&gt;Formgrid does everything Formspree does at the point of submission. Same one line code change:&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;!-- Formgrid endpoint --&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://api.formgrid.dev/f/form_id
your-form-id/submissions"&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="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&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;But that is where the similarity ends.&lt;/p&gt;

&lt;p&gt;Every submission that arrives does not just sit in a flat list. It becomes a tracked lead with a status, a notes field, and a follow-up reminder you can set in one click. Google Sheets sync runs automatically in the background. No Zapier needed.&lt;/p&gt;

&lt;p&gt;The submission landing in your dashboard is not the end of the workflow. It is the beginning.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full Feature 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;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;HTML form endpoint&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email notifications&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Submissions dashboard&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSV export&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&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;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Form builder&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable form link&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead pipeline&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes on every lead&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow up reminders&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversion rate tracking&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Sheets sync&lt;/td&gt;
&lt;td&gt;$90/month&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UTM source tracking&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hostable&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free submissions&lt;/td&gt;
&lt;td&gt;50/month&lt;/td&gt;
&lt;td&gt;25/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starting price&lt;/td&gt;
&lt;td&gt;$15/month&lt;/td&gt;
&lt;td&gt;$12/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR friendly&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The technical foundation is similar. What happens after the submission is not even close.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Four Things That Make Formgrid Different
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. A Lead Pipeline Built Into Every Form
&lt;/h3&gt;

&lt;p&gt;In Formspree, every submission looks the same regardless of where it is in your sales process. There is no way to mark something as replied to, flag a hot lead, or see at a glance which enquiries need &lt;br&gt;
your attention today.&lt;/p&gt;

&lt;p&gt;In Formgrid, every submission becomes a lead with three stages:&lt;br&gt;
New:        You have not replied yet&lt;br&gt;
Contacted:  You have been in touch&lt;br&gt;
Converted:  They became a customer&lt;/p&gt;

&lt;p&gt;At the top of your leads tab, you see your full pipeline summary and your conversion rate updating automatically:&lt;br&gt;
New: 12    Contacted: 8    Converted: 3&lt;br&gt;
Conversion rate: 13%&lt;/p&gt;

&lt;p&gt;That number alone changes how you think about your contact form. It is not just about collecting messages. It is driving revenue.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Notes on Every Lead
&lt;/h3&gt;

&lt;p&gt;After you call a potential customer and they tell you their budget is tight until next quarter and to follow up in July, you need to write that down somewhere, attached to that specific person.&lt;/p&gt;

&lt;p&gt;Formspree has no notes field. You end up writing it elsewhere or trying to remember.&lt;/p&gt;

&lt;p&gt;In Formgrid, every lead has a notes field. Write whatever you need to remember: Called Thursday. Interested in the monthly&lt;br&gt;
package. Budget around $800. Partner needs&lt;br&gt;
to approve. Follow up after the 20th.&lt;/p&gt;

&lt;p&gt;The next time you open that lead, your note is right there. You know exactly where the conversation left off before you pick up &lt;br&gt;
the phone. You sound prepared. You close more deals.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Follow-Up Reminders
&lt;/h3&gt;

&lt;p&gt;Most leads do not convert on the first contact. They need a follow-up. Sometimes two or three.&lt;/p&gt;

&lt;p&gt;Formspree has no way to set a reminder on a lead. Whether you follow up is entirely up to you and your memory. Most of the time, you forget. The lead goes cold. You lose a customer you could have won with one timely email.&lt;/p&gt;

&lt;p&gt;In Formgrid, you set a follow-up reminder directly on the lead. Pick a date. Click Set Reminder.&lt;/p&gt;

&lt;p&gt;On that date, Formgrid emails you with the lead details and your notes so you have everything you need before you follow up.&lt;/p&gt;

&lt;p&gt;You set it once. Formgrid handles the rest.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Google Sheets Sync Without Zapier
&lt;/h3&gt;

&lt;p&gt;Formspree charges $90 per month for Google Sheets integration. That is on top of your base plan cost.&lt;/p&gt;

&lt;p&gt;Formgrid includes Google Sheets sync on every plan, including the free plan. Connect your Google Sheet once in your form settings, and every submission appears as a new row automatically. Your whole team sees new leads in real time without logging into anything.&lt;/p&gt;

&lt;p&gt;No Zapier. No extra cost. No setup beyond &lt;br&gt;
connecting your Google account once.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pricing Comparison
&lt;/h2&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;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&lt;/td&gt;
&lt;td&gt;50 submissions/month&lt;/td&gt;
&lt;td&gt;25 submissions/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic paid&lt;/td&gt;
&lt;td&gt;$15/month for 200 submissions&lt;/td&gt;
&lt;td&gt;$12/month for 1,000 submissions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Sheets&lt;/td&gt;
&lt;td&gt;$90/month&lt;/td&gt;
&lt;td&gt;Free on all plans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom email templates&lt;/td&gt;
&lt;td&gt;$60/month&lt;/td&gt;
&lt;td&gt;$29/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosting&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;td&gt;Free on Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Formgrid gives you 5x more submissions at the basic paid tier for $3 less per month. And Google Sheets sync that Formspree charges $90 per month for is free.&lt;/p&gt;
&lt;h2&gt;
  
  
  A Real Example: What the Difference Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;One of Formgrid's customers runs endurance horse ride events. She was using a basic form backend and getting registration submissions forwarded to her inbox. A 75-year-old ride manager was receiving &lt;br&gt;
raw data dumps with field names and values she could not read.&lt;/p&gt;

&lt;p&gt;After switching to Formgrid, she connected her form in minutes, set up a custom email template so every registration arrived as a clean, formatted email her ride manager could actually read, and connected Google Sheets so the whole team could see registrations in real time without accessing her email.&lt;/p&gt;

&lt;p&gt;Every registration now appears as a tracked lead in her pipeline. She knows exactly how many riders registered, how many she has confirmed, and how many are still pending. All from one dashboard.&lt;/p&gt;

&lt;p&gt;She is on the Business plan at $29 per month. &lt;br&gt;
Formspree would charge $90 per month for Google Sheets alone without any of the lead tracking features.&lt;/p&gt;
&lt;h2&gt;
  
  
  When Formspree Is Still the Right Choice
&lt;/h2&gt;

&lt;p&gt;To be completely honest, Formspree is a perfectly good choice in one specific situation.&lt;/p&gt;

&lt;p&gt;If you are a developer building a simple contact form for a portfolio site or a static site where submissions are just notifications and nothing more, Formspree works fine. You are not trying to convert &lt;br&gt;
those submissions into customers. You are just receiving messages.&lt;/p&gt;

&lt;p&gt;The pipeline, the notes, and the follow-up reminders add no value for that use case.&lt;/p&gt;

&lt;p&gt;But the moment those submissions represent real revenue opportunities, the calculation changes completely.&lt;/p&gt;
&lt;h2&gt;
  
  
  When Formgrid Is the Right Choice
&lt;/h2&gt;

&lt;p&gt;Use Formgrid if any of these apply to you:&lt;/p&gt;

&lt;p&gt;You are a small business taking enquiries from potential customers and need to track what happens after they submit.&lt;/p&gt;

&lt;p&gt;You are paying for Formspree and want more submissions at a lower price.&lt;/p&gt;

&lt;p&gt;You need Google Sheets sync without paying $90 per month on top of your base plan.&lt;/p&gt;

&lt;p&gt;You want to know your actual conversion rate from form submissions to paying customers.&lt;/p&gt;

&lt;p&gt;You care about open source and self-hosting with full data ownership.&lt;/p&gt;

&lt;p&gt;You need a form builder with a shareable link as well as an HTML form endpoint in the same tool.&lt;/p&gt;
&lt;h2&gt;
  
  
  How to Switch From Formspree to Formgrid
&lt;/h2&gt;

&lt;p&gt;If you are already using Formspree, the migration takes about five minutes, and your form does not change at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign up for free at formgrid.dev. No credit card required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Create a new form and copy your Formgrid endpoint URL from the Overview tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Replace your Formspree &lt;br&gt;
endpoint URL with your Formgrid &lt;br&gt;
endpoint URL in your HTML form. &lt;br&gt;
One line change. 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="c"&gt;&amp;lt;!-- Before: Formspree --&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://formspree.io/f/your-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="c"&gt;&amp;lt;!-- After: Formgrid --&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://api.formgrid.dev/forms/
your-form-id/submissions"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every submission now lands in a lead pipeline with a status, a notes field, and a follow-up reminder you can set in one click. Google Sheets sync connects in under a minute.&lt;/p&gt;

&lt;p&gt;Your form works exactly as before. What happens after the submission &lt;br&gt;
arrives is completely different.&lt;/p&gt;

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

&lt;p&gt;Formspree is not a bad product. For a developer who needs a reliable &lt;br&gt;
form backend for a static site, it is a solid choice.&lt;/p&gt;

&lt;p&gt;But for a small business where every form submission is a potential customer, a tool that stops at the inbox is leaving money on the table.&lt;/p&gt;

&lt;p&gt;Every enquiry that goes unanswered is because you lost track of it. Every warm lead that went cold because you forgot to follow up. &lt;br&gt;
Every customer you could have won but did not because you had no system.&lt;/p&gt;

&lt;p&gt;Those are not Formspree's fault. But they are a problem Formspree is not designed to solve. Formgrid is.&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;br&gt;
No credit card required. Free plan available. &lt;br&gt;
Switching from Formspree takes five minutes, and your form does not change at all.&lt;/p&gt;

&lt;p&gt;If you have questions about switching or setting up lead tracking for your specific use case, reply in the comments or email &lt;br&gt;
&lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt; directly.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Build a $15K Web Design Agency Landing Page With Next.js and Formgrid</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 08 May 2026 23:40:33 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-build-a-15k-web-design-agency-landing-page-with-nextjs-and-formgrid-5291</link>
      <guid>https://dev.to/allenarduino/how-to-build-a-15k-web-design-agency-landing-page-with-nextjs-and-formgrid-5291</guid>
      <description>&lt;p&gt;Most web design agencies charge between $5K and $20K&lt;br&gt;
for a professional landing page. The difference between&lt;br&gt;
a $2K page and a $15K page is rarely the design. &lt;br&gt;
Both might look clean and modern. Both might have good copy.&lt;/p&gt;

&lt;p&gt;The difference is what happens after a visitor arrives.&lt;/p&gt;

&lt;p&gt;A $2K page has a contact form that sends an email. The&lt;br&gt;
email gets buried. The lead goes cold. The agency never&lt;br&gt;
knows whether that visitor came from Google, a referral, or a paid ad.&lt;/p&gt;

&lt;p&gt;A $15K page has a lead capture system. Every enquiry is tracked. Every lead has a status. Every follow-up has a reminder. The agency knows exactly which marketing channels are bringing clients that actually pay.&lt;/p&gt;

&lt;p&gt;This tutorial builds the second type. You will build a professional agency landing page in Next.js with a lead capture form powered by Formgrid. Every enquiry becomes a tracked lead with Google Sheets sync built in. No Zapier needed. No separate CRM required.&lt;/p&gt;

&lt;p&gt;By the end, you will have a page you can use for your own agency or adapt for clients, and a lead tracking system that works from day one.&lt;/p&gt;
&lt;h2&gt;
  
  
  What You Are Building
&lt;/h2&gt;

&lt;p&gt;Here is exactly what this tutorial produces:&lt;/p&gt;

&lt;p&gt;A professional multi-section agency landing page in&lt;br&gt;
Next.js with a hero section, services overview, social&lt;br&gt;
proof, pricing packages, and a contact and quote request form at the bottom.&lt;/p&gt;

&lt;p&gt;Every form submission goes to Formgrid, which turns it into a tracked lead instantly. The lead appears in your Formgrid dashboard with a status of New. It also appears as a new row in a Google Sheet that your whole team can see in real time. You can mark it Contacted when&lt;br&gt;
you reach out, add notes from the conversation, set a follow-up reminder, and mark it Converted when it becomes a paying client.&lt;/p&gt;

&lt;p&gt;The stack is Next.js for the frontend, Formgrid for form handling and lead tracking, and Google Sheets as&lt;br&gt;
a shared team dashboard. No backend to build. No&lt;br&gt;
database to manage. No Zapier bill at the end of the month.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Most Agency Sites Fail to Convert
&lt;/h2&gt;

&lt;p&gt;Before building anything, it helps to understand why most agency landing pages underperform.&lt;/p&gt;

&lt;p&gt;The most common problem is that the contact form is&lt;br&gt;
treated as an afterthought. It sits on a separate Contact page that most visitors never navigate to deliberately. &lt;br&gt;
They land on the homepage, browse the portfolio, and leave without making contact because the path to enquiring is one step too long.&lt;/p&gt;

&lt;p&gt;The second problem is that there is no system for what happens after the enquiry arrives. It lands in an email inbox. &lt;br&gt;
The agency responds when they can. There is no record of which enquiries got followed up on, which ones went cold, and no way to know which marketing channel sent them in the first place.&lt;/p&gt;

&lt;p&gt;The third problem is that most agency sites look credible but do not build trust fast enough. Visitors need to see specific results, specific client names, and a specific next step within the first few seconds of landing on the page. Vague statements about being&lt;br&gt;
passionate about design, do not convert.&lt;/p&gt;

&lt;p&gt;This tutorial fixes all three problems.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, make sure you have:&lt;/p&gt;

&lt;p&gt;Node.js 18 or higher installed&lt;br&gt;
A Formgrid account at formgrid.dev (free)&lt;br&gt;
A Google account for Sheets integration&lt;br&gt;
Basic familiarity with Next.js and React&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Set Up Your Next.js Project
&lt;/h2&gt;

&lt;p&gt;Create a new Next.js project:&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-next-app@latest agency-landing &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--typescript&lt;/span&gt; &lt;span class="nt"&gt;--tailwind&lt;/span&gt; &lt;span class="nt"&gt;--app&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;agency-landing
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open localhost:3000 and confirm the default Next.js page loads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Create Your Formgrid Form
&lt;/h2&gt;

&lt;p&gt;Before writing any code, set up your Formgrid form so you have the endpoint URL ready.&lt;/p&gt;

&lt;p&gt;Go 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%2F6qtdpfif8mk0pku0a8wy.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%2F6qtdpfif8mk0pku0a8wy.png" alt=" " width="800" height="439"&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%2Ft8dkg27xeth7sgh22626.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%2Ft8dkg27xeth7sgh22626.png" alt=" " width="800" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click New Form and name it something like "Agency &lt;br&gt;
Enquiries" or "Proposal Request Form". &lt;br&gt;
Click Create 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%2Fhiisoefy5n34kwta5gwa.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%2Fhiisoefy5n34kwta5gwa.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to the Overview tab and copy your endpoint URL.&lt;br&gt;
It will look like this:&lt;br&gt;
&lt;a href="https://api.formgrid.dev/api/f/form_id" rel="noopener noreferrer"&gt;https://api.formgrid.dev/api/f/form_id&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%2F41ls5xi95f5ztj80d4g9.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%2F41ls5xi95f5ztj80d4g9.png" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Save this URL. You will use it in your form component.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Build the Page Structure
&lt;/h2&gt;

&lt;p&gt;Replace the contents of &lt;code&gt;app/page.tsx&lt;/code&gt; with this&lt;br&gt;
base structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Hero&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/Hero&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Services&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/Services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;SocialProof&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/SocialProof&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Pricing&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/Pricing&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;ContactForm&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/ContactForm&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Home&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Navbar&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Hero&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Services&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;SocialProof&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Pricing&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ContactForm&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;main&lt;/span&gt;&lt;span class="p"&gt;&amp;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;Create a &lt;code&gt;components&lt;/code&gt; folder inside &lt;code&gt;app&lt;/code&gt; and build&lt;br&gt;
each section as a separate component.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Build the Hero Section
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;app/components/Hero.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&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;next/image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;metrics&lt;/span&gt; &lt;span class="o"&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;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Revenue generated for clients&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$6.8M&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;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Average increase in qualified leads&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;214%&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;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Projects shipped with measurable growth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;92&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Hero&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative overflow-hidden bg-[#06070b] px-6 pt-28 pb-20 text-white md:pt-36"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute inset-0 bg-[radial-gradient(circle_at_20%_20%,rgba(250,204,21,0.2),transparent_35%),radial-gradient(circle_at_80%_20%,rgba(56,189,248,0.15),transparent_30%)]"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative mx-auto grid w-full max-w-6xl items-center gap-14 lg:grid-cols-[1fr_1fr]"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mb-5 text-xs font-semibold uppercase tracking-[0.32em] text-amber-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        Precision web design for serious growth
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"font-display max-w-3xl text-4xl font-black leading-[0.92] tracking-[-0.02em] text-white md:text-5xl lg:text-6xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        Your next website should feel premium and perform like a sales team
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-7 max-w-xl text-base leading-7 text-slate-300 md:text-lg"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        We design fast conversion ready websites for agencies and software
                        brands that need more demand from the same traffic.
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-10 flex flex-wrap gap-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
                            &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#contact"&lt;/span&gt;
                            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-full bg-amber-300 px-7 py-3 text-sm font-semibold uppercase tracking-[0.2em] text-slate-900 transition hover:bg-amber-200"&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            Book your strategy call
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
                            &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#services"&lt;/span&gt;
                            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-full border border-slate-600 px-7 py-3 text-sm font-semibold uppercase tracking-[0.2em] text-slate-200 transition hover:border-slate-400 hover:text-white"&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            Explore capabilities
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-14 grid gap-4 sm:grid-cols-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;metric&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
                                &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-2xl border border-white/10 bg-white/[0.03] p-4 backdrop-blur"&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-3xl font-semibold text-amber-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 text-xs uppercase tracking-[0.16em] text-slate-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;metric&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"absolute -inset-4 rounded-[2rem] bg-gradient-to-tr from-amber-300/30 to-cyan-300/20 blur-2xl"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"relative overflow-hidden rounded-[2rem] border border-white/10 bg-slate-950/70 p-3 shadow-[0_24px_80px_rgba(0,0,0,0.55)]"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt;
                            &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://images.unsplash.com/photo-1497366811353-6870744d04b2?auto=format&amp;amp;fit=crop&amp;amp;w=1600&amp;amp;q=80"&lt;/span&gt;
                            &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Creative studio workspace with premium website design presentation"&lt;/span&gt;
                            &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1200&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                            &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;900&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h-[390px] w-full rounded-[1.5rem] object-cover md:h-[470px] lg:h-[530px]"&lt;/span&gt;
                            &lt;span class="na"&gt;priority&lt;/span&gt;
                        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 rounded-xl border border-white/10 bg-black/40 p-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs uppercase tracking-[0.2em] text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                Active project dashboard
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 text-sm text-slate-200"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                Lead conversion this month is up 39 percent after launch
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&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%2F9cq8894ep0dewi4s1y8t.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%2F9cq8894ep0dewi4s1y8t.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Build the Navigation Bar
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;app/components/Navbar.tsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&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;useState&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;navItems&lt;/span&gt; &lt;span class="o"&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;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Services&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#services&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;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Results&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#results&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;label&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Pricing&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#pricing&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;label&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;href&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&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Navbar&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isMenuOpen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setIsMenuOpen&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;handleNavClick&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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MouseEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLAnchorElement&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;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&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;target&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;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;href&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="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;target&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;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scrollIntoView&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;behavior&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;smooth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;block&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;start&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;setIsMenuOpen&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="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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"fixed inset-x-0 top-0 z-50 px-6 pt-5"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto w-full max-w-6xl rounded-2xl border border-white/10 bg-slate-950/70 px-5 py-3 backdrop-blur md:px-7"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center justify-between"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm font-semibold uppercase tracking-[0.2em] text-white"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            AGENCY STUDIO
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"hidden items-center gap-7 md:flex"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;navItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
                  &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;onClick&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="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="nf"&gt;handleNavClick&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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs font-semibold uppercase tracking-[0.18em] text-slate-300 transition hover:text-white"&lt;/span&gt;
                &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-center gap-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
              &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#contact"&lt;/span&gt;
              &lt;span class="na"&gt;onClick&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="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="nf"&gt;handleNavClick&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#contact&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;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"hidden rounded-full bg-amber-300 px-4 py-2 text-xs font-semibold uppercase tracking-[0.16em] text-slate-900 transition hover:bg-amber-200 md:inline-block md:px-5"&lt;/span&gt;
            &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              Book call
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&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;"button"&lt;/span&gt;
              &lt;span class="na"&gt;aria-label&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Toggle navigation menu"&lt;/span&gt;
              &lt;span class="na"&gt;aria-expanded&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isMenuOpen&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;onClick&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setIsMenuOpen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&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;!&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"inline-flex h-10 w-10 items-center justify-center rounded-full border border-white/15 text-slate-200 transition hover:border-white/30 hover:text-white md:hidden"&lt;/span&gt;
            &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-lg"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isMenuOpen&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;x&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;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isMenuOpen&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 border-t border-white/10 pt-4 md:hidden"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"space-y-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;navItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`mobile-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
                    &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;onClick&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="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="nf"&gt;handleNavClick&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;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"block rounded-lg px-2 py-2 text-xs font-semibold uppercase tracking-[0.18em] text-slate-200 transition hover:bg-white/5 hover:text-white"&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
              &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#contact"&lt;/span&gt;
              &lt;span class="na"&gt;onClick&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="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="nf"&gt;handleNavClick&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#contact&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;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 inline-block rounded-full bg-amber-300 px-5 py-2 text-xs font-semibold uppercase tracking-[0.16em] text-slate-900 transition hover:bg-amber-200"&lt;/span&gt;
            &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              Book call
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&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%2Fusox4hckw8pkxpz8513n.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%2Fusox4hckw8pkxpz8513n.png" alt=" " width="800" height="83"&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%2Ftjyq9x3rztlvdn39yk08.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%2Ftjyq9x3rztlvdn39yk08.png" alt=" " width="800" height="205"&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%2F1zktyjmgmf55z6ssx2wd.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%2F1zktyjmgmf55z6ssx2wd.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Build the Services Section
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;app/components/Services.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&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;next/image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;services&lt;/span&gt; &lt;span class="o"&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;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Demand focused websites&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;A complete website system built to guide visitors from curiosity to qualified enquiry.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;deliverables&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;Messaging architecture&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;Visual identity direction&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;Conversion focused pages&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;image&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://images.unsplash.com/photo-1487014679447-9f8336841d58?auto=format&amp;amp;fit=crop&amp;amp;w=1600&amp;amp;q=80&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="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Premium launch experiences&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Launch pages and campaign experiences engineered to make your offer feel impossible to ignore.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;deliverables&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;Launch strategy workshop&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;Sales page copy structure&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;Rapid split test setup&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;image&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://images.unsplash.com/photo-1460925895917-afdab827c52f?auto=format&amp;amp;fit=crop&amp;amp;w=1600&amp;amp;q=80&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="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Client acquisition systems&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Connected forms analytics and follow up logic so every qualified lead reaches your team instantly.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;deliverables&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;Advanced enquiry flows&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;CRM and sheet automation&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;Performance reporting&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;image&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://images.unsplash.com/photo-1552664730-d307ca884978?auto=format&amp;amp;fit=crop&amp;amp;w=1600&amp;amp;q=80&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Services&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"services"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-[#090b10] px-6 py-24 text-white md:py-32"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto w-full max-w-6xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mb-14 flex flex-wrap items-end justify-between gap-8"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs font-semibold uppercase tracking-[0.32em] text-cyan-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              What your investment includes
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 max-w-3xl text-4xl font-semibold leading-tight text-white md:text-5xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              Every engagement combines strategic thinking with polished execution
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"max-w-md text-sm leading-7 text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            You work directly with senior designers and developers from kickoff to
            launch so your project keeps speed and quality.
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid gap-6 lg:grid-cols-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;service&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;
              &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"overflow-hidden rounded-3xl border border-white/10 bg-white/[0.03] shadow-[0_20px_50px_rgba(0,0,0,0.35)] transition hover:-translate-y-1 hover:border-cyan-300/30"&lt;/span&gt;
            &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt;
                &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;700&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h-52 w-full object-cover"&lt;/span&gt;
              &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"p-7"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-2xl font-semibold text-white"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-3 text-sm leading-7 text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-6 space-y-2"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deliverables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm text-slate-200"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;
                  &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"#contact"&lt;/span&gt;
                  &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-7 inline-block rounded-full border border-slate-500 px-5 py-2 text-xs font-semibold uppercase tracking-[0.2em] text-slate-200 transition hover:border-cyan-300 hover:text-cyan-200"&lt;/span&gt;
                &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  Start this scope
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;a&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-10 rounded-3xl border border-white/10 bg-slate-950/70 p-8 md:p-10"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs font-semibold uppercase tracking-[0.2em] text-cyan-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            Delivery confidence
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-3 max-w-4xl text-lg leading-8 text-slate-200"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            Every project follows a clear sequence with weekly checkpoints design
            review sessions and launch QA so your team sees progress at every step.
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&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%2Fe518l5habwpyru9or6yw.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%2Fe518l5habwpyru9or6yw.png" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Build the Social Proof Section
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;app/components/SocialProof.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&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;next/image&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;testimonials&lt;/span&gt; &lt;span class="o"&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;quote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;This launch gave our team instant credibility. Clients now say our site looks like the top firm in our market.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Elena Ross&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Managing Partner at Meridian Legal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;image&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://images.unsplash.com/photo-1487412720507-e7ab37603c6f?auto=format&amp;amp;fit=crop&amp;amp;w=500&amp;amp;q=80&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="na"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Our enquiry quality improved within the first week. We closed more deals without increasing ad spend.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;James Holloway&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Founder at North Ridge Growth&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;image&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://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?auto=format&amp;amp;fit=crop&amp;amp;w=500&amp;amp;q=80&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="na"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;The experience feels premium from first click to submission. Every detail reflects confidence and trust.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Priya Raman&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Marketing Director at Atlas Health&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;image&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://images.unsplash.com/photo-1544005313-94ddf0286df2?auto=format&amp;amp;fit=crop&amp;amp;w=500&amp;amp;q=80&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;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SocialProof&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"results"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-[#06070b] px-6 py-24 text-white md:py-32"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto w-full max-w-6xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mb-14 flex flex-wrap items-end justify-between gap-8"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs font-semibold uppercase tracking-[0.32em] text-amber-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              Trusted by ambitious teams
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-4xl font-semibold leading-tight text-white md:text-5xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              Client stories from recent launches
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-2xl border border-white/10 bg-white/[0.03] px-6 py-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs uppercase tracking-[0.2em] text-slate-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              Average launch rating
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 text-3xl font-semibold text-amber-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;4.98&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid gap-6 md:grid-cols-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;testimonials&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;t&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;article&lt;/span&gt;
              &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-3xl border border-white/10 bg-white/[0.03] p-7"&lt;/span&gt;
            &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mb-5 flex items-center gap-4"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt;
                  &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"h-14 w-14 rounded-full border border-white/15"&lt;/span&gt;
                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm font-semibold text-white"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs uppercase tracking-[0.14em] text-slate-400"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm leading-7 text-slate-200"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="ni"&gt;&amp;amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quote&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="ni"&gt;&amp;amp;quot;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&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%2Fviqd3h9k8hz3qpiwe24j.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%2Fviqd3h9k8hz3qpiwe24j.png" alt=" " width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Build the Pricing Section
&lt;/h2&gt;

&lt;p&gt;Create &lt;code&gt;app/components/Pricing.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;packages&lt;/span&gt; &lt;span class="o"&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Essential&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$6000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;For teams that need a refined digital presence quickly&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;features&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;Complete homepage and service pages&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;Offer and messaging workshop&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;Lead enquiry form and automation setup&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;Performance setup and launch QA&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="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Signature&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$11000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Our most selected package for serious growth campaigns&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;features&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;High fidelity brand aligned design system&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;Custom copy structure for each major page&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;Conversion journey and analytics map&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;Team enablement and launch training session&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;Thirty day optimization support&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;featured&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="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Flagship&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$15000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Complete world class website program for market leaders&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;features&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;Full strategy discovery and growth planning&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;Premium UI system and advanced interactions&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;Integrated lead qualification logic&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;Content framework and authority sections&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;Ninety day advisory support after launch&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Pricing&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"pricing"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-[#090b10] px-6 py-24 text-white md:py-32"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto w-full max-w-6xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs font-semibold uppercase tracking-[0.32em] text-amber-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          Investment tiers
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-4xl font-semibold leading-tight text-white md:text-5xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          Pick the level that matches your growth targets
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-12 grid gap-6 lg:grid-cols-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;pkg&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;article&lt;/span&gt;
              &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`rounded-3xl border p-8 &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
                &lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured&lt;/span&gt;
                  &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;border-amber-300 bg-amber-300 text-slate-900 shadow-[0_20px_60px_rgba(250,204,21,0.22)]&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;border-white/10 bg-white/[0.03]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
              &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;
                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`text-xs font-semibold uppercase tracking-[0.2em] &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
                  &lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-slate-800&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;text-amber-300&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-5xl font-semibold"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;price&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;
                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`mt-3 text-sm leading-7 &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;
                  &lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-slate-800&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;text-slate-300&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
                &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-7 space-y-3"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;features&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;feature&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex items-start gap-3 text-sm"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;featured&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text-slate-900&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;text-amber-300&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                      ✓
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;feature&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;span&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;article&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&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%2Fbkxtqxcre8gvikn5e49z.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%2Fbkxtqxcre8gvikn5e49z.png" alt=" " width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Build the Contact Form With Formgrid
&lt;/h2&gt;

&lt;p&gt;This is the most important section. Create&lt;br&gt;
&lt;code&gt;app/components/ContactForm.tsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Image&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;next/image&lt;/span&gt;&lt;span class="dl"&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;useState&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&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ContactForm&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="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;setStatus&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&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="o"&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="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&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;FORMGRID_ENDPOINT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.formgrid.dev/forms/your-form-id/submissions&lt;/span&gt;&lt;span class="dl"&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="nf"&gt;handleSubmit&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;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FormEvent&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;HTMLFormElement&lt;/span&gt;&lt;span class="o"&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="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;form&lt;/span&gt; &lt;span class="o"&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;currentTarget&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;honey&lt;/span&gt; &lt;span class="o"&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;elements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;namedItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_honey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;HTMLInputElement&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&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;honey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;

        &lt;span class="nf"&gt;setStatus&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="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="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="s2"&gt;`&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;firstName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;lastName&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&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;service&lt;/span&gt; &lt;span class="o"&gt;=&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&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 service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;budget&lt;/span&gt; &lt;span class="o"&gt;=&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;budget&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;No budget selected&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

        &lt;span class="nx"&gt;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;_subject&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;`New Enquiry: &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="s2"&gt; | &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; | &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;FORMGRID_ENDPOINT&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;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="nf"&gt;setStatus&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;setStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&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="nf"&gt;setStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"contact"&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-[#06070b] px-6 py-24 text-white md:py-32"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mx-auto grid w-full max-w-6xl gap-8 lg:grid-cols-[0.9fr_1.1fr]"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;aside&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-3xl border border-white/10 bg-white/[0.03] p-6 md:p-8"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs font-semibold uppercase tracking-[0.3em] text-amber-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        Let us build your next growth engine
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-3xl font-semibold leading-tight md:text-4xl"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        Request your custom proposal
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-sm leading-7 text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        Share your goals and our team will send scope pricing and timeline
                        recommendations within one business day.
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Image&lt;/span&gt;
                        &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"https://images.unsplash.com/photo-1552664730-d307ca884978?auto=format&amp;amp;fit=crop&amp;amp;w=1600&amp;amp;q=80"&lt;/span&gt;
                        &lt;span class="na"&gt;alt&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Agency team reviewing website strategy"&lt;/span&gt;
                        &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                        &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                        &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-6 rounded-2xl border border-white/10"&lt;/span&gt;
                    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;aside&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-3xl border border-amber-300 bg-amber-300/10 p-10 text-center"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-xs font-semibold uppercase tracking-[0.25em] text-amber-200"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            Enquiry received
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-3xl font-semibold text-white"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Thank you&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-3 text-sm text-slate-200"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            We will reply with your proposal details within one business day.
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&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="p"&gt;(&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;
                        &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                        &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rounded-3xl border border-white/10 bg-slate-950/60 p-6 md:p-8"&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;gt;&lt;/span&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;"_honey"&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="p"&gt;/&amp;gt;&lt;/span&gt;

                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"grid gap-4 sm:grid-cols-2"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                First name
                                &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;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"firstName"&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;"firstName"&lt;/span&gt;
                                    &lt;span class="na"&gt;required&lt;/span&gt;
                                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Jordan"&lt;/span&gt;
                                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 w-full rounded-xl border border-slate-700 bg-slate-900 px-4 py-3 text-white outline-none transition focus:border-amber-300"&lt;/span&gt;
                                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                Last name
                                &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;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"lastName"&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;"lastName"&lt;/span&gt;
                                    &lt;span class="na"&gt;required&lt;/span&gt;
                                    &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Reed"&lt;/span&gt;
                                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 w-full rounded-xl border border-slate-700 bg-slate-900 px-4 py-3 text-white outline-none transition focus:border-amber-300"&lt;/span&gt;
                                &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 block text-sm text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            Email address
                            &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;"email"&lt;/span&gt;
                                &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"email"&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;"email"&lt;/span&gt;
                                &lt;span class="na"&gt;required&lt;/span&gt;
                                &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"jordan@company.com"&lt;/span&gt;
                                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 w-full rounded-xl border border-slate-700 bg-slate-900 px-4 py-3 text-white outline-none transition focus:border-amber-300"&lt;/span&gt;
                            &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 grid gap-4 sm:grid-cols-2"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                Service needed
                                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;select&lt;/span&gt;
                                    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"service"&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;"service"&lt;/span&gt;
                                    &lt;span class="na"&gt;required&lt;/span&gt;
                                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 w-full rounded-xl border border-slate-700 bg-slate-900 px-4 py-3 text-white outline-none transition focus:border-amber-300"&lt;/span&gt;
                                &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Select service&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Demand focused website&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Premium launch experience&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Client acquisition system&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;select&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-sm text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                Budget range
                                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;select&lt;/span&gt;
                                    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"budget"&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;"budget"&lt;/span&gt;
                                    &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 w-full rounded-xl border border-slate-700 bg-slate-900 px-4 py-3 text-white outline-none transition focus:border-amber-300"&lt;/span&gt;
                                &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Select range&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;$6000 to $9000&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;$10000 to $14000&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;$15000 and above&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;option&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;select&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 block text-sm text-slate-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            Project goals
                            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&lt;/span&gt;
                                &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"message"&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;"message"&lt;/span&gt;
                                &lt;span class="na"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                                &lt;span class="na"&gt;required&lt;/span&gt;
                                &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Tell us what you are launching who you want to reach and what success looks like."&lt;/span&gt;
                                &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-2 w-full rounded-xl border border-slate-700 bg-slate-900 px-4 py-3 text-white outline-none transition focus:border-amber-300"&lt;/span&gt;
                            &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;label&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&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;"submit"&lt;/span&gt;
                            &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&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="si"&gt;}&lt;/span&gt;
                            &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-6 rounded-full bg-amber-300 px-7 py-3 text-sm font-semibold uppercase tracking-[0.2em] text-slate-900 transition hover:bg-amber-200 disabled:cursor-not-allowed disabled:opacity-60"&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&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="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 proposal request&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

                        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"mt-4 text-sm text-red-300"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                                Something went wrong. Please try again or contact us by email.
                            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                        &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;section&lt;/span&gt;&lt;span class="p"&gt;&amp;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;&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%2Fa6wt7iys0mn7elt37gq1.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%2Fa6wt7iys0mn7elt37gq1.png" alt=" " width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Replace &lt;code&gt;your-form-id&lt;/code&gt; in the &lt;code&gt;FORMGRID_ENDPOINT&lt;/code&gt;&lt;br&gt;
constant with your actual Formgrid form ID from&lt;br&gt;
Step 2.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 9: Connect Google Sheets
&lt;/h2&gt;

&lt;p&gt;In your Formgrid dashboard, go to your form settings&lt;br&gt;
and click the Integrations tab. Connect your Google&lt;br&gt;
account and select the sheet where you want enquiries&lt;br&gt;
to land.&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%2F0wqaq0176a4bex7iz62g.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%2F0wqaq0176a4bex7iz62g.png" alt=" " width="800" height="570"&gt;&lt;/a&gt;&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%2Fiq8h1ss9uajwnb9zvhz2.png" alt=" " width="800" height="941"&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%2Ffgo2tbaibq6hq7d6lus4.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%2Ffgo2tbaibq6hq7d6lus4.png" alt=" " width="800" height="590"&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%2Fzupftrzsfbb0bntz4m9c.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%2Fzupftrzsfbb0bntz4m9c.png" alt=" " width="800" height="518"&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%2Fq8pa8c5hcjr3ey7jhwbf.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%2Fq8pa8c5hcjr3ey7jhwbf.png" alt=" " width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this point, every form submission creates a new row in that sheet automatically. The columns match your form fields exactly. Your team can see new enquiries in real time without logging into anything.&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%2F30f3ob5xurzcdffqiicz.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%2F30f3ob5xurzcdffqiicz.png" alt=" " width="800" height="282"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 10: Test the Full Flow
&lt;/h2&gt;

&lt;p&gt;Start your development server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Navigate to the contact form section and submit a test enquiry with real-looking data. &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%2Fj7h1i0ul3i20htqw3ic6.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%2Fj7h1i0ul3i20htqw3ic6.png" alt=" " width="800" height="395"&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%2Fqum35ep9sdhtqnl4v8v0.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%2Fqum35ep9sdhtqnl4v8v0.png" alt=" " width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Within seconds, you should see three things happen.&lt;/p&gt;

&lt;p&gt;The submission also appears in your &lt;br&gt;
&lt;strong&gt;Leads&lt;/strong&gt; tab as a tracked lead with &lt;br&gt;
a status, a timestamp, and all the Submitter details.&lt;/p&gt;

&lt;p&gt;The submission appears in your Formgrid dashboard with a status of New.&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%2F8ou2gftlyvbg10jamu0y.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%2F8ou2gftlyvbg10jamu0y.png" alt=" " width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An email notification arrives at your Formgrid signup email with the full submission details.&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%2F8ou2gftlyvbg10jamu0y.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%2F8ou2gftlyvbg10jamu0y.png" alt=" " width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A new row appears in your connected Google Sheet with every field populated automatically.&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%2F9jw3s6lawg9ho0vznule.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%2F9jw3s6lawg9ho0vznule.png" alt=" " width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If all three appear, your lead capture system is working correctly.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Lead Pipeline in Action
&lt;/h2&gt;

&lt;p&gt;Go to your Formgrid dashboard and click on the test submission you just created.&lt;/p&gt;

&lt;p&gt;You will see the lead with a status of New. This is the starting state for every enquiry that arrives.&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%2Fm2mr9g8cjuvp1pyakwid.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%2Fm2mr9g8cjuvp1pyakwid.png" alt=" " width="800" height="511"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the status and change it to Contacted. &lt;br&gt;
This records that you have reached out to this person.&lt;br&gt;
Your conversion rate updates automatically.&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%2Fj128li2v53hhygy007jm.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%2Fj128li2v53hhygy007jm.png" alt=" " width="800" height="428"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Add Note and type something like "Spoke on&lt;br&gt;
the phone. Interested in the Growth package. &lt;br&gt;
Needs two weeks to confirm budget." That note lives on the lead permanently.&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%2F37fy6o5sh81m2i2409gs.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%2F37fy6o5sh81m2i2409gs.png" alt=" " width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Set Follow Up and choose a date five days from now. &lt;br&gt;
On that date, Formgrid will email you with the lead details and your note attached. You will not need to remember to follow up. The&lt;br&gt;
reminder does it for you.&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%2F42xpwgjgrj0dotwxkdpy.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%2F42xpwgjgrj0dotwxkdpy.png" alt=" " width="800" height="570"&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%2Fu6w1mwe7azvepz8g1pjb.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%2Fu6w1mwe7azvepz8g1pjb.png" alt=" " width="800" height="570"&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;This is the difference between an agency that closes 40% of its enquiries and one that closes 15%. Not skill. Not price. Just follow up on consistency.&lt;/p&gt;
&lt;h2&gt;
  
  
  What Makes This a $15K Page
&lt;/h2&gt;

&lt;p&gt;The page you just built has every element that separates a premium agency site from a basic one.&lt;/p&gt;

&lt;p&gt;A clear value proposition in the hero that speaks directly to the outcome the client wants. Not "we are passionate about design" but "we build websites that convert."&lt;/p&gt;

&lt;p&gt;Specific social proof with real numbers. Percentage lift in conversions. Revenue generated. Projects delivered. Vague testimonials do not build trust. Specific results do.&lt;/p&gt;

&lt;p&gt;Service packages with transparent pricing. Clients&lt;br&gt;
who see pricing upfront are more qualified when they&lt;br&gt;
enquire. They have already decided the price is acceptable before filling out the form.&lt;/p&gt;

&lt;p&gt;A strong single call to action. Every section points to the same place. Get a Quote. Nothing competes with it.&lt;/p&gt;

&lt;p&gt;Lead tracking is built in from day one. This is the element most agency sites completely miss. Every enquiry is captured, tracked, and followed up on systematically. No lead goes cold because someone forgot to reply.&lt;/p&gt;

&lt;p&gt;The last point is what justifies the $15K price tag to clients. You are not just delivering a website. You are delivering a system that actively generates and tracks revenue for their business.&lt;/p&gt;
&lt;h2&gt;
  
  
  Using This for Your Own Agency
&lt;/h2&gt;

&lt;p&gt;If you are building this for your own freelance or agency business, replace the placeholder copy with your real services, real results, and real pricing.&lt;/p&gt;

&lt;p&gt;Add your actual testimonials. Replace the statistics&lt;br&gt;
with real numbers from your own projects. Update the service descriptions to match what you actually build.&lt;/p&gt;

&lt;p&gt;The form endpoint is already connected to Formgrid.&lt;br&gt;
The Google Sheets sync is already configured. The lead pipeline is already working.&lt;/p&gt;

&lt;p&gt;Every client enquiry that comes in through this page will appear in your dashboard as a tracked lead, in your Google Sheet as a new row, and in your inbox as an email notification within seconds of submission.&lt;/p&gt;
&lt;h2&gt;
  
  
  Deploying to Production
&lt;/h2&gt;

&lt;p&gt;When you are ready to go live, deploy to Vercel in one 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 vercel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vercel detects Next.js automatically and deploys with zero configuration. Your form will work identically in production because Formgrid handles all the server-side processing.&lt;/p&gt;

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

&lt;p&gt;The gap between a $2K website and a $15K website&lt;br&gt;
is not the design framework, the number of animations, or the size of the portfolio section.&lt;/p&gt;

&lt;p&gt;It is whether the site has a system for turning visitors into trackable, followable, convertible leads.&lt;/p&gt;

&lt;p&gt;A beautiful static site with a contact form that sends emails is a $2K site. The same design with Formgrid powering the form, Google Sheets sync running in the background, and a lead pipeline&lt;br&gt;
tracking every enquiry from New to Converted is a $15K site.&lt;/p&gt;

&lt;p&gt;The only technical difference is one endpoint URL and a ten-minute Formgrid setup.&lt;/p&gt;

&lt;p&gt;If you want to build this for your own agency or for a client, start free at&lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;. The form&lt;br&gt;
backend, lead pipeline, and Google Sheets sync&lt;br&gt;
are all included from day one.&lt;/p&gt;

&lt;p&gt;For a done-for-you version, where we build the entire system for you, see our&lt;br&gt;
&lt;a href="https://formgrid.dev/services" rel="noopener noreferrer"&gt;agency setup packages&lt;/a&gt;.&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>marketing</category>
      <category>nextjs</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI Built Your HTML Form. Now What? How to Handle Form Submissions Without a Backend</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Fri, 08 May 2026 10:08:00 +0000</pubDate>
      <link>https://dev.to/allenarduino/chatgpt-built-your-html-form-now-what-how-to-handle-form-submissions-without-a-backend-51j2</link>
      <guid>https://dev.to/allenarduino/chatgpt-built-your-html-form-now-what-how-to-handle-form-submissions-without-a-backend-51j2</guid>
      <description>&lt;p&gt;You asked AI to build a contact form for you. It delivered&lt;br&gt;
clean, well-structured HTML in about 30 seconds. You copied&lt;br&gt;
it into your site, opened it in the browser, filled it out,&lt;br&gt;
clicked submit, and nothing happened.&lt;/p&gt;

&lt;p&gt;Maybe you saw a blank page. Maybe the URL changed to something&lt;br&gt;
strange. You may have encountered an error you did not understand.&lt;/p&gt;

&lt;p&gt;This is one of the most common problems developers and&lt;br&gt;
non-technical founders run into right now. AI tools have made&lt;br&gt;
it trivially easy to generate beautiful HTML forms. But they&lt;br&gt;
cannot give you the server-side infrastructure those forms&lt;br&gt;
need to actually work.&lt;/p&gt;

&lt;p&gt;This post explains exactly why that happens and how to fix it&lt;br&gt;
in about five minutes without writing a single line of backend&lt;br&gt;
code.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Problem With AI-Generated HTML Forms
&lt;/h2&gt;

&lt;p&gt;When ChatGPT, Claude, or any AI tool generates an HTML form, it produces something like this:&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;""&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;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;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;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 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="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="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;This is perfectly valid HTML. The problem is that line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;action="/submit"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is telling the browser to send the form data to a URL&lt;br&gt;
called &lt;code&gt;/submit&lt;/code&gt; on your server. But if you are building a&lt;br&gt;
static site, a landing page, or just a plain HTML file, there&lt;br&gt;
is no server. There is no &lt;code&gt;/submit&lt;/code&gt; endpoint. There is nothing&lt;br&gt;
on the other end to receive the data.&lt;/p&gt;

&lt;p&gt;When the user clicks Submit, the browser faithfully sends the&lt;br&gt;
data to &lt;code&gt;/submit&lt;/code&gt; and gets back either a blank page, a 404 error, or silence.&lt;/p&gt;

&lt;p&gt;This is not a bug in your HTML. It is a fundamental limitation&lt;br&gt;
of how static websites work.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Static Sites Cannot Process Forms on Their Own
&lt;/h2&gt;

&lt;p&gt;A static site is just files. HTML, CSS, and maybe some&lt;br&gt;
JavaScript. When someone visits your site, their browser&lt;br&gt;
downloads those files and displays them. That is it. There&lt;br&gt;
is no running program, no database, no code executing on a&lt;br&gt;
server in response to user input.&lt;/p&gt;

&lt;p&gt;Form submissions require a server because something has to:&lt;/p&gt;

&lt;p&gt;Receive the POST request when the user submits&lt;br&gt;
Validate the data&lt;br&gt;
Store it somewhere&lt;br&gt;
Send you an email notification&lt;br&gt;
Return a response to the user&lt;/p&gt;

&lt;p&gt;None of that happens automatically. All of it requires&lt;br&gt;
server-side code running somewhere.&lt;/p&gt;

&lt;p&gt;In the past, this meant you had to either build your own&lt;br&gt;
backend in Node.js, PHP, or Python, pay for a server to&lt;br&gt;
run it, configure email sending, handle spam protection,&lt;br&gt;
and maintain the whole thing forever.&lt;/p&gt;

&lt;p&gt;For a simple contact form on a landing page, that is a&lt;br&gt;
massive amount of overhead. Most people either gave up or&lt;br&gt;
used a workaround like a mailto link that opens the&lt;br&gt;
user's email client, which is clunky and unreliable.&lt;/p&gt;

&lt;p&gt;Today, there is a much better option.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Solution: A Form Backend Service
&lt;/h2&gt;

&lt;p&gt;A form backend service acts as the server that your static site&lt;br&gt;
does not have. Instead of pointing your form action at a&lt;br&gt;
URL on your own server, you point it at an endpoint URL&lt;br&gt;
provided by the service.&lt;/p&gt;

&lt;p&gt;When someone submits your form, the browser sends the data&lt;br&gt;
to that endpoint. The service receives it, validates it,&lt;br&gt;
stores it, sends you an email notification, and returns&lt;br&gt;
a response to the user. All of it happens automatically.&lt;br&gt;
You never have to think about servers, email configuration,&lt;br&gt;
spam filtering, or database management.&lt;/p&gt;

&lt;p&gt;Your static site stays completely static. You just change&lt;br&gt;
one line in your HTML form.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fixing the Form With Formgrid
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt; is an open source form&lt;br&gt;
backend that works with any HTML form on any website&lt;br&gt;
regardless of where it is hosted.&lt;/p&gt;

&lt;p&gt;Every submission becomes a tracked lead in your dashboard&lt;br&gt;
with a status, a notes field, and a follow-up reminder.&lt;br&gt;
Submissions also land in Google Sheets automatically with&lt;br&gt;
no Zapier required.&lt;/p&gt;

&lt;p&gt;Here is exactly how to connect your ChatGPT-generated form&lt;br&gt;
to Formgrid in five minutes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Create Your Free 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 sign up&lt;br&gt;
using Google or email. No credit card required.&lt;/p&gt;

&lt;p&gt;The free plan includes unlimited forms and 25 submissions&lt;br&gt;
per month, which is more than enough to get started.&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%2Fev9sh8h3t0bq6ko5nuz5.png" alt=" " width="800" height="439"&gt;
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 2: Create a New Form
&lt;/h3&gt;

&lt;p&gt;Once you are in your dashboard, click New Form. Give it a&lt;br&gt;
descriptive name like "Contact Form" or "Quote Request".&lt;br&gt;
Click Create 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%2Frag4619sjsb9i4jvpg5q.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%2Frag4619sjsb9i4jvpg5q.png" alt=" " width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Copy Your Endpoint URL
&lt;/h3&gt;

&lt;p&gt;After creating your form, go to the Overview tab. You will&lt;br&gt;
see your unique endpoint URL. It will look like this:&lt;br&gt;
&lt;a href="https://api.formgrid.dev/forms/your-form-id/submissions" rel="noopener noreferrer"&gt;https://api.formgrid.dev/forms/your-form-id/submissions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy this URL. This is the address your form will submit&lt;br&gt;
data to.&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%2Fsbwulsuyd95jtzqgkg7i.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%2Fsbwulsuyd95jtzqgkg7i.png" alt=" " width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Update Your HTML Form
&lt;/h3&gt;

&lt;p&gt;Find the action attribute in your ChatGPT-generated 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;form&lt;/span&gt; &lt;span class="na"&gt;action=&lt;/span&gt;&lt;span class="s"&gt;"/submit"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace it with your Formgrid endpoint URL:&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://api.formgrid.dev/forms/your-form-id/submissions"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the only change you need to make. One line.&lt;br&gt;
Everything else in your form stays exactly as ChatGPT&lt;br&gt;
generated it.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: Add a Honeypot Field
&lt;/h3&gt;

&lt;p&gt;While you are in the form code, add this hidden field&lt;br&gt;
anywhere inside your form tag:&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;"_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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a honeypot field. Real users never see it or fill&lt;br&gt;
it in. Bots that automatically fill every field they find&lt;br&gt;
will fill it in, and Formgrid will reject that submission&lt;br&gt;
silently. It filters out the vast majority of spam with&lt;br&gt;
zero friction for real users.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 6: Test It
&lt;/h3&gt;

&lt;p&gt;Open your form in a browser, fill it out with real test&lt;br&gt;
data, and click submit. Within seconds, you should receive&lt;br&gt;
an email notification at the address you signed up with.&lt;/p&gt;

&lt;p&gt;Open your Formgrid dashboard. You will see your test&lt;br&gt;
submission listed as a new lead with a status of New.&lt;br&gt;
That submission is now tracked. You can add notes to it,&lt;br&gt;
mark it as Contacted when you follow up, and mark it as&lt;br&gt;
Converted when it becomes a customer or sale.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 7: Connect Google Sheets
&lt;/h3&gt;

&lt;p&gt;In your form settings, go to the Integrations tab and&lt;br&gt;
connect your Google account. Select or create a Google&lt;br&gt;
Sheet where you want submissions to land.&lt;/p&gt;

&lt;p&gt;From this point on, every form submission appears as a&lt;br&gt;
new row in that sheet automatically. No Zapier. No extra&lt;br&gt;
tools. No additional monthly cost.&lt;/p&gt;

&lt;p&gt;If you have a team or a business partner, they can view&lt;br&gt;
that sheet in real time without logging into anything new.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Exact ChatGPT Prompt to Generate a Working Form
&lt;/h2&gt;

&lt;p&gt;If you want to start from scratch, here is the prompt&lt;br&gt;
that generates a clean HTML form ready to connect to&lt;br&gt;
Formgrid:&lt;br&gt;
Build me a clean HTML contact form with these fields:&lt;br&gt;
name (text, required), email (email, required),&lt;br&gt;
message (textarea, required). Include a hidden honeypot&lt;br&gt;
field named "_honey" with style="display:none".&lt;br&gt;
Set the form method to POST. Leave the action&lt;br&gt;
attribute empty for now. Use clean semantic HTML&lt;br&gt;
with labels for every field. No CSS needed.&lt;/p&gt;

&lt;p&gt;ChatGPT will generate something like this:&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;""&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;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;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;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 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="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="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 the empty action attribute with your Formgrid&lt;br&gt;
endpoint URL and the form is fully functional.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Real Example: The T-Shirt Business
&lt;/h2&gt;

&lt;p&gt;One of the businesses using Formgrid today is a custom&lt;br&gt;
T-shirt printing shop. The owner needed a quote request&lt;br&gt;
form where clients could describe their order and upload&lt;br&gt;
their design files.&lt;/p&gt;

&lt;p&gt;He used ChatGPT to generate the HTML form. It produced&lt;br&gt;
clean code with all the right fields in about a minute.&lt;br&gt;
He connected it to Formgrid, enabled file uploads on the&lt;br&gt;
Premium plan, and pointed out the Google Sheets integration&lt;br&gt;
at a shared spreadsheet that his team uses.&lt;/p&gt;

&lt;p&gt;Now every quote request arrives in his inbox with the&lt;br&gt;
design file attached. The request appears in the shared&lt;br&gt;
sheet immediately, so his team can see it without checking&lt;br&gt;
email. He marks each request as Contacted when he follows&lt;br&gt;
up and Converted when the order is confirmed.&lt;/p&gt;

&lt;p&gt;He went from managing everything through email to having&lt;br&gt;
a proper lead tracking system. No developer was involved.&lt;br&gt;
Total setup time was under 10 minutes. Total monthly cost&lt;br&gt;
is $12.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens After Submission
&lt;/h2&gt;

&lt;p&gt;This is the part most tutorials skip. Getting the form&lt;br&gt;
to submit is only half the problem. What happens to that&lt;br&gt;
data after it lands in your inbox matters just as much.&lt;/p&gt;

&lt;p&gt;With a basic form backend, you get an email, and that is it.&lt;br&gt;
The email gets buried. You forgot to follow up. A potential&lt;br&gt;
customer moves on.&lt;/p&gt;

&lt;p&gt;Formgrid approaches this differently. Every submission&lt;br&gt;
becomes a tracked lead with three states:&lt;/p&gt;

&lt;p&gt;New means the submission just arrived and has not been&lt;br&gt;
actioned yet.&lt;/p&gt;

&lt;p&gt;Contacted means you have reached out to this person.&lt;/p&gt;

&lt;p&gt;Converted means they became a customer, a sale, or&lt;br&gt;
whatever outcome you are tracking.&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%2F32yj7fubvqiywxgjgreb.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%2F32yj7fubvqiywxgjgreb.png" alt=" " width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also add notes to any lead after a conversation,&lt;br&gt;
set a follow-up date, and get an email reminder on that&lt;br&gt;
date with their details and your notes attached. Warm&lt;br&gt;
leads never go cold because you forgot to follow up.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use a Form Backend vs Building Your Own
&lt;/h2&gt;

&lt;p&gt;Use a form backend like Formgrid if you need a contact&lt;br&gt;
form, a quote request form, a registration form, or any&lt;br&gt;
simple lead capture on a static site or landing page.&lt;br&gt;
You want email notifications, spam protection, and a way&lt;br&gt;
to track submissions without maintaining a server.&lt;/p&gt;

&lt;p&gt;Build your own backend if you need complex custom logic&lt;br&gt;
tied to your specific database, authentication that is&lt;br&gt;
deeply integrated with your own system, or you are&lt;br&gt;
building a full SaaS product where form handling is just&lt;br&gt;
one small piece of a larger application.&lt;/p&gt;

&lt;p&gt;For 90% of landing pages, portfolios, and small businesses&lt;br&gt;
sites, and indie projects, a form backend handles&lt;br&gt;
everything you need without the overhead of a full server.&lt;/p&gt;

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

&lt;p&gt;AI tools have made it easier than ever to build the front&lt;br&gt;
end of almost anything. A landing page, a portfolio, a&lt;br&gt;
business site, a quote request form. What they cannot do&lt;br&gt;
is give you the infrastructure behind it.&lt;/p&gt;

&lt;p&gt;A form backend fills exactly that gap. You keep the&lt;br&gt;
HTML your AI-generated. You add one URL to the action&lt;br&gt;
attribute. Everything else is handled automatically.&lt;/p&gt;

&lt;p&gt;If you want to get your ChatGPT-generated form working&lt;br&gt;
in the next five minutes, start free at formgrid.dev](&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;https://formgrid.dev&lt;/a&gt;).&lt;br&gt;
No credit card required. No backend to build or maintain.&lt;br&gt;
Just a form that works and a lead tracking system built in&lt;br&gt;
from day one.&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>beginners</category>
      <category>chatgpt</category>
      <category>html</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The Roofing Contact Form That Actually Gets Homeowners to Submit</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Tue, 05 May 2026 02:47:20 +0000</pubDate>
      <link>https://dev.to/allenarduino/the-roofing-contact-form-that-actually-gets-homeowners-to-submit-ioi</link>
      <guid>https://dev.to/allenarduino/the-roofing-contact-form-that-actually-gets-homeowners-to-submit-ioi</guid>
      <description>&lt;p&gt;Here is something most roofing companies never think to check.&lt;/p&gt;

&lt;p&gt;Open your own website on your phone. Find the contact form. Try to fill it in while standing up, with one hand, the way a homeowner actually would after noticing something wrong with their roof on a Saturday afternoon.&lt;/p&gt;

&lt;p&gt;How many fields are there? How long does it take to get to the submit button? Does the keyboard cover half the screen when you tap on a field? Does it ask for information you genuinely need before you have even spoken to the person?&lt;/p&gt;

&lt;p&gt;Most roofing contact forms fail this test badly. Not because the business owner does not care about enquiries. But because the form was added to the website as an afterthought, nobody tested it as a real user, and the default assumption was that if you put a form on a website people will use it.&lt;/p&gt;

&lt;p&gt;They will not. Not if the form creates friction. Not if it feels like paperwork. Not if it is buried at the bottom of a Contact page that a homeowner with a leaking roof in the middle of a rainstorm is never going to navigate to find.&lt;/p&gt;

&lt;p&gt;The contact form is one of the highest-leverage elements on a roofing website. Getting it right does not require a redesign. It requires understanding why homeowners abandon forms and removing every single one of those reasons.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Roofing Contact Forms Have a Conversion Problem
&lt;/h2&gt;

&lt;p&gt;The fundamental issue is that most roofing contact forms were designed from the perspective of the business, not the homeowner.&lt;/p&gt;

&lt;p&gt;The business wants to know the roof size, the year the house was built, the type of roofing material currently installed, the insurance provider, the preferred appointment time, and a detailed description of the problem before they will even schedule a visit.&lt;/p&gt;

&lt;p&gt;The homeowner is standing outside looking at a damaged gutter section after a storm. They are on their phone with cold hands. They want to send a quick message to a roofer and have someone call them back.&lt;/p&gt;

&lt;p&gt;These two things are completely incompatible. When the form reflects the business's information needs rather than the homeowner's willingness to engage, the homeowner closes the tab and calls the next company on the list.&lt;/p&gt;

&lt;p&gt;The goal of the contact form is not to collect everything you will eventually need to do the job. The goal is to start a conversation. Everything else can wait until the phone call.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Research Says About Form Completion Rates
&lt;/h2&gt;

&lt;p&gt;The data on form completion is consistent across industries and it is stark for anything on mobile.&lt;/p&gt;

&lt;p&gt;Forms with three fields convert at roughly 25 percent. Forms with six fields convert at around 15 percent. Forms with ten or more fields convert at under 10 percent in most studies.&lt;/p&gt;

&lt;p&gt;For roofing specifically, the numbers are likely worse because the majority of roofing searches happen on mobile devices. A homeowner searching for a roofer is almost always doing so on their phone. They are either in their driveway looking at the damage, at work during a break, or at home after seeing a water stain spread across the ceiling.&lt;/p&gt;

&lt;p&gt;None of those situations is a comfortable desktop-form-filling scenario. They are phone-in-one-hand, quick-message scenarios. A form that takes four minutes to complete on a phone will be abandoned by most of the homeowners who started it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fields That Actually Belong on a Roofing Contact Form
&lt;/h2&gt;

&lt;p&gt;After stripping away everything that serves the business rather than the conversion, a roofing quote request form needs exactly these fields at the point of first contact:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First name&lt;/strong&gt;, so you know who you are calling and can address them properly when you ring back. Last name is optional at this stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phone number&lt;/strong&gt; because this is how you will follow up. It is the most important field on the form. Make it required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email address&lt;/strong&gt; as a secondary contact method, so you can send a confirmation that their request was received. Also useful if they do not answer when you call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Property address&lt;/strong&gt; so you know where the job is, whether it is in your service area, and so you can look at the property on Google Maps before you call. This saves time and makes the first call more informed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type of work&lt;/strong&gt; as a dropdown with clear options. Full replacement, repair, storm damage, inspection, gutters, not sure. A dropdown is much faster to complete on mobile than a text field, and it gives you the context you need without requiring the homeowner to write a paragraph.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Optional message or photo upload&lt;/strong&gt; for homeowners who want to give more context or show you the damage. Making this optional is important. Some homeowners will use it. Many will not. Making it required creates unnecessary friction.&lt;/p&gt;

&lt;p&gt;That is six fields. Or five if you remove the optional message. That is the form. Everything else comes out in the first phone call.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Photo Upload Field That Changes Everything
&lt;/h2&gt;

&lt;p&gt;Most roofing contact forms do not include a file upload field. This is a missed opportunity that is specific to roofing in a way that does not apply to most other service businesses.&lt;/p&gt;

&lt;p&gt;A homeowner who has spotted damage on their roof is already looking at it. They have their phone in their hand. They took a photo or a video because that is what people do when they see something unexpected. If your form gives them a field to upload that photo, they will use it.&lt;/p&gt;

&lt;p&gt;This does three valuable things simultaneously.&lt;/p&gt;

&lt;p&gt;It lowers the submission barrier because the homeowner feels like they have communicated the problem properly. They are not just leaving a vague message. They are showing you what they are dealing with. That completeness makes them more likely to submit.&lt;/p&gt;

&lt;p&gt;It gives you information that makes your follow-up call more valuable. You can call back and say you looked at the photo, and it looks like the flashing around the chimney rather than the shingles themselves. That level of preparation creates immediate trust. It signals that you are attentive and knowledgeable before you have even visited the property.&lt;/p&gt;

&lt;p&gt;It reduces the number of calls required to get to the inspection stage because you have already started the assessment process remotely. Homeowners appreciate not having to explain everything from scratch on the call.&lt;/p&gt;

&lt;p&gt;File upload on a roofing contact form converts hesitant submitters into confident ones. It is one of the few form additions that increases rather than decreases completion rates because it replaces the pressure of writing a description with the ease of sharing a photo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the Form Needs to Live on Your Website
&lt;/h2&gt;

&lt;p&gt;Placement is as important as the form itself. A well-designed five-field form on a Contact page that nobody visits is worse than a basic form that appears on every page where a homeowner might arrive from a Google search.&lt;/p&gt;

&lt;p&gt;Think about how homeowners actually find roofing websites. They search for something specific. Roof repair after a storm. Roof replacement cost. Roofer near me. They click a result. They land on a page.&lt;/p&gt;

&lt;p&gt;That page might be your homepage. It might be your storm damage service page. It might be a blog post about signs of hail damage. It is almost certainly not your Contact page, which they would have to navigate to deliberately.&lt;/p&gt;

&lt;p&gt;If the only place your form exists is on the Contact page, a significant portion of your visitors never see it. They land on a service page, read some content, decide they want to enquire, and then have to hunt for a way to reach you. Some find it. Many leave.&lt;/p&gt;

&lt;p&gt;The form should appear in at least four places on your website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the homepage&lt;/strong&gt; in a prominent section above the fold or at least without excessive scrolling on mobile. This is the first page many visitors see, and the form should be visible without effort.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At the bottom of each service page&lt;/strong&gt; so that a visitor who just read your full storm damage restoration page can immediately request an inspection without navigating away. The moment of highest intent is immediately after reading relevant content. The form should be there at that moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On a dedicated quote request page&lt;/strong&gt; that can be linked from everywhere and that Google can index independently for searches like "free roofing quote Virginia" or "request roof inspection."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In the mobile navigation&lt;/strong&gt; as a sticky button or a prominent link so that on small screens where navigation is compressed, there is always a visible way to reach the form without digging through menus.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Call to Action That Converts
&lt;/h2&gt;

&lt;p&gt;The text on your submit button and the heading above your form matter more than most website owners realise.&lt;/p&gt;

&lt;p&gt;A form headed "Contact Us" with a button that says "Submit" is doing almost no persuasion work. The homeowner knows they are sending a message. They do not need to be told. What they need is reassurance that submitting is the right move and a clear description of what happens next.&lt;/p&gt;

&lt;p&gt;Compare these two headings and button combinations:&lt;/p&gt;

&lt;p&gt;Version one: "Contact Us" with a "Submit" button.&lt;/p&gt;

&lt;p&gt;Version two: "Request Your Free Roof Inspection" with a "Send My Request" button and a line underneath that says "We respond to all requests within 24 hours."&lt;/p&gt;

&lt;p&gt;The second version tells the homeowner exactly what they are requesting, what the commitment level is (free, no obligation), and what they can expect after submitting (a response within 24 hours). That clarity reduces the hesitation that causes people to abandon forms at the last step.&lt;/p&gt;

&lt;p&gt;Adding a response time commitment next to the submit button is particularly effective for roofing because speed of response is one of the most important factors homeowners use when choosing between contractors. Seeing "We respond within 24 hours" in the moment of submission makes the homeowner feel confident that their enquiry will not disappear into a void.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Trust Signals That Belong Next to the Form
&lt;/h2&gt;

&lt;p&gt;A homeowner filling in a roofing contact form is making a small but real decision about whether to trust an unfamiliar business with their home and their personal contact details. The form is not just a data collection mechanism. It is a trust checkpoint.&lt;/p&gt;

&lt;p&gt;Most roofing websites put their trust signals on a separate Testimonials page or in the About section. By the time a visitor reaches the form, those signals are long gone. The form appears in isolation, asking for personal information from a business the visitor may have found five minutes ago.&lt;/p&gt;

&lt;p&gt;Placing trust signals directly adjacent to the form changes this dynamic. A short column next to the form or a strip directly above the submit button showing three to five pieces of evidence significantly increases the likelihood that a hesitant visitor completes the submission.&lt;/p&gt;

&lt;p&gt;The most effective trust signals for a roofing firm are:&lt;/p&gt;

&lt;p&gt;Your Google rating and number of reviews with a small link to verify. Something as simple as "4.9 stars across 312 Google reviews" next to a star icon is enough. Homeowners check Google reviews before hiring anyone. Showing the rating right next to the form removes the need to leave the page to find that information.&lt;/p&gt;

&lt;p&gt;A statement about your crew. "No subcontractors. Every person on your roof is our own employee." This is one of the highest trust concerns homeowners have about roofing companies, and very few put it front and centre where it can actually influence a decision.&lt;/p&gt;

&lt;p&gt;Your license number. In states where this is publicly verifiable, displaying it next to the form signals legitimacy in a way that no amount of marketing copy can replicate.&lt;/p&gt;

&lt;p&gt;A short response time commitment. "We respond to all quote requests within 24 hours," says the homeowner. Their message will not be ignored.&lt;/p&gt;

&lt;p&gt;One or two lines from a genuine customer review. Not a dedicated testimonials section. Just a single sentence from a real customer placed right next to the submit button. "They were the only company that actually told me the truth about what I needed" is more convincing than a three-paragraph testimonial on a separate page that nobody reads.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Confirmation That Keeps the Lead Warm
&lt;/h2&gt;

&lt;p&gt;What happens after someone submits your form is almost as important as the form itself.&lt;/p&gt;

&lt;p&gt;Most roofing contact forms show a generic "Thank you for your message" page or nothing at all. This is a missed opportunity that costs you warm leads.&lt;/p&gt;

&lt;p&gt;When a homeowner submits a roofing enquiry, they are in a window of high engagement. They just made a small commitment. They are thinking about their roof and their options. They are open to being guided toward the next step.&lt;/p&gt;

&lt;p&gt;A good confirmation page or confirmation message does three things.&lt;/p&gt;

&lt;p&gt;It acknowledges the submission specifically. Not "Thanks for contacting us" but "Your roof inspection request has been received." Specific language confirms that the right thing happened and the right person will be getting in touch.&lt;/p&gt;

&lt;p&gt;It tells them exactly what happens next. "One of our team will call you within 24 hours to arrange a convenient time for a free inspection." This manages expectations and prevents the homeowner from reaching out to three other roofers in the meantime because they are not sure anyone is coming.&lt;/p&gt;

&lt;p&gt;It gives them something to do while they wait. A link to your before and after gallery. A link to your Google reviews. A short paragraph about your inspection process. This keeps them engaged with your business during the gap between submission and your call.&lt;/p&gt;

&lt;p&gt;An auto-responder email that goes to their inbox the moment they submit, repeating these three elements, is even more effective because it gives them something to find when they search their email later and can no longer remember which roofing company they contacted.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Complete Form Setup Looks Like
&lt;/h2&gt;

&lt;p&gt;Putting all of this together, a roofing contact form that actually converts has the following characteristics.&lt;/p&gt;

&lt;p&gt;It lives on every relevant page of the website, including the homepage, each service page, and a dedicated quote request page.&lt;/p&gt;

&lt;p&gt;It has five to six fields. First name, phone, email, address, service type as a dropdown, and an optional photo upload.&lt;/p&gt;

&lt;p&gt;The heading above the form is specific and action-oriented. "Request Your Free Roof Inspection" or "Get a Free Quote Today" rather than "Contact Us."&lt;/p&gt;

&lt;p&gt;The submit button uses active specific language. "Send My Request" or "Request My Free Inspection" rather than "Submit."&lt;/p&gt;

&lt;p&gt;A response time commitment appears directly below the submit button. "We respond to all requests within 24 hours."&lt;/p&gt;

&lt;p&gt;Trust signals appear adjacent to the form. Star rating and review count, crew statement, license number, and one customer quote.&lt;/p&gt;

&lt;p&gt;A good confirmation message appears after submission, explaining what happens next.&lt;/p&gt;

&lt;p&gt;An auto-responder email goes to the homeowner immediately after submission, confirming receipt and next steps.&lt;/p&gt;

&lt;p&gt;Every submission routes into a lead pipeline where it can be tracked from New to Contacted to Converted rather than disappearing into an email inbox.&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%2F8x25753iyrhrosb7p2bs.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%2F8x25753iyrhrosb7p2bs.png" alt="Formgrid dashboard showing roofing &amp;lt;br&amp;gt;
enquiries tracked as leads with &amp;lt;br&amp;gt;
pipeline status notes and follow up &amp;lt;br&amp;gt;
up reminders" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And crucially, every submission syncs automatically to a shared Google Sheet so the entire office team sees new enquiries in real time without logging into a separate tool.&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="Google Sheets showing roofing &amp;lt;br&amp;gt;
enquiry submissions syncing &amp;lt;br&amp;gt;
automatically as new rows with &amp;lt;br&amp;gt;
all contact details in columns" width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tool Behind This Setup
&lt;/h2&gt;

&lt;p&gt;Everything described in this post is built using &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Formgrid started as a form backend for static websites, then added a drag-and-drop builder that generates shareable form links without requiring any website changes. Every submission becomes a tracked lead with a pipeline, notes, follow-up reminders, and automatic Google Sheets sync.&lt;/p&gt;

&lt;p&gt;The free plan is available with no credit card required. The Premium plan at $8 per month adds file uploads for photo submissions, advanced spam protection, CSV export, and Google Sheets sync for up to 500 rows per month.&lt;/p&gt;

&lt;p&gt;For roofing companies that want the full system built for them including the landing page, form placement, Google Sheets integration, UTM tracking, and lead pipeline, there is a done-for-you setup starting at $500 one time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev/services-roofing" rel="noopener noreferrer"&gt;See the full roofing lead generation setup →&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Summary
&lt;/h2&gt;

&lt;p&gt;A roofing contact form that actually gets homeowners to submit is not a complicated piece of technology. It is a simple form in the right place with the right number of fields, the right call to action, and the right trust signals next to it.&lt;/p&gt;

&lt;p&gt;Place the form on every relevant page so visitors never have to navigate to find it.&lt;/p&gt;

&lt;p&gt;Reduce the fields to five or six. Name, phone, email, address, service type, and optional photo upload.&lt;/p&gt;

&lt;p&gt;Use a specific call to action that tells homeowners exactly what they are requesting and what happens next.&lt;/p&gt;

&lt;p&gt;Add the photo upload field so homeowners can show you the damage rather than describe it.&lt;/p&gt;

&lt;p&gt;Place trust signals directly next to the form rather than on a separate page where nobody sees them.&lt;/p&gt;

&lt;p&gt;Show a specific confirmation message and send an auto-responder email after submission so the homeowner knows their message was received and what comes next.&lt;/p&gt;

&lt;p&gt;Route every submission into a lead pipeline so nothing gets forgotten between the submission and the callback.&lt;/p&gt;

&lt;p&gt;None of this requires rebuilding your website. Each piece is a specific addition or change. Implement them, and the same homeowners who were abandoning your current form will start submitting their enquiries instead.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Want the complete roofing lead generation system set up for your business? Reach out to &lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt;, and we can walk through what your website specifically needs.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Get More Roofing Quote Requests From Your Website Without Paying for More Ads</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Tue, 05 May 2026 02:32:34 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-get-more-roofing-quote-requests-from-your-website-without-paying-for-more-ads-1b02</link>
      <guid>https://dev.to/allenarduino/how-to-get-more-roofing-quote-requests-from-your-website-without-paying-for-more-ads-1b02</guid>
      <description>&lt;p&gt;Most roofing companies facing a slow pipeline reach for the same solution.&lt;/p&gt;

&lt;p&gt;They increase the Google Ads budget. &lt;br&gt;
They hire someone to run Facebook campaigns. &lt;br&gt;
They invest in more SEO. &lt;br&gt;
They drive more traffic to the same website, hoping the numbers eventually work in their favor.&lt;/p&gt;

&lt;p&gt;Sometimes it helps. Often it does not.&lt;/p&gt;

&lt;p&gt;Because the problem was never the traffic. &lt;br&gt;
The problem is what happens to that traffic after it arrives. And &lt;br&gt;
no amount of additional ad spend fixes a website that was never built to convert visitors into enquiries in the first place.&lt;/p&gt;

&lt;p&gt;The good news is that getting more quote requests does not require more marketing budget. It requires fixing the parts of your website that are quietly turning away homeowners who were ready to contact you.&lt;/p&gt;

&lt;p&gt;This post walks through exactly how to do that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why More Traffic Is Not the Answer
&lt;/h2&gt;

&lt;p&gt;Here is the math most roofing companies never look at.&lt;/p&gt;

&lt;p&gt;If your website converts 1% of visitors into quote requests, and you are getting 500 visitors per month, you are receiving 5 enquiries.&lt;/p&gt;

&lt;p&gt;Doubling your ad spend to get 1,000 visitors gives you ten enquiries. &lt;br&gt;
You spent twice as much and got twice the leads.&lt;/p&gt;

&lt;p&gt;But if you fix your conversion rate from one percent to three percent &lt;br&gt;
on the same 500 visitors, you get fifteen enquiries. No additional &lt;br&gt;
ad spend. No additional traffic. Just a website that works harder with what it already has.&lt;/p&gt;

&lt;p&gt;The biggest lever most roofing companies are not pulling is &lt;br&gt;
conversion rate. And the fixes are not expensive or technically &lt;br&gt;
complicated. They are specific and actionable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix 1: Put the Quote Form Where Homeowners Actually Are
&lt;/h2&gt;

&lt;p&gt;Open your website on your phone right now. Not on a desktop where &lt;br&gt;
everything looks clean and accessible. On your phone, the way &lt;br&gt;
a homeowner will see it after searching for a roofer during &lt;br&gt;
their lunch break or while standing in their driveway staring at a &lt;br&gt;
damaged section of their roof.&lt;/p&gt;

&lt;p&gt;Where is the form?&lt;/p&gt;

&lt;p&gt;If the answer is "on the Contact page," you have already lost a &lt;br&gt;
significant portion of visitors who would have filled it in if it were in front of them. Most people do not navigate. They scroll. If they do not see a clear way to reach out on the page they land on, they leave.&lt;/p&gt;

&lt;p&gt;The form should appear on your homepage. It should appear on each &lt;br&gt;
service page. If someone lands on your storm damage page from a &lt;br&gt;
Google search, they should be able to request an inspection without &lt;br&gt;
going anywhere else.&lt;/p&gt;

&lt;p&gt;Placement is the single most impactful change most roofing &lt;br&gt;
websites can make. It costs nothing to implement, and the results show up immediately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix 2: Reduce the Number of Fields on the Form
&lt;/h2&gt;

&lt;p&gt;Count the fields on your current contact form. If the answer is more &lt;br&gt;
than six, you are leaving enquiries on the table every single day.&lt;/p&gt;

&lt;p&gt;Research consistently shows that every additional field on a contact &lt;br&gt;
form reduces the completion rate. A homeowner on their phone with cracked shingles after a storm does not want to fill in their roof size, year of installation, property type, and insurance provider before someone will even call them back.&lt;/p&gt;

&lt;p&gt;They want to send their name and number and have a roofer call them.&lt;/p&gt;

&lt;p&gt;The information you genuinely need at the point of first contact is simple:&lt;/p&gt;

&lt;p&gt;Name so you know who you are calling back.&lt;/p&gt;

&lt;p&gt;Phone number so you can actually reach them.&lt;/p&gt;

&lt;p&gt;Email as a backup contact.&lt;/p&gt;

&lt;p&gt;Type of work, so you know roughly what the conversation is about.&lt;/p&gt;

&lt;p&gt;Property address, so you can look it up before the inspection.&lt;/p&gt;

&lt;p&gt;An optional message or photo upload for homeowners who want to give more context.&lt;/p&gt;

&lt;p&gt;That is it. Everything else can wait until the phone call. The goal &lt;br&gt;
of the form is to start a conversation, not to conduct a &lt;br&gt;
pre-inspection survey.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix 3: Make the Call to Action Specific, Not Generic
&lt;/h2&gt;

&lt;p&gt;Look at the button on your contact form. What does it say?&lt;/p&gt;

&lt;p&gt;If it says "Submit" or "Send" or "Contact Us" you are missing an &lt;br&gt;
opportunity that costs nothing to fix.&lt;/p&gt;

&lt;p&gt;Specific calls to action convert better than generic ones because &lt;br&gt;
they tell the visitor exactly what will happen next. A homeowner &lt;br&gt;
reading "Request Your Free Inspection" knows precisely what they are getting when they submit. &lt;br&gt;
A homeowner reading "Submit" does not know anything except that they &lt;br&gt;
are sending something somewhere.&lt;/p&gt;

&lt;p&gt;Test these alternatives:&lt;/p&gt;

&lt;p&gt;"Request Your Free Roof Inspection"&lt;/p&gt;

&lt;p&gt;"Get a Free Quote Today"&lt;/p&gt;

&lt;p&gt;"Send Us Your Roofing Enquiry"&lt;/p&gt;

&lt;p&gt;"Book a Free Site Visit"&lt;/p&gt;

&lt;p&gt;Any of these outperforms a generic submit button because they reduce &lt;br&gt;
the uncertainty that causes hesitation at the final step.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix 4: Add a Photo Upload Field
&lt;/h2&gt;

&lt;p&gt;This one is specific to roofing, and it is consistently underused.&lt;/p&gt;

&lt;p&gt;A homeowner who has noticed damage on their roof after a storm is &lt;br&gt;
already standing there looking at it. &lt;br&gt;
They have their phone in their hand. If your form allows them to &lt;br&gt;
upload a photo of the damage, they will. And that photo does two things.&lt;/p&gt;

&lt;p&gt;It lowers the friction of the initial enquiry because they feel &lt;br&gt;
like they have communicated the problem properly, rather than just &lt;br&gt;
leaving a vague message.&lt;/p&gt;

&lt;p&gt;It gives you a genuine head start on the conversation. You can call &lt;br&gt;
them back with a rough sense of what the job involves rather than &lt;br&gt;
going in completely blind.&lt;/p&gt;

&lt;p&gt;File upload is available on the Formgrid Premium plan at $8 per &lt;br&gt;
month. For a roofing company, it is one of the most useful features &lt;br&gt;
on the form because the product being assessed is almost always &lt;br&gt;
visual.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix 5: Add Trust Signals Near the Form
&lt;/h2&gt;

&lt;p&gt;Homeowners are making a significant decision when they hand over their contact details to a roofing company. &lt;br&gt;
They are going to let strangers on their roof. &lt;br&gt;
They are going to pay thousands of dollars for work they cannot watch being done. They want to know you are legitimate before they commit to a conversation.&lt;/p&gt;

&lt;p&gt;Most roofing websites put trust signals on a separate About page &lt;br&gt;
or bury testimonials at the bottom of the homepage. By the time a &lt;br&gt;
visitor reaches the contact form, the trust signals are long gone.&lt;/p&gt;

&lt;p&gt;Put them right next to the form:&lt;/p&gt;

&lt;p&gt;A short line about how long you have been operating.&lt;/p&gt;

&lt;p&gt;Your Google rating and number of reviews with a link to verify.&lt;/p&gt;

&lt;p&gt;A statement about whether you use your own crew or subcontractors. &lt;br&gt;
Homeowners care deeply about this.&lt;/p&gt;

&lt;p&gt;One or two sentences from a recent customer about their experience.&lt;/p&gt;

&lt;p&gt;Your license number, if you are in a state where this is visible.&lt;/p&gt;

&lt;p&gt;These are small additions that significantly reduce the hesitation &lt;br&gt;
between a visitor reading your page and a visitor submitting the form.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix 6: Set Up a Lead Pipeline So Nothing Slips Through
&lt;/h2&gt;

&lt;p&gt;Getting more quote requests only helps your business if you actually &lt;br&gt;
follow up on them.&lt;/p&gt;

&lt;p&gt;Most roofing companies manage enquiries through email. A form &lt;br&gt;
submission arrives in the inbox. It sits there alongside everything &lt;br&gt;
else. If the owner is on a job and checks email at the end of &lt;br&gt;
the day, the lead is already several hours old. If the next day is busy, the lead gets pushed to the following &lt;br&gt;
day. By then, the homeowner had already spoken to two other roofers &lt;br&gt;
who responded faster.&lt;/p&gt;

&lt;p&gt;The data on this is direct. Leads contacted within five minutes of &lt;br&gt;
submitting a form are nine times more likely to convert than leads &lt;br&gt;
contacted after thirty minutes. Speed of response is one of the &lt;br&gt;
strongest predictors of whether a roofing enquiry becomes a job.&lt;/p&gt;

&lt;p&gt;A lead pipeline solves this by giving every enquiry a status and a visible place in your workflow.&lt;/p&gt;

&lt;p&gt;When a form is submitted, the lead appears in your dashboard as New. &lt;br&gt;
You get an immediate email notification with their full details. &lt;br&gt;
You call them back. You mark the lead as Contacted. You add a note &lt;br&gt;
about the conversation. You set a follow-up date for next Tuesday &lt;br&gt;
because they want to think about it.&lt;/p&gt;

&lt;p&gt;On Tuesday, you get an email reminder with their details and your notes. You call again. You mark them converted when they agree to the job.&lt;/p&gt;

&lt;p&gt;At any point, you can see exactly how many active leads you have, &lt;br&gt;
which ones are waiting for a follow-up, and what does your overall conversion rate look like from initial enquiry to closed job?&lt;/p&gt;

&lt;p&gt;That visibility changes how you run the business. Most roofing &lt;br&gt;
company owners have no idea what their enquiry is about, the job conversion rate is because there is no system to measure 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%2F8x25753iyrhrosb7p2bs.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%2F8x25753iyrhrosb7p2bs.png" alt="Formgrid lead pipeline showing &amp;lt;br&amp;gt;
roofing enquiries tracked from New to Contacted to Converted with &amp;lt;br&amp;gt;
notes and follow-up reminders" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix 7: Sync Every Enquiry to Google Sheets Automatically
&lt;/h2&gt;

&lt;p&gt;If you have an office manager or an admin team who handle scheduling &lt;br&gt;
and coordination, they should not need to log into a separate tool &lt;br&gt;
or search through email to see incoming quote requests.&lt;/p&gt;

&lt;p&gt;Connecting your form to a Google Sheet means every new enquiry &lt;br&gt;
appears as a new row automatically the moment it is submitted. Name, &lt;br&gt;
phone, email, address, type of work, and timestamp all in columns. &lt;br&gt;
The whole team can see new enquiries in real time without accessing &lt;br&gt;
anything new. No manual data entry. No forwarding emails. No missed &lt;br&gt;
leads because someone was not watching the inbox.&lt;/p&gt;

&lt;p&gt;For a roofing company with a dedicated office team, this is one &lt;br&gt;
of the most practically useful changes you can make to your &lt;br&gt;
enquiry process.&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="Google Sheets showing roofing &amp;lt;br&amp;gt;
enquiries syncing automatically &amp;lt;br&amp;gt;
as new rows with all form fields &amp;lt;br&amp;gt;
as column headers" width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Fix 8: Track Which Marketing Is Actually Sending You Leads
&lt;/h2&gt;

&lt;p&gt;This is the fix most roofing companies overlook because it &lt;br&gt;
sounds technical. It is not.&lt;/p&gt;

&lt;p&gt;If you are spending money on Google Ads, posting on Facebook, &lt;br&gt;
listed on local directories, and collecting referrals from past &lt;br&gt;
customers, which one of those is actually sending you the quote &lt;br&gt;
requests that become paying jobs?&lt;/p&gt;

&lt;p&gt;Without source tracking on your form, you have no way to answer &lt;br&gt;
that question. You are making decisions about where to spend &lt;br&gt;
your marketing budget based on guesswork rather than data.&lt;/p&gt;

&lt;p&gt;UTM tracking solves this by attaching a label to each version &lt;br&gt;
of your form link. You create different links for different &lt;br&gt;
channels:&lt;br&gt;
Your Google Ad link:&lt;br&gt;
formgrid.dev/f/your-form-id&lt;br&gt;
?utm_source=google&amp;amp;utm_medium=paid&lt;br&gt;
Your Facebook post link:&lt;br&gt;
formgrid.dev/f/your-form-id&lt;br&gt;
?utm_source=facebook&amp;amp;utm_medium=social&lt;br&gt;
Your directory listing link:&lt;br&gt;
formgrid.dev/f/your-form-id&lt;br&gt;
?utm_source=directory&amp;amp;utm_medium=referral&lt;/p&gt;

&lt;p&gt;When a homeowner clicks your Facebook link and fills in the &lt;br&gt;
form, Formgrid automatically records that they came from &lt;br&gt;
Facebook. After 30 days, you can see exactly how many enquiries came from each channel and which ones actually became jobs.&lt;/p&gt;

&lt;p&gt;A roofer spending $800 per month on Google Ads, who discovers that &lt;br&gt;
most of their actual paying customers came from their Facebook posts, which has made a discovery worth far more than the cost of any tool.&lt;/p&gt;

&lt;p&gt;The Formgrid Share modal generates these tracked links automatically. &lt;br&gt;
You do not need to edit URLs manually or understand the technical &lt;br&gt;
details. You open the Share button in your form builder and copy the &lt;br&gt;
pre-built tracked link for each channel you use.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Looks Like When Everything Is Set Up
&lt;/h2&gt;

&lt;p&gt;A homeowner searches "roof repair near me" after noticing a leak.&lt;/p&gt;

&lt;p&gt;They land on your storm damage service page. Your quote form is &lt;br&gt;
visible on that page without them needing to navigate anywhere. &lt;br&gt;
The form has five fields and a clear call to action. There is &lt;br&gt;
a photo upload field and a short note about your response time and &lt;br&gt;
your Google rating sitting right next to the submit button.&lt;/p&gt;

&lt;p&gt;They fill it in and upload a photo of the damage from their phone. &lt;br&gt;
They hit submit.&lt;/p&gt;

&lt;p&gt;You receive an immediate email notification with their name, &lt;br&gt;
number, address, type of work, and the photo they uploaded. &lt;br&gt;
Their details appear as a new row in your team's shared Google Sheet. &lt;br&gt;
Their lead appears in your Formgrid dashboard as New, with the source &lt;br&gt;
showing Google organic search.&lt;/p&gt;

&lt;p&gt;You call them back within the hour. &lt;br&gt;
You mark the lead as Contacted. &lt;br&gt;
You schedule the inspection and add a note. Two days later, you convert the enquiry into a job and mark it Converted.&lt;/p&gt;

&lt;p&gt;Your conversion rate updates automatically. Your team saw the &lt;br&gt;
enquiry in real time. Nothing fell through the cracks.&lt;/p&gt;

&lt;p&gt;That is not a complicated system. It is a form, a pipeline, a Google Sheet, and an email notification working together. But most roofing websites are missing every single piece of it.&lt;/p&gt;




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

&lt;p&gt;A roofing company serving a regional area was receiving around 600 website visitors per month from local Google searches. Their contact form was on a dedicated Contact page with nine &lt;br&gt;
fields. They were receiving three to four enquiries per month.&lt;/p&gt;

&lt;p&gt;They simplified the form to five fields and placed it on the homepage &lt;br&gt;
and on each service page. They added a photo upload field. They connected the form to a lead pipeline so every submission appeared as a tracked lead rather than just an email. &lt;br&gt;
They set up Google Sheets sync so their office manager could see new &lt;br&gt;
leads without logging into anything new.&lt;/p&gt;

&lt;p&gt;Within the first month, enquiries went from three or four to fourteen.&lt;/p&gt;

&lt;p&gt;The traffic had not changed. The ad budget had not increased. The &lt;br&gt;
only thing that changed was what happened to that traffic after &lt;br&gt;
it arrived on the website.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tool That Handles All of This
&lt;/h2&gt;

&lt;p&gt;The system described in this post &lt;br&gt;
is built using &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Formgrid started as a form backend for static websites and later added a drag-and-drop form builder. Every submission becomes a tracked lead with a pipeline, notes, and follow-up &lt;br&gt;
reminders, and automatic Google Sheets sync. The Share modal &lt;br&gt;
generates tracked links for every social channel automatically so &lt;br&gt;
you always know where your leads are coming from.&lt;/p&gt;

&lt;p&gt;The free plan is available with no credit card required. Premium starts at $8 per month and includes file uploads for photo submissions, CSV export, and Google Sheets sync for up to 500 rows per month.&lt;/p&gt;

&lt;p&gt;For roofing companies that want the entire system set up for them &lt;br&gt;
including the landing page, form, Google Sheets integration, and UTM &lt;br&gt;
tracking, and lead pipeline, there is a done-for-you option starting &lt;br&gt;
at $500 one time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev/services-roofing" rel="noopener noreferrer"&gt;See how Formgrid helps roofing &lt;br&gt;
companies get more quote requests&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Summary
&lt;/h2&gt;

&lt;p&gt;Getting more quote requests from your existing roofing website does &lt;br&gt;
not require a bigger ad budget. It requires fixing the specific &lt;br&gt;
points where your current website is turning away homeowners who &lt;br&gt;
were ready to contact you.&lt;/p&gt;

&lt;p&gt;Move the form onto every relevant page so visitors do not have to &lt;br&gt;
navigate to find it.&lt;/p&gt;

&lt;p&gt;Reduce the fields to the five or six you actually need at first contact.&lt;/p&gt;

&lt;p&gt;Make the call to action specific so homeowners know exactly what &lt;br&gt;
happens when they submit.&lt;/p&gt;

&lt;p&gt;Add a photo upload field so homeowners can show you the damage &lt;br&gt;
from their phone.&lt;/p&gt;

&lt;p&gt;Put trust signals next to the form so visitors feel confident submitting.&lt;/p&gt;

&lt;p&gt;Set up a lead pipeline so every enquiry is tracked and nothing is &lt;br&gt;
gets forgotten.&lt;/p&gt;

&lt;p&gt;Sync enquiries to Google Sheets so your whole team sees new leads in real time.&lt;/p&gt;

&lt;p&gt;Track which marketing channel is sending your best leads, so you stop spending on what is not working.&lt;/p&gt;

&lt;p&gt;None of these requires a new website. Each one is a specific fix. &lt;br&gt;
Implement them, and the traffic you already have will start turning &lt;br&gt;
into the quote requests and the jobs your business runs on.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Running a roofing business and want the full system set up for you? &lt;br&gt;
Reach out at &lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt;, and we can talk through what makes &lt;br&gt;
sense for your specific setup.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>marketing</category>
      <category>ux</category>
      <category>web</category>
    </item>
    <item>
      <title>Why Your Roofing Website Gets Traffic, But No Quote Requests</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Mon, 04 May 2026 16:11:36 +0000</pubDate>
      <link>https://dev.to/allenarduino/why-your-roofing-website-gets-traffic-but-no-quote-requests-488c</link>
      <guid>https://dev.to/allenarduino/why-your-roofing-website-gets-traffic-but-no-quote-requests-488c</guid>
      <description>&lt;p&gt;You check Google Analytics, and the numbers look fine.&lt;/p&gt;

&lt;p&gt;Hundreds of visitors every month. &lt;br&gt;
People find your site from local searches. Time on page looks decent. Nothing obviously wrong.&lt;/p&gt;

&lt;p&gt;But the phone is quiet. The inbox is empty. Quote requests are not &lt;br&gt;
coming in the way the traffic numbers suggest they should be.&lt;/p&gt;

&lt;p&gt;This is one of the most common frustrations roofing contractors &lt;br&gt;
face in 2026. And almost everyone diagnoses it wrong.&lt;/p&gt;

&lt;p&gt;The instinct is to assume you need more traffic. &lt;br&gt;
So you spend more on Google Ads, invest in more SEO, and drive even more visitors to the same site. The leads still do not come. &lt;br&gt;
Because the traffic was never the problem.&lt;/p&gt;

&lt;p&gt;The problem is what happens to that traffic after it arrives.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Reason Roofing Websites Do Not Convert
&lt;/h2&gt;

&lt;p&gt;Most roofing websites were built to exist online. &lt;br&gt;
A web designer created something that looks professional, &lt;br&gt;
lists your services, shows some photos of past jobs, and has your &lt;br&gt;
phone number in the header.&lt;/p&gt;

&lt;p&gt;That is a brochure. Not a lead generation system.&lt;/p&gt;

&lt;p&gt;A brochure tells people what you do. &lt;br&gt;
A lead generation system captures their interest at the moment they &lt;br&gt;
have it, routes that interest into something trackable, and gives you &lt;br&gt;
a way to follow up before they call someone else.&lt;/p&gt;

&lt;p&gt;Most roofing websites are missing the second part entirely.&lt;/p&gt;

&lt;p&gt;Here is where the leads are leaking out before they ever reach you.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem 1: The Contact Form Is an Afterthought
&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%2Fg3m0tj65l2fbvwanace6.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%2Fg3m0tj65l2fbvwanace6.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Walk through your own website like a homeowner who just noticed their &lt;br&gt;
roof is leaking after last night's rain. They are on their phone. They are a little stressed. They want to find someone who can help quickly.&lt;/p&gt;

&lt;p&gt;Where is your contact form? Is it on a separate Contact page buried &lt;br&gt;
in the navigation? Does it ask for their name, email, phone number, &lt;br&gt;
address, type of work, roof size, year of installation, and a message?&lt;/p&gt;

&lt;p&gt;Every additional field on a contact form costs you submissions. Research consistently shows that forms asking for more than five to six pieces of information see significantly lower &lt;br&gt;
completion rates than simpler ones. A homeowner on their phone during &lt;br&gt;
their lunch break will not fill in an eight-field form. They will close the tab and call the next roofer they find.&lt;/p&gt;

&lt;p&gt;The fix is not a beautiful form. It is a simple one. Name, phone &lt;br&gt;
number, email, type of work needed, and an optional message. That is &lt;br&gt;
enough to start a conversation. You can collect everything else &lt;br&gt;
when you call them back.&lt;/p&gt;

&lt;p&gt;The other part of this is placement. Your form should not live only on a Contact page. It should appear on your homepage, on your services pages, and ideally at the bottom of every page a visitor might land on from a Google search. A homeowner who lands on your storm damage page from a Google search should not have to navigate anywhere to request a quote. It should be right there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem 2: You Have No Way to Follow Up Systematically
&lt;/h2&gt;

&lt;p&gt;A homeowner fills in your contact form at 2 pm on a Tuesday. Your &lt;br&gt;
website sends you an email notification. You are on a job. &lt;br&gt;
You see the email at 5 pm. You plan to call tomorrow morning.&lt;/p&gt;

&lt;p&gt;By then, they had already spoken to two other roofers who responded &lt;br&gt;
faster.&lt;/p&gt;

&lt;p&gt;The data on this is stark. Leads contacted within five minutes of &lt;br&gt;
submitting a form is nine times more likely to convert than leads &lt;br&gt;
contacted after thirty minutes. By the time 24 hours have passed &lt;br&gt;
the conversion probability has dropped to almost nothing for a &lt;br&gt;
homeowner with an urgent problem.&lt;/p&gt;

&lt;p&gt;This is not about being available every minute of every day. It is &lt;br&gt;
about having a system that captures the lead properly and ensures &lt;br&gt;
nothing slips through.&lt;/p&gt;

&lt;p&gt;When a quote request comes in, you need to know about it immediately. &lt;br&gt;
You need the full details in one place. You need to be able to &lt;br&gt;
mark it as contacted when you reach out. You need a reminder &lt;br&gt;
set for the follow-up date, so that if they do not answer on &lt;br&gt;
Tuesday you do not forget to try again on Thursday.&lt;/p&gt;

&lt;p&gt;Most roofing websites do not give you any of that. The email arrives. &lt;br&gt;
You either respond or you do not. There is no pipeline. There is no &lt;br&gt;
tracking. There is no visibility into which leads you followed up &lt;br&gt;
on and which ones went cold.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem 3: You Cannot Tell Which Marketing Is Sending You Leads
&lt;/h2&gt;

&lt;p&gt;You are running Google Ads. You are posting on Facebook. You did a &lt;br&gt;
letterbox drop last month. You get referrals from past customers. You &lt;br&gt;
have a presence on a few local directories.&lt;/p&gt;

&lt;p&gt;Which one of those is sending you quote requests? Which one is sending you the jobs that actually become paying customers, rather than people who enquire and go quiet?&lt;/p&gt;

&lt;p&gt;If your current setup is a contact form that sends you an email, you &lt;br&gt;
have no way to answer that question. The submission arrives with a name and a phone number. There is nothing in it that tells you the person came from your Facebook ad or from the Google search they did after a storm.&lt;/p&gt;

&lt;p&gt;This matters enormously for where you spend your money and your time. &lt;br&gt;
A roofer spending $800 a month on Google Ads, who discovers that 80 &lt;br&gt;
percent of their actual paying customers came from Facebook organic &lt;br&gt;
posts have made a significant discovery. &lt;br&gt;
Without source tracking on your enquiry form, that discovery is impossible to make.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem 4: Your Mobile Experience Is Losing You Leads Before They Even See Your Form
&lt;/h2&gt;

&lt;p&gt;The majority of roofing searches happen on smartphones. A homeowner &lt;br&gt;
notices something wrong with their roof. &lt;br&gt;
They pick up their phone and search. They land on your site.&lt;/p&gt;

&lt;p&gt;If your site loads slowly on mobile, you have already lost a significant portion of those visitors before they see a single word about your company. If your form is hard to fill in on a small screen, you lose another portion. If the submit button is below the fold and not obvious on mobile, you lose more.&lt;/p&gt;

&lt;p&gt;The visitors who leave because of these friction points do not &lt;br&gt;
disappear. They go to the next result and call that roofer instead.&lt;/p&gt;

&lt;p&gt;Testing your own site on your phone from the perspective of &lt;br&gt;
a first-time visitor takes ten minutes and will tell you more &lt;br&gt;
about your conversion problem than any analytics tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  Problem 5: There Is No Evidence You Are Real and Trustworthy
&lt;/h2&gt;

&lt;p&gt;Homeowners are making a significant decision when they contact a roofing company. They are going to let strangers on their roof. They are going to pay thousands of dollars for work they cannot supervise. &lt;br&gt;
They are trusting that the finished result is what they paid for.&lt;/p&gt;

&lt;p&gt;Before they submit a form, they are looking for evidence that you are legitimate, that past customers had good experiences, and that you will not disappear after taking the deposit.&lt;/p&gt;

&lt;p&gt;If your website has no visible reviews, no before-and-after photos &lt;br&gt;
of real jobs, no information about how long you have been operating, &lt;br&gt;
and no details about the people who will actually do the work, visitors will hesitate. And hesitation on a contact form means abandonment.&lt;/p&gt;

&lt;p&gt;Trust signals do not have to be elaborate. Five genuine Google &lt;br&gt;
reviews displayed prominently. Three before and after photos &lt;br&gt;
with the location and type of work listed. A statement about &lt;br&gt;
how many years you have been operating and whether you use &lt;br&gt;
your own crew or subcontractors. These are small things that &lt;br&gt;
significantly reduce the hesitation that stands between a visitor and a submitted form.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Lead Generation System for a Roofing Website Actually Looks Like
&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%2F1y99sijorwa66cmx2ego.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%2F1y99sijorwa66cmx2ego.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fixing the problems above does not require a new website. It requires &lt;br&gt;
adding the right infrastructure to what you already have.&lt;/p&gt;

&lt;p&gt;A properly set up roofing lead system does the following:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Captures the enquiry immediately.&lt;/strong&gt; A simple form on every relevant page with no more than six fields. Name, phone, email, property address, type of work, and an optional photo upload for homeowners who want to show you the damage. The form is prominent on &lt;br&gt;
mobile. It is above the fold on service pages. It has a clear and &lt;br&gt;
specific call to action that says something like "Request Your Free &lt;br&gt;
Inspection" rather than the generic "Contact Us."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Routes the lead into a trackable pipeline.&lt;/strong&gt; Every submission lands &lt;br&gt;
in a dashboard as a named lead with a status. New when they arrive. &lt;br&gt;
Contacted when you reach out. Converted when they become a job. &lt;br&gt;
You can see at any moment how many active leads you have, which ones &lt;br&gt;
you have not followed up on, and what your overall conversion rate &lt;br&gt;
looks like. That visibility alone changes how you run the business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sends you an immediate notification.&lt;/strong&gt; &lt;br&gt;
An email arrives the moment someone submits a form. Not a daily digest. Not a weekly summary. An immediate notification with the lead's full details so you can respond quickly while they are still thinking about their roof and have not yet called the next company on the list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Syncs automatically to Google Sheets.&lt;/strong&gt; If you have an office manager or admin team who coordinate jobs, they should not need to log into a separate tool to see incoming enquiries. Every new submission can appear as a new row in a shared Google Sheet automatically. The whole team sees new leads without anyone manually transferring data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tells you where each lead came from.&lt;/strong&gt; &lt;br&gt;
Using tracked links with UTM parameters, each version of your &lt;br&gt;
enquiry form link can carry a label showing whether the visitor came &lt;br&gt;
from your Google Ad, your Facebook post, your local directory listing, or a referral. That information attaches to the lead automatically when they submit. After 30 days, you can see exactly which channel is generating real enquiries and which ones are generating nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reminds you to follow up.&lt;/strong&gt; &lt;br&gt;
If a lead does not answer when you call on Tuesday, you set a &lt;br&gt;
follow-up date for Thursday. On Thursday, you receive an email &lt;br&gt;
with the lead's details and any notes you added. You pick up the &lt;br&gt;
phone with the full context in front of you. The lead never &lt;br&gt;
gets forgotten because you were busy on a job.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real Example of What This Changes
&lt;/h2&gt;

&lt;p&gt;A roofing company serving a regional area was getting around 600 website visitors per month from local Google searches. Their contact form was on a dedicated Contact page. It had nine fields. They were &lt;br&gt;
receiving around three to four enquiries per month.&lt;/p&gt;

&lt;p&gt;They simplified the form to five fields and placed it on their &lt;br&gt;
homepage and on each of their service pages. They added a &lt;br&gt;
photo upload field so homeowners could send pictures of damage. &lt;br&gt;
They connected the form to a simple lead pipeline so every &lt;br&gt;
submission appeared as a tracked lead rather than just an email. &lt;br&gt;
They set up Google Sheets sync so their office manager could &lt;br&gt;
see new leads without logging into anything new.&lt;/p&gt;

&lt;p&gt;Within the first month, enquiries went from three or four to &lt;br&gt;
fourteen. The traffic had not changed. The ad budget had not &lt;br&gt;
increased. The only thing that changed was what happened to the traffic after it arrived.&lt;/p&gt;

&lt;p&gt;Fourteen enquiries per month from 600 visitors is still a modest &lt;br&gt;
conversion rate. But it is the difference between a quiet phone &lt;br&gt;
and a pipeline of active jobs to work through.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tool Behind This Setup
&lt;/h2&gt;

&lt;p&gt;The lead system described above is &lt;br&gt;
built using &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;Formgrid&lt;/a&gt;. &lt;br&gt;
Formgrid started as a form backend for static websites and later added a drag-and-drop form builder. Every submission becomes a tracked lead with a pipeline, notes, follow-up reminders, and automatic Google Sheets sync.&lt;/p&gt;

&lt;p&gt;The free plan is available with no &lt;br&gt;
credit card required. Premium starts &lt;br&gt;
at $8 per month and includes file &lt;br&gt;
uploads, CSV export, and up to 500 Google Sheets rows per month.&lt;/p&gt;

&lt;p&gt;For roofing companies that want the entire system set up for them &lt;br&gt;
including the landing page, form, Google Sheets integration, and UTM &lt;br&gt;
tracking there is a done-for-you option starting at $500.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://formgrid.dev/services-roofing" rel="noopener noreferrer"&gt;See how Formgrid helps roofing companies get more quote requests →&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Summary
&lt;/h2&gt;

&lt;p&gt;If your roofing website is getting traffic but not generating quotes &lt;br&gt;
requests the problem is almost certainly one of these five things:&lt;/p&gt;

&lt;p&gt;Your form is buried, complicated, or hard to use on mobile.&lt;/p&gt;

&lt;p&gt;You have no system for following up quickly and consistently.&lt;/p&gt;

&lt;p&gt;You cannot see which marketing is actually sending you leads.&lt;/p&gt;

&lt;p&gt;Your mobile experience is creating friction before visitors &lt;br&gt;
even reach your form.&lt;/p&gt;

&lt;p&gt;Your site lacks the trust signals that give homeowners the confidence &lt;br&gt;
to submit their details.&lt;/p&gt;

&lt;p&gt;None of these requires rebuilding your website from scratch. Each &lt;br&gt;
one is a specific fix. Fix them, and the traffic you already have &lt;br&gt;
will start turning into the quote requests your business runs on.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Running a roofing business and &lt;br&gt;
want help setting up a lead system &lt;br&gt;
that works? Reach out at &lt;br&gt;
&lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt;, and we can talk through what makes sense &lt;br&gt;
for your setup.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>design</category>
      <category>marketing</category>
      <category>ux</category>
    </item>
    <item>
      <title>How to Send Next.js Form Submissions to Google Sheets Without a Backend</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Wed, 29 Apr 2026 19:03:00 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-send-nextjs-form-submissions-to-google-sheets-without-a-backend-4f46</link>
      <guid>https://dev.to/allenarduino/how-to-send-nextjs-form-submissions-to-google-sheets-without-a-backend-4f46</guid>
      <description>&lt;p&gt;Building a contact form in Next.js is straightforward.&lt;/p&gt;

&lt;p&gt;You create a form component, add your input fields, wire up some state with useState, and handle the submission with a fetch call. Clean. Predictable. Very Next.js.&lt;/p&gt;

&lt;p&gt;But then comes the question every Next.js developer eventually faces: &lt;br&gt;
Where does the data actually go?&lt;/p&gt;

&lt;p&gt;The obvious answer is an API route. You create a pages/api/contact.ts file or an app/api/contact/route.ts file, write a handler that receives the submission, and then figure out how to store it somewhere. A database. A Google Sheet. An email. Something.&lt;/p&gt;

&lt;p&gt;For a side project or a client site, that is a lot of infrastructure to set up and maintain just to collect a few contact form submissions. You need a database or a third-party email service. You need environment variables. You need error handling. &lt;br&gt;
You need to think about rate limiting and spam.&lt;/p&gt;

&lt;p&gt;And if you want those submissions in Google Sheets specifically, you also need to figure out the Google Sheets API, OAuth tokens, service accounts, and all the complexity that comes with that integration.&lt;/p&gt;

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

&lt;p&gt;This guide shows you how to send Next.js form submissions directly &lt;br&gt;
to Google Sheets using Formgrid. No API routes. No database. No Google Apps Script. No Zapier. Just your form component pointing at a Formgrid endpoint and a Google Sheet shared with one email address.&lt;/p&gt;


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

&lt;p&gt;This guide is for Next.js developers who want form submissions in Google Sheets without building and maintaining backend infrastructure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Next.js developers&lt;/strong&gt; building portfolio sites, landing pages, or client sites who need a contact form that works reliably without spinning up a database or a serverless function just to collect &lt;br&gt;
enquiries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indie hackers&lt;/strong&gt; building Next.js projects who want submissions organised in a spreadsheet without paying for Zapier or writing their own Google Sheets integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Freelancers&lt;/strong&gt; who build Next.js sites for clients and want a form backend that is easy to set up, requires zero maintenance, and puts submissions somewhere the client can actually see them without logging into a developer tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frontend developers&lt;/strong&gt; who want to keep their Next.js project statically deployed on Vercel or Netlify without needing a separate API server just to handle form submissions.&lt;/p&gt;

&lt;p&gt;If you have a Next.js 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 Building Your Own API Route
&lt;/h2&gt;

&lt;p&gt;The standard Next.js approach to form handling is an API route. It looks clean, and it is the right solution for many cases. But for a simple contact form, it introduces more complexity than the problem warrants.&lt;/p&gt;

&lt;p&gt;Here is what you end up building: &lt;/p&gt;

&lt;p&gt;An API route to receive the submission&lt;br&gt;
A way to store or forward the data&lt;br&gt;
Error handling for failed requests&lt;br&gt;
Rate limiting to prevent spam abuse&lt;br&gt;
Environment variables for API keys&lt;br&gt;
Deployment configuration&lt;br&gt;
Ongoing maintenance when things break&lt;/p&gt;

&lt;p&gt;Then, if you want the data in Google &lt;br&gt;
Sheets specifically, you also need:&lt;/p&gt;

&lt;p&gt;A Google Cloud project&lt;br&gt;
A service account with credentials&lt;br&gt;
The Google Sheets API enabled&lt;br&gt;
OAuth scope configuration&lt;br&gt;
Token refresh handling&lt;br&gt;
The actual Sheets API integration code&lt;/p&gt;

&lt;p&gt;That is a significant amount of infrastructure for what is essentially a contact form. Every piece of it is something you wrote and something you own. &lt;br&gt;
When it breaks at 2 am because an OAuth token expired, it is your &lt;br&gt;
problem to fix.&lt;/p&gt;

&lt;p&gt;Formgrid is all of that infrastructure already built and maintained for you. You point your form at an endpoint. The data lands in your Sheet. Done.&lt;/p&gt;


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

&lt;p&gt;Once your Next.js 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 appears as a new row in your spreadsheet automatically. No manual export. No dashboard to check every day.&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. Name your fields clearly and Formgrid &lt;br&gt;
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 on a schedule. Instantly.&lt;/p&gt;

&lt;p&gt;You also get email notifications on every submission. Spam protection is built in through honeypot fields and rate limiting. 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 &lt;br&gt;
to fall back on.&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 account:&lt;/strong&gt;&lt;br&gt;
Google Sheets integration is available on all plans, including free. The free plan syncs your first 10 rows per form. &lt;br&gt;
The Premium plan at $12 per month syncs up to 500 rows per month. The Business plan at $29 per month syncs unlimited rows automatically. &lt;br&gt;
Sign up for 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;strong&gt;A Next.js project with a form:&lt;/strong&gt;&lt;br&gt;
Any Next.js form works whether you are using the Pages Router or the &lt;br&gt;
App Router. The approach is the same for both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Google account:&lt;/strong&gt;&lt;br&gt;
You will need access to Google Sheets to create the spreadsheet that will receive your submissions.&lt;/p&gt;


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

&lt;p&gt;Instead of sending your form data to a Next.js API route, you send it directly to a Formgrid endpoint URL using a standard HTML POST or a fetch call from your form component.&lt;/p&gt;

&lt;p&gt;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;No API route needed in your Next.js project. No server code. No database. Just your form component and a Formgrid endpoint.&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: Create a Form in Your Formgrid Dashboard
&lt;/h3&gt;

&lt;p&gt;Log in to your Formgrid account at &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;. From your dashboard, create a new form &lt;br&gt;
and give it a name that matches what you are collecting. For example &lt;br&gt;
"Contact Form" or "Project Enquiries."&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="Formgrid dashboard and new form creation" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You are not building a form inside Formgrid here. You are registering &lt;br&gt;
a form entry in your dashboard so that Formgrid knows where to route &lt;br&gt;
the incoming submissions from your Next.js project. Your actual form &lt;br&gt;
component stays exactly as it is.&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 &lt;br&gt;
prominently. It will look like this:&lt;br&gt;
&lt;a href="https://formgrid.dev/api/f/your-form-id" rel="noopener noreferrer"&gt;https://formgrid.dev/api/f/your-form-id&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy this URL. You will need it when you update your Next.js form component.&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="Formgrid endpoint URL on form details page" 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 &lt;br&gt;
settings or connect integrations. You set it once and never need to &lt;br&gt;
touch it again.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part Two: Update Your Next.js Form Component
&lt;/h2&gt;

&lt;p&gt;There are two ways to connect your Next.js form to Formgrid, depending on how your form is currently built.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option A: Using a Standard HTML Form
&lt;/h3&gt;

&lt;p&gt;If your form is a standard HTML form with a POST action, this is the simplest approach. &lt;br&gt;
Just set the action attribute to your Formgrid endpoint, and the &lt;br&gt;
method to POST:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ContactForm&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;
      &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&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;"name"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;/&amp;gt;&lt;/span&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;"email"&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;"email"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&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;"message"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Honeypot field for spam protection */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&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;"_honey"&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="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&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;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Send Message
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;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;That is the entire change. One attribute on the form tag. Your &lt;br&gt;
form now sends submissions to Formgrid on submit.&lt;/p&gt;

&lt;p&gt;One important detail: Formgrid reads the name attribute of each input &lt;br&gt;
field and uses those values as the column headers in your Google Sheet. Make sure every field has a clear descriptive name attribute.&lt;/p&gt;
&lt;h3&gt;
  
  
  Option B: Using fetch with a React Controlled Form
&lt;/h3&gt;

&lt;p&gt;If your form is a controlled React component using useState and you want to handle the submission with fetch to show a custom success state, use this approach instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&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;useState&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&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ContactForm&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="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="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="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="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;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setStatus&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submitting&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&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="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idle&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;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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FormEvent&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;setStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submitting&lt;/span&gt;&lt;span class="dl"&gt;'&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;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;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;name&lt;/span&gt;&lt;span class="dl"&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;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;email&lt;/span&gt;&lt;span class="dl"&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;formData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&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&lt;/span&gt;&lt;span class="dl"&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="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;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="nf"&gt;setStatus&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="nf"&gt;setName&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="nf"&gt;setEmail&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="nf"&gt;setMessage&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="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;setStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&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="nf"&gt;setStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Thank you. Your message 
        has been received.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&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;"name"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Name"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&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="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="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="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&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;"email"&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;"email"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Email"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&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="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="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="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;required&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&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;"message"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="na"&gt;onChange&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="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="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="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&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;"submit"&lt;/span&gt;
        &lt;span class="na"&gt;disabled&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submitting&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;submitting&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;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="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Something went wrong. 
        Please try again.&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;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;h3&gt;
  
  
  Option C: Using the App Router With Server Actions
&lt;/h3&gt;

&lt;p&gt;If you are using the Next.js App Router and prefer Server Actions, here is how to forward the submission to Formgrid from a server action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use server&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;submitContactForm&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="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="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;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="o"&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="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Submission failed&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;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;success&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then, in your form component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;submitContactForm&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;./actions&lt;/span&gt;&lt;span class="dl"&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ContactForm&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;submitContactForm&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&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;"name"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;/&amp;gt;&lt;/span&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;"email"&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;"email"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&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;"message"&lt;/span&gt;
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&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;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Send Message
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;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;All three options send the same data to the same Formgrid endpoint. Use whichever pattern matches how your form is currently built.&lt;/p&gt;

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

&lt;p&gt;Before connecting Google Sheets, confirm that submissions are reaching Formgrid correctly. &lt;br&gt;
Run your Next.js project locally or deploy it and &lt;br&gt;
submit a test entry through your form.&lt;/p&gt;

&lt;p&gt;Open your Formgrid dashboard and check the submissions list for your &lt;br&gt;
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="Formgrid leads tab showing tracked submissions" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the submission does not appear, open your browser developer tools, &lt;br&gt;
go to the Network tab, submit the form again, and look for the POST &lt;br&gt;
request to formgrid.dev. A 200 response means the submission was &lt;br&gt;
received. Any other status code means there is a configuration &lt;br&gt;
issue to sort out before moving on.&lt;/p&gt;




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

&lt;h3&gt;
  
  
  Step 4: 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%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="Formgrid integrations tab" width="800" height="443"&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="Formgrid Google Sheets integration section" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see the Google Sheets integration section. If you are within &lt;br&gt;
your plan limits the Connect interface, which is active and ready to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: 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 a fresh blank spreadsheet in Google Sheets in a &lt;br&gt;
new 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="Create blank Google Sheet button in Formgrid" 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 "Next.js Project Enquiries 2026" works well.&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 Next.js form field names on the very first submission. The sheet should be empty when you connect it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: 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 &lt;br&gt;
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="Google Sheets share button" 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 &lt;br&gt;
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="Formgrid service account email copy button" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy it directly from there to avoid any chance of a typing error. Paste the email into the share dialog and make sure you select &lt;strong&gt;Editor&lt;/strong&gt; access, not Viewer. Formgrid needs &lt;br&gt;
Editor access to write new rows to your sheet. If you add it as a Viewer the connection will fail with a &lt;br&gt;
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="Google Sheets editor access setting" 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 7: Paste Your Sheet URL Into Formgrid
&lt;/h3&gt;

&lt;p&gt;Go back to your Formgrid dashboard. &lt;br&gt;
Copy the full URL of your Google Sheet from the browser address bar. The URL will look like this:&lt;br&gt;
&lt;a href="https://docs.google.com/spreadsheets/d/" rel="noopener noreferrer"&gt;https://docs.google.com/spreadsheets/d/&lt;/a&gt;&lt;br&gt;
1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74&lt;br&gt;
OgVE2upms/edit&lt;/p&gt;

&lt;p&gt;Paste the full URL into the sheet URL field in your Formgrid dashboard. Make sure the URL contains the full &lt;br&gt;
spreadsheet ID, which is the long alphanumeric string between /d/ &lt;br&gt;
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="Paste Google Sheet URL into Formgrid" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Before connecting, you will see this option:&lt;br&gt;
Sync existing submissions to this sheet? If you already have submissions, Formgrid can add them all to your&lt;br&gt;
Google Sheets now, so your entire history is in one place.&lt;br&gt;
[ ] Yes, sync my existing submissions&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="Sync existing submissions option in Formgrid" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have been collecting submissions through Formgrid for a while and want your full history in the sheet from day one, check this box. If you only want new submissions going forward, leave it unchecked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 9: 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;
Connected successfully&lt;br&gt;
Your sheet is ready. Every new submission will appear as a new&lt;br&gt;
row automatically.&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%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="Google Sheets connected successfully in Formgrid" 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 10: Submit Another Test Entry Through Your Next.js Form
&lt;/h3&gt;

&lt;p&gt;Submit another test entry through your 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 Next.js form field name attributes.&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%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="Google Sheets showing form submissions as rows" width="800" height="752"&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="Google Sheets rows with timestamp" width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this point forward, every submission from your Next.js form &lt;br&gt;
will appear as a new row in your Google Sheet in real time. You never &lt;br&gt;
need to log into Formgrid, export anything, or take any manual action.&lt;/p&gt;




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

&lt;p&gt;Here is the complete flow from the &lt;br&gt;
moment a visitor submits your Next.js &lt;br&gt;
form to the moment a row appears in &lt;br&gt;
your spreadsheet:&lt;br&gt;
Visitor fills in your Next.js form&lt;br&gt;
and clicks Submit&lt;br&gt;
↓&lt;br&gt;
The form sends a POST request to&lt;br&gt;
your Formgrid endpoint&lt;br&gt;
↓&lt;br&gt;
Formgrid receives and saves the&lt;br&gt;
submission to your dashboard&lt;br&gt;
↓&lt;br&gt;
Email notification sent to you&lt;br&gt;
and any other configured recipients&lt;br&gt;
↓&lt;br&gt;
A new row added to your Google&lt;br&gt;
Sheet instantly&lt;br&gt;
↓&lt;br&gt;
Spam protection runs in the&lt;br&gt;
background to filter out&lt;br&gt;
bot submissions&lt;/p&gt;

&lt;p&gt;Your submission is available in three places simultaneously: your Formgrid dashboard, your email inbox, and your Google Sheet.&lt;/p&gt;




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

&lt;p&gt;Once connected, the Integrations tab &lt;br&gt;
in your Formgrid dashboard, you have full control:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pause the integration:&lt;/strong&gt;&lt;br&gt;
Use the Active toggle to pause syncing at any time. New submissions are still saved to your dashboard and email notifications still go out, but new rows are not written to your sheet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disconnect:&lt;/strong&gt;&lt;br&gt;
Removes the connection entirely. Your existing sheet data stays exactly as it is. New submissions will not sync until you reconnect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open Sheet:&lt;/strong&gt;&lt;br&gt;
Takes you directly to your connected Google Sheet with a single click.&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="Google Sheets integration management in Formgrid" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Compares to Building Your Own API Route
&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;Custom API Route&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;Setup time&lt;/td&gt;
&lt;td&gt;1 to 2 hours&lt;/td&gt;
&lt;td&gt;Under 5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code to maintain&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Sheets API&lt;/td&gt;
&lt;td&gt;You build it&lt;/td&gt;
&lt;td&gt;Built in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;You build it&lt;/td&gt;
&lt;td&gt;Built in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email notifications&lt;/td&gt;
&lt;td&gt;You build it&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment config&lt;/td&gt;
&lt;td&gt;Required&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;When it breaks&lt;/td&gt;
&lt;td&gt;Your problem&lt;/td&gt;
&lt;td&gt;Formgrid's problem&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;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&lt;/td&gt;
&lt;td&gt;Included in all plans&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;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;None built in&lt;/td&gt;
&lt;td&gt;Honeypot and rate limiting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email notifications&lt;/td&gt;
&lt;td&gt;Requires extra Zap&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  A Real Example: A Freelancer Who Stopped Writing API Routes
&lt;/h2&gt;

&lt;p&gt;for Contact Forms&lt;/p&gt;

&lt;p&gt;James is a freelance Next.js developer. He builds sites for clients across various industries. Every client site needs a contact form. Every contact form used to mean a new API route, a new email service integration, and a new Google Sheets setup that he built from scratch each time.&lt;/p&gt;

&lt;p&gt;He was spending 2 to 3 hours per project just on form infrastructure. &lt;br&gt;
Code he would never touch again once the site was live, but code he was still responsible for when it broke.&lt;/p&gt;

&lt;p&gt;He switched to Formgrid for all his client contact forms. Now the setup takes 5 minutes per project. He points the form at a Formgrid endpoint, shares a Google Sheet with the Formgrid service account, and clicks connect. The client gets a spreadsheet that &lt;br&gt;
fills itself and sends an email notification on every enquiry.&lt;/p&gt;

&lt;p&gt;He saves roughly 2 hours per project. Across 15 client projects a year, that is 30 hours of development time he now spends on work that actually charges at his hourly rate.&lt;/p&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 fetch call or form action is pointing to your Formgrid endpoint and that the method is 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 &lt;br&gt;
the submission was received. Any other status code means something is &lt;br&gt;
misconfigured.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CORS error in the browser console:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are seeing a CORS error, it means you are likely trying to send &lt;br&gt;
a JSON body with a Content-Type of application/json. Formgrid expects &lt;br&gt;
FormData or URL-encoded form data, not JSON. Switch to using FormData &lt;br&gt;
in your fetch call as shown in Option B above.&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. &lt;br&gt;
Open in 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 attributes of your form input fields. If a column is missing, check that the corresponding input has a name attribute set. If a header looks incorrect, update the name attribute 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;Open the Integrations tab in your Formgrid dashboard and check that &lt;br&gt;
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;Server Action forwarding not working:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are using a Server Action to forward submissions to Formgrid, make sure you are passing the FormData object directly to the fetch body. Do not convert it to JSON. Formgrid reads FormData directly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Formgrid Includes
&lt;/h2&gt;

&lt;p&gt;Google Sheets integration is available on all Formgrid plans, including free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free plan at $0 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (first 10 rows &lt;br&gt;
per form. One time.)&lt;br&gt;
Form builder with shareable link&lt;br&gt;
Form endpoint URL&lt;br&gt;
Email notifications&lt;br&gt;
25 submissions per month&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premium plan at $12 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (up to 500 rows &lt;br&gt;
per month)&lt;br&gt;
Everything in the free plan&lt;br&gt;
1,000 submissions per month&lt;br&gt;
Auto-responder emails to form submitters&lt;br&gt;
File uploads up to 1GB per file&lt;br&gt;
CSV export&lt;br&gt;
Advanced spam protection&lt;br&gt;
Remove Formgrid branding&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business plan at $29 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (unlimited rows. &lt;br&gt;
Every submission syncs automatically.)&lt;br&gt;
Everything in Premium&lt;br&gt;
15,000 submissions per month&lt;br&gt;
Webhooks: connect to Zapier, Make, &lt;br&gt;
Slack, Notion, Airtable, and more&lt;br&gt;
Workflow automations&lt;br&gt;
Custom HTML email templates&lt;br&gt;
Multiple notification recipients&lt;br&gt;
Custom email subject lines&lt;br&gt;
Priority support with direct access &lt;br&gt;
to the founder&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 free at formgrid.dev&lt;/a&gt;&lt;br&gt;
No credit card required.&lt;/p&gt;




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

&lt;p&gt;Next.js makes it easy to build form components. Formgrid makes it &lt;br&gt;
easy to do something useful with what those forms collect.&lt;/p&gt;

&lt;p&gt;You do not need an API route. You do not need a database. You do not need to build a Google Sheets integration. You do not need Zapier.&lt;/p&gt;

&lt;p&gt;Point your form at a Formgrid endpoint. Share a Google Sheet with one email address. Click connect.&lt;/p&gt;

&lt;p&gt;Every submission lands in your spreadsheet automatically and in real time from that moment forward.&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;




&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 is unclear or looks off.&lt;/em&gt;&lt;/p&gt;




</description>
      <category>javascript</category>
      <category>nextjs</category>
      <category>tutorial</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How to Send Framer Form Submissions to Google Sheets Without Zapier</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Wed, 29 Apr 2026 17:28:24 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-send-framer-form-submissions-to-google-sheets-without-zapier-48f</link>
      <guid>https://dev.to/allenarduino/how-to-send-framer-form-submissions-to-google-sheets-without-zapier-48f</guid>
      <description>&lt;p&gt;Framer is one of the fastest-growing website builders in 2026. Its visual editor, component system, and performance have made it a favourite among designers and developers who want beautiful sites without writing everything from scratch.&lt;/p&gt;

&lt;p&gt;But Framer's built-in form handling has a significant gap.&lt;/p&gt;

&lt;p&gt;By default, Framer sends form submissions to your email inbox. That works for a handful of enquiries a month. But the moment you need your team to see submissions in real time, filter entries by type, track patterns over time, or keep everything organised without searching through emails, an inbox is not enough.&lt;/p&gt;

&lt;p&gt;The solution most Framer users reach for is Zapier. Connect Framer to Google Sheets through a Zap, and submissions flow across automatically. It works, but it adds a monthly subscription to the 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 Framer and Google Sheets.&lt;/p&gt;

&lt;p&gt;This guide shows you a more direct approach. Using Formgrid, you can &lt;br&gt;
replace Framer's default form handler with 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;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;This guide is for designers and developers who have built their site in Framer and want form submissions to go straight to Google Sheets without adding another monthly subscription:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Framer designers&lt;/strong&gt; who built a &lt;br&gt;
contact form, enquiry form, or booking request form, and want every submission organised in a spreadsheet automatically. You already built the form. You should not need a separate tool just to collect &lt;br&gt;
the data is properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indie hackers and solopreneurs&lt;/strong&gt; who use Framer for their product landing page or waitlist, and want submissions in a shared spreadsheet without paying for Zapier on top of everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small business owners&lt;/strong&gt; who collect client enquiries, service requests, or event registrations through a Framer form, and want every entry in a spreadsheet that their team can access without logging into a separate tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agencies&lt;/strong&gt; managing multiple Framer sites for clients who want a reliable form backend that sends submissions to a Google Sheet, so the client can see in real time.&lt;/p&gt;

&lt;p&gt;If you have a Framer 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 Framer's Native Form Handling
&lt;/h2&gt;

&lt;p&gt;Framer's built-in form component is clean and easy to use. You drag a &lt;br&gt;
form onto the canvas, add your fields, and publish your site. Submissions arrive in your inbox.&lt;/p&gt;

&lt;p&gt;But that is where Framer's job ends.&lt;/p&gt;

&lt;p&gt;There is no submission dashboard. &lt;br&gt;
No way to see all your entries in one &lt;br&gt;
place without searching your email. &lt;br&gt;
No Google Sheets sync. No lead pipeline. &lt;br&gt;
No way to track which enquiries you followed up on and which ones went cold.&lt;/p&gt;

&lt;p&gt;For a simple contact form on a portfolio, that is fine. For a business form collecting real leads from real potential customers, it falls short almost immediately.&lt;/p&gt;

&lt;p&gt;The standard workaround is Zapier. But Zapier adds cost, complexity, and another point of failure. You pay $19.99 per month for Zapier just to move data from one place to another.&lt;/p&gt;

&lt;p&gt;Formgrid solves this in one step.&lt;/p&gt;




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

&lt;p&gt;Once your Framer form is connected to &lt;br&gt;
&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 Framer form appears as a new row in your &lt;br&gt;
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 fields clearly and &lt;br&gt;
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 &lt;br&gt;
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 &lt;br&gt;
Sheet you have a full record to fall back on.&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 account:&lt;/strong&gt;&lt;br&gt;
Google Sheets integration is available on all plans, including free. The free plan syncs your first 10 rows per form. &lt;br&gt;
The Premium plan at $12 per month syncs up to 500 rows per month. The Business plan at $29 per month syncs unlimited rows automatically. Sign up for 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;strong&gt;A Framer site with a form:&lt;/strong&gt;&lt;br&gt;
You will need an existing Framer form to connect to Google Sheets. Any Framer form works, whether it is a contact form, a service enquiry form, a waitlist signup, or a booking request form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Google account:&lt;/strong&gt;&lt;br&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;Framer forms support a custom form action URL. Instead of letting Framer handle the submission and forward it to your email, you point the form at a Formgrid endpoint URL.&lt;/p&gt;

&lt;p&gt;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 Framer side is a single setting: the form action URL. You point it at your Formgrid endpoint instead of leaving it on Framer's default handler. 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: Create a Form in Your Formgrid Dashboard
&lt;/h3&gt;

&lt;p&gt;Log in to your Formgrid account at [formgrid.dev(&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;https://formgrid.dev&lt;/a&gt;). From your dashboard, create a new form and give it a name that corresponds to the Framer form you are connecting. For example, "Contact Form" or "Waitlist Signups."&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="Formgrid dashboard and new form creation" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You are not building a form inside Formgrid here. You are registering &lt;br&gt;
a form entry in your dashboard so that Formgrid knows where to route &lt;br&gt;
the incoming submissions from Framer. Your actual form fields remain exactly as they are in Framer.&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;a href="https://formgrid.dev/api/f/your-form-id" rel="noopener noreferrer"&gt;https://formgrid.dev/api/f/your-form-id&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy this URL. You will need it in the next section when you update your Framer 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="Formgrid endpoint URL on form details page" 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 &lt;br&gt;
settings, connect integrations, or make any other changes inside Formgrid. You set it once in Framer and never need to touch it again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part Two: Connect Your Framer Form to Formgrid
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 3: Open Your Framer Canvas
&lt;/h3&gt;

&lt;p&gt;Log in to your Framer account and open the project containing the form you want to connect. Click on your form component in the canvas to select it.&lt;/p&gt;

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

&lt;p&gt;With your form selected, open the properties panel on the right side &lt;br&gt;
of the Framer editor.&lt;/p&gt;

&lt;p&gt;Look for the &lt;strong&gt;Action&lt;/strong&gt; field under your form settings. This is where &lt;br&gt;
Framer sends the form data when someone submits it.&lt;/p&gt;

&lt;p&gt;Replace any existing value with your &lt;br&gt;
Formgrid endpoint URL:&lt;br&gt;
&lt;a href="https://formgrid.dev/api/f/your-form-id" rel="noopener noreferrer"&gt;https://formgrid.dev/api/f/your-form-id&lt;/a&gt;&lt;/p&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 set.&lt;/p&gt;

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

&lt;p&gt;Formgrid uses the name attributes of your form fields to create the column headers in your Google Sheet. In Framer, each input field has a name property you can set in the properties panel.&lt;/p&gt;

&lt;p&gt;Click on each input field and confirm it has a clear descriptive name. Fields &lt;br&gt;
named "name", "email", "phone", and &lt;br&gt;
"message" will produce clean, readable column headers in your spreadsheet. Review and update any field names that are unclear before moving on.&lt;/p&gt;

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

&lt;p&gt;Once you have updated the form action URL and reviewed your field names, publish your Framer 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 Framer 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="Formgrid leads tab showing tracked submissions" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the submission does not appear, go back to your Framer 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 Framer 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
&lt;/h3&gt;

&lt;p&gt;in Formgrid&lt;/p&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 &lt;br&gt;
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%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="Formgrid integrations tab" width="800" height="443"&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="Formgrid Google Sheets integration section" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see the Google Sheets integration section. If you are within &lt;br&gt;
your plan limits the Connect interface, which 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; &lt;br&gt;
button. This opens a fresh blank spreadsheet in Google Sheets in a new 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="Create blank Google Sheet button in Formgrid" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your sheet a clear, identifiable name. Something like "Framer Contact Form Submissions" or "Waitlist Signups 2026" works well. If you manage multiple Framer sites and plan to connect each form 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 Framer field names on the very first submission. &lt;br&gt;
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;br&gt;
&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="Google Sheets share button" 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.&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="Formgrid service account email copy button" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy it directly from there to avoid any chance of a typing error. 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 &lt;br&gt;
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="Google Sheets editor access setting" 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;a href="https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms/edit" rel="noopener noreferrer"&gt;https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms/edit&lt;/a&gt;&lt;/p&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 /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="Paste Google Sheet URL into Formgrid" width="800" height="253"&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 this option:&lt;br&gt;
Sync existing submissions to this sheet?&lt;br&gt;
If you already have submissions&lt;br&gt;
Formgrid can add them all to your Google Sheet now, so your entire&lt;br&gt;
history is in one place.&lt;br&gt;
[ ] Yes, sync my existing submissions&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="Sync existing submissions option in Formgrid" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have been collecting Framer 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;
Connected successfully. Your sheet is ready. Every new&lt;br&gt;
submission will appear as a new row automatically.&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%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="Google Sheets connected successfully in Formgrid" 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 Framer Form
&lt;/h3&gt;

&lt;p&gt;Visit your live Framer 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 &lt;br&gt;
automatically from your Framer form 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%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="Google Sheets showing Framer form submissions" width="800" height="752"&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="Google Sheets rows from form submissions" width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this point forward, every submission made through your Framer 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 Framer form to the moment a row appears in &lt;br&gt;
your spreadsheet:&lt;br&gt;
Visitor fills in your Framer form&lt;br&gt;
and clicks Submit&lt;br&gt;
↓&lt;br&gt;
The browser sends a POST request&lt;br&gt;
to your Formgrid endpoint&lt;br&gt;
↓&lt;br&gt;
Formgrid receives and saves the&lt;br&gt;
submission to your dashboard&lt;br&gt;
↓&lt;br&gt;
Email notification sent to you&lt;br&gt;
and any other configured recipients&lt;br&gt;
↓&lt;br&gt;
A new row added to your Google&lt;br&gt;
Sheet instantly&lt;br&gt;
↓&lt;br&gt;
Spam protection runs in the&lt;br&gt;
background to filter out&lt;br&gt;
bot submissions&lt;/p&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 connection:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pause the integration:&lt;/strong&gt;&lt;br&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;br&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;br&gt;
Takes you directly to your connected Google Sheet with a single click &lt;br&gt;
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="Google Sheets integration management in Formgrid" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How This Compares to Using 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;Extra monthly cost&lt;/td&gt;
&lt;td&gt;$19.99/month&lt;/td&gt;
&lt;td&gt;Included in all plans&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;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;None built in&lt;/td&gt;
&lt;td&gt;Honeypot and rate limiting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email notifications&lt;/td&gt;
&lt;td&gt;Requires extra Zap&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Submission history&lt;/td&gt;
&lt;td&gt;In Zapier logs&lt;/td&gt;
&lt;td&gt;In Formgrid dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  A Real Example: How a Designer Uses This Setup
&lt;/h2&gt;

&lt;p&gt;Marcus runs a design studio. He uses Framer for his portfolio and has a project enquiry form on his contact page.&lt;/p&gt;

&lt;p&gt;Before connecting Formgrid, every enquiry arrived as an email. Client &lt;br&gt;
name, project type, budget, and timeline all in one unformatted block. He was replying from his inbox with no way to track which enquiries he had followed up on and which ones had gone cold.&lt;/p&gt;

&lt;p&gt;He connected his Framer form to Formgrid and linked it to a Google &lt;br&gt;
Sheet. Now every new project enquiry appears instantly as a structured row in his spreadsheet. Name in one column, project type in the next, budget after that, timeline at the end.&lt;/p&gt;

&lt;p&gt;He shares the sheet with his business partner, who can see new enquiries in real time without needing access to his email.&lt;/p&gt;

&lt;p&gt;After connecting, he discovered that most of his best-paying clients were coming from LinkedIn referrals, not his Instagram. He would never have known that from his inbox. The spreadsheet made the pattern visible.&lt;/p&gt;




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

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

&lt;p&gt;Confirm that you published your Framer site after changing the form action URL. Changes made in the Framer editor 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 &lt;br&gt;
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 are missing or showing &lt;br&gt;
unexpected values:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Column headers come from the name attributes of your Framer form fields. If a column is missing, check that the corresponding field has a name attribute set in Framer. If a header looks incorrect, update the field name in Framer, republish, and submit a new test entry. Note that existing headers in your sheet will not update &lt;br&gt;
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;Framer is still sending its own confirmation email:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you set a custom action URL in Framer, it takes over the form submission handling. If Framer is still sending its own notification alongside Formgrid, you can disable the Framer notification in your Framer form settings and rely on Formgrid's email notification instead.&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. &lt;br&gt;
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 Formgrid Includes
&lt;/h2&gt;

&lt;p&gt;Google Sheets integration is available on all Formgrid plans, including free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free plan at $0 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (first 10 rows &lt;br&gt;
per form. One time.)&lt;br&gt;
Form builder with shareable link&lt;br&gt;
Form endpoint URL&lt;br&gt;
Email notifications&lt;br&gt;
25 submissions per month&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premium plan at $12 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (up to 500 rows &lt;br&gt;
per month)&lt;br&gt;
Everything in the free plan&lt;br&gt;
1,000 submissions per month&lt;br&gt;
File uploads up to 1GB per file&lt;br&gt;
CSV export&lt;br&gt;
Advanced spam protection&lt;br&gt;
Remove Formgrid branding&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business plan at $29 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (unlimited rows. &lt;br&gt;
Every submission syncs automatically.)&lt;br&gt;
Everything in Premium&lt;br&gt;
15,000 submissions per month&lt;br&gt;
Webhooks: connect to Zapier, Make, &lt;br&gt;
Slack, Notion, Airtable, and more&lt;br&gt;
Workflow automations&lt;br&gt;
Custom HTML email templates&lt;br&gt;
Auto-responder emails to form submitters&lt;br&gt;
Multiple notification recipients&lt;br&gt;
Custom email subject lines&lt;br&gt;
Priority support with direct access &lt;br&gt;
to the founder&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 free at formgrid.dev&lt;/a&gt;&lt;br&gt;
No credit card required.&lt;/p&gt;




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

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

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

&lt;p&gt;If your team is currently managing Framer form submissions out of an &lt;br&gt;
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;




&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 is unclear or looks off.&lt;/em&gt;&lt;/p&gt;




</description>
    </item>
    <item>
      <title>How to Send Squarespace Form Submissions to Google Sheets Without Zapier</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Wed, 29 Apr 2026 13:02:40 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-send-squarespace-form-submissions-to-google-sheets-without-zapier-56g0</link>
      <guid>https://dev.to/allenarduino/how-to-send-squarespace-form-submissions-to-google-sheets-without-zapier-56g0</guid>
      <description>&lt;p&gt;Squarespace makes it easy to build a beautiful website. It's built-in form builder lets you add contact forms, enquiry forms, and booking request forms to any page without writing a single line of code.&lt;/p&gt;

&lt;p&gt;But when it comes to where those submissions actually go, Squarespace's native options are limited.&lt;/p&gt;

&lt;p&gt;By default, Squarespace sends form submissions to your email inbox. That works well enough when you are receiving a handful of enquiries 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 quickly.&lt;/p&gt;

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

&lt;p&gt;This guide shows you a more direct approach. Using Formgrid, you can &lt;br&gt;
replace Squarespace's form handler with 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 account:&lt;/strong&gt;&lt;br&gt;
Google Sheets integration is available on all plans, including free. The free plan syncs your first 10 rows per form. &lt;br&gt;
The Premium plan at $12 per month syncs &lt;br&gt;
up to 500 rows per month. The Business &lt;br&gt;
plan at $29 per month syncs unlimited &lt;br&gt;
rows automatically. Sign up 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;strong&gt;A Squarespace site with a form:&lt;/strong&gt;&lt;br&gt;
You will need an existing Squarespace form to connect to Google Sheets. Any Squarespace form works, whether it is a simple contact form, a service enquiry form, or a booking request form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Google account:&lt;/strong&gt;&lt;br&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;Squarespace forms support a custom form action URL. Instead of letting Squarespace handle the submission and forward it to your email, you point the form at a Formgrid endpoint URL.&lt;/p&gt;

&lt;p&gt;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 Squarespace side is a single setting: the form action URL. You point it at your Formgrid endpoint instead of leaving it on Squarespace's default handler. Everything else happens inside Formgrid.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part One: Set Up Your Formgrid Form
&lt;/h2&gt;

&lt;p&gt;and Get Your Endpoint URL&lt;/p&gt;

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

&lt;p&gt;Formgrid Dashboard&lt;/p&gt;

&lt;p&gt;Log in to your Formgrid account at &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;. &lt;br&gt;
From your dashboard, create a new form and give it a name that corresponds to the Squarespace form you are connecting. &lt;br&gt;
For example, "Contact Form" or &lt;br&gt;
"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="Formgrid dashboard and new form creation" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

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

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

&lt;p&gt;Endpoint URL&lt;/p&gt;

&lt;p&gt;Once your form is created, open it in your Formgrid dashboard. You will see your unique endpoint URL displayed &lt;br&gt;
prominently. It will follow this format:&lt;br&gt;
&lt;a href="https://formgrid.dev/api/f/your-form-id" rel="noopener noreferrer"&gt;https://formgrid.dev/api/f/your-form-id&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy this URL. You will need it in the next section when you update your Squarespace 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="Formgrid endpoint URL on form details page" 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 &lt;br&gt;
settings, connect integrations, or make any other changes inside Formgrid. You set it once in Squarespace and never need to touch it again.&lt;/p&gt;




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

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

&lt;p&gt;Log in to your Squarespace account and open the page containing the form you want to connect. &lt;br&gt;
Click on the form block to select it, then click the pencil icon to edit it.&lt;/p&gt;

&lt;p&gt;In the form block editor, navigate to the &lt;strong&gt;Advanced&lt;/strong&gt; tab. This is where Squarespace allows you to set a custom form action URL.&lt;/p&gt;

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

&lt;p&gt;In the Advanced tab, look for the field labelled &lt;strong&gt;Post URL&lt;/strong&gt; or &lt;strong&gt;Form Action&lt;/strong&gt;. This is where Squarespace sends the &lt;br&gt;
form data when someone submits it.&lt;/p&gt;

&lt;p&gt;Replace any existing value with your &lt;br&gt;
Formgrid endpoint URL:&lt;br&gt;
&lt;a href="https://formgrid.dev/api/f/your-form-id" rel="noopener noreferrer"&gt;https://formgrid.dev/api/f/your-form-id&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Save or Apply to save the change.&lt;/p&gt;

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

&lt;p&gt;Formgrid uses the field labels from your Squarespace form to create the column headers in your Google Sheet. &lt;br&gt;
Make sure your form fields have clear and descriptive labels before you connect your Sheet.&lt;/p&gt;

&lt;p&gt;Field labels like Name, Email, Phone, and Message will produce clean, readable column headers in your spreadsheet. &lt;br&gt;
Review your form fields and update any that are unclear before moving on.&lt;/p&gt;

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

&lt;p&gt;Before connecting Google Sheets, confirm that submissions are reaching Formgrid correctly. &lt;br&gt;
Fill in your Squarespace 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. &lt;br&gt;
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="Formgrid leads tab showing tracked submissions" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If the submission does not appear, go back to your Squarespace form settings and confirm that the Post URL is set &lt;br&gt;
correctly. Also, confirm that you saved and published the changes in Squarespace after updating the form action.&lt;/p&gt;




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

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

&lt;p&gt;in Formgrid&lt;/p&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 &lt;br&gt;
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%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="Formgrid integrations tab" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see the Google Sheets integration section. If you are within &lt;br&gt;
your plan limits the Connect interface, which is active and ready to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 8: 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 a fresh blank spreadsheet in Google Sheets in a &lt;br&gt;
new 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="Create blank Google Sheet button in Formgrid" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your sheet a clear, identifiable name. Something like "Squarespace Contact Form Submissions" or &lt;br&gt;
"Service Enquiries 2026" works well. If you manage multiple 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 Squarespace field labels on the very first submission. &lt;br&gt;
The sheet should be empty when you connect it.&lt;/p&gt;

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

&lt;p&gt;the Formgrid Service Account&lt;/p&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="Google Sheets share dialog" 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.&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="Formgrid service account email copy button" width="800" height="337"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy it directly from there to avoid any chance of a typing error. Paste the email into the share dialog and make sure you select &lt;strong&gt;Editor&lt;/strong&gt; access, not Viewer. &lt;br&gt;
Formgrid needs Editor access to write new rows to your sheet. &lt;br&gt;
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="Google Sheets editor access setting" 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 10: 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. &lt;br&gt;
The URL will look like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheets/d/" rel="noopener noreferrer"&gt;https://docs.google.com/spreadsheets/d/&lt;/a&gt;&lt;br&gt;
1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74&lt;br&gt;
OgVE2upms/edit&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Paste the full URL into the sheet URL field in your Formgrid dashboard. &lt;br&gt;
Make sure you are copying from the address bar and that the URL contains the full spreadsheet ID, which is the long &lt;br&gt;
alphanumeric string 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="Paste Google Sheet URL into Formgrid" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Before connecting, you will see this option:&lt;br&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.&lt;br&gt;
[ ] Yes, sync my existing submissions&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="Sync existing submissions option in Formgrid" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have been collecting Squarespace 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 12: 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 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;
Connected successfully&lt;br&gt;
Your sheet is ready. Every new submission will appear as a new&lt;br&gt;
row automatically.&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%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="Google Sheets connected successfully in Formgrid" 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 13: Submit Another Test Entry Through Your Squarespace Form
&lt;/h3&gt;

&lt;p&gt;Visit your live Squarespace site and submit another test entry through the form. &lt;br&gt;
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 &lt;br&gt;
automatically from your Squarespace form field labels.&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="Google Sheets showing form submissions as rows" width="800" height="752"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From this point forward, every submission made through your Squarespace form will appear as a new row in your Google Sheet &lt;br&gt;
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 &lt;br&gt;
Squarespace form to the moment a row appears in your spreadsheet:&lt;br&gt;
Visitor fills in your Squarespace&lt;br&gt;
form and clicks Submit&lt;br&gt;
↓&lt;br&gt;
The browser sends a POST request&lt;br&gt;
to your Formgrid endpoint&lt;br&gt;
↓&lt;br&gt;
Formgrid receives and saves the&lt;br&gt;
submission to your dashboard&lt;br&gt;
↓&lt;br&gt;
Email notification sent to you&lt;br&gt;
and any other configured recipients&lt;br&gt;
↓&lt;br&gt;
A new row added to your Google&lt;br&gt;
Sheet instantly&lt;br&gt;
↓&lt;br&gt;
Spam protection runs in the&lt;br&gt;
background to filter out bot submissions&lt;/p&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;br&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;br&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;br&gt;
Takes you directly to your connected Google Sheet with a single click &lt;br&gt;
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="Google Sheets integration management in Formgrid" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;A common approach is to use Zapier to push Squarespace form submissions into Google Sheets. &lt;br&gt;
It works, but you are paying for two services instead of one and adding a delay between submission and spreadsheet row because Zapier does not always run 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&lt;/td&gt;
&lt;td&gt;Included in all plans&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;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;None built in&lt;/td&gt;
&lt;td&gt;Honeypot and rate limiting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email notifications&lt;/td&gt;
&lt;td&gt;Requires extra Zap&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  A Real Example: How a Photographer Uses This Setup
&lt;/h2&gt;

&lt;p&gt;Sarah runs a photography studio. She uses Squarespace for her website and has a booking enquiry form on her contact page.&lt;/p&gt;

&lt;p&gt;Before connecting Formgrid, every enquiry arrived as an email. Client &lt;br&gt;
name, event type, date, and budget all dumped into one unformatted &lt;br&gt;
message. &lt;br&gt;
She was managing her entire pipeline from her inbox, trying to &lt;br&gt;
remember which enquiries she had replied to and which ones needed &lt;br&gt;
a follow-up.&lt;/p&gt;

&lt;p&gt;She connected her Squarespace form to Formgrid and linked it to a Google Sheet. &lt;br&gt;
Now every new booking enquiry appears instantly as a new row in her &lt;br&gt;
spreadsheet. Name in one column, event type in the next, date after that, budget at the end. Organised. Automatic. No manual work.&lt;/p&gt;

&lt;p&gt;She shares the Sheet with her assistant, who can see new enquiries in real time without needing access to her email or her Formgrid dashboard.&lt;/p&gt;

&lt;p&gt;Her conversion rate went from unknown to measurable the week she set this up.&lt;/p&gt;




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

&lt;p&gt;&lt;strong&gt;Submissions not appearing in Formgrid after updating Squarespace:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Confirm that you saved and published the changes in Squarespace after &lt;br&gt;
updating the Post URL. Squarespace changes do not take effect on your &lt;br&gt;
live site until you publish. Also, confirm that the Post URL is your full Formgrid endpoint and not a partial URL.&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. &lt;br&gt;
Open Google Sheets, click Share, and confirm that the Formgrid service account email is listed as an Editor. If it is listed &lt;br&gt;
as a Viewer, remove it and re-add it with Editor access, then try &lt;br&gt;
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 field labels in your Squarespace form. If a column is missing or looks incorrect, review your form field labels in Squarespace, make the changes, publish the site, 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 &lt;br&gt;
reconnect if you want the headers to reflect updated field labels.&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 &lt;br&gt;
the Google Sheets integration is showing as Active. If it shows as &lt;br&gt;
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;Squarespace is still sending its own confirmation email:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When you set a custom Post URL in Squarespace, it takes over the form &lt;br&gt;
submission handling. If Squarespace is still sending its own confirmation, that is fine. Formgrid also sends an email notification independently. You can disable the Squarespace notification in your Squarespace form storage settings if you only want the Formgrid notification.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Formgrid Includes
&lt;/h2&gt;

&lt;p&gt;Google Sheets integration is available on all Formgrid plans, including free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free plan at $0 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (first 10 rows &lt;br&gt;
per form. One time.) &lt;br&gt;
Form builder with shareable link&lt;br&gt;
Form endpoint URL&lt;br&gt;
Email notifications&lt;br&gt;
25 submissions per month&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Premium plan at $12 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (up to 500 rows &lt;br&gt;
per month)&lt;br&gt;
Everything in the free plan&lt;br&gt;
1,000 submissions per month&lt;br&gt;
File uploads up to 1GB per file&lt;br&gt;
Auto-responder emails to form submitters&lt;br&gt;
CSV export&lt;br&gt;
Advanced spam protection&lt;br&gt;
Remove Formgrid branding&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Business plan at $29 per month:&lt;/strong&gt;&lt;br&gt;
Google Sheets sync (unlimited rows. &lt;br&gt;
Every submission syncs automatically.)&lt;br&gt;
Everything in Premium&lt;br&gt;
15,000 submissions per month&lt;br&gt;
Webhooks: connect to Zapier, Make, &lt;br&gt;
Slack, Notion, Airtable, and more&lt;br&gt;
Workflow automations&lt;br&gt;
Custom HTML email templates&lt;br&gt;
Multiple notification recipients&lt;br&gt;
Custom email subject lines&lt;br&gt;
Priority support with direct access &lt;br&gt;
to the founder&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 free at formgrid.dev&lt;/a&gt;&lt;br&gt;
No credit card required.&lt;/p&gt;




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

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

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

&lt;p&gt;If your team is currently managing Squarespace 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;




&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 is unclear or looks off.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>formbuilder</category>
      <category>squarespace</category>
      <category>googlesheets</category>
      <category>nodecode</category>
    </item>
    <item>
      <title>How to Track Where Your Form Submissions Are Coming From Using Your Own HTML Form</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Wed, 29 Apr 2026 11:19:48 +0000</pubDate>
      <link>https://dev.to/allenarduino/how-to-track-where-your-form-submissions-are-coming-from-using-your-own-html-form-4k5c</link>
      <guid>https://dev.to/allenarduino/how-to-track-where-your-form-submissions-are-coming-from-using-your-own-html-form-4k5c</guid>
      <description>&lt;p&gt;You already have a contact form on your website.&lt;/p&gt;

&lt;p&gt;Maybe it is a simple three-field form on your portfolio. Maybe it is a detailed quote request form on your business site. &lt;br&gt;
Maybe it is a registration form you built yourself in React or plain HTML.&lt;/p&gt;

&lt;p&gt;It is working. Submissions are arriving. &lt;br&gt;
People are filling it in.&lt;/p&gt;

&lt;p&gt;But here is the question you probably have not thought to ask:&lt;/p&gt;

&lt;p&gt;Where are these people coming from?&lt;/p&gt;

&lt;p&gt;Did they find your site through a Google search? Did someone share your link in a WhatsApp group? Did they click a link in your email newsletter? Did they come from your Instagram bio?&lt;/p&gt;

&lt;p&gt;If you do not know the answer, you are making marketing decisions blindly. You are spending time on channels that might not be sending you any leads while ignoring the one channel sending you your best customers.&lt;/p&gt;

&lt;p&gt;This guide shows you how to add UTM tracking to your existing HTML form using Formgrid, so every submission automatically shows you exactly where it came from.&lt;/p&gt;


&lt;h2&gt;
  
  
  What You Need Before Starting
&lt;/h2&gt;

&lt;p&gt;A Formgrid account:&lt;br&gt;
Sign up for 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;br&gt;
An existing HTML form on your website:&lt;br&gt;
Any HTML form works, whether it is&lt;br&gt;
a contact form, a quote request form,&lt;br&gt;
a registration form, or anything else&lt;br&gt;
A basic understanding of HTML:&lt;br&gt;
You just need to be able to add&lt;br&gt;
a few lines to your existing form&lt;/p&gt;


&lt;h2&gt;
  
  
  How UTM Tracking Works With Your Own HTML Form
&lt;/h2&gt;

&lt;p&gt;When someone arrives at your page &lt;br&gt;
through a tracked link like this:&lt;br&gt;
&lt;a href="https://yourwebsite.com/contact" rel="noopener noreferrer"&gt;https://yourwebsite.com/contact&lt;/a&gt;&lt;br&gt;
?utm_source=twitter&amp;amp;utm_medium=social&lt;/p&gt;

&lt;p&gt;The UTM parameters are in the page URL. Your form needs to read those parameters from the URL and include them in the &lt;br&gt;
submission, so Formgrid knows where the person came from.&lt;/p&gt;

&lt;p&gt;There are two parts to setting this up:&lt;br&gt;
Part 1:&lt;br&gt;
Add hidden fields to your HTML form&lt;br&gt;
to carry the UTM data&lt;br&gt;
Part 2:&lt;br&gt;
Add a small JavaScript snippet that reads the UTM parameters from the URL and fills those hidden fields automatically before the form submits&lt;/p&gt;

&lt;p&gt;The person filling in your form sees nothing different. They fill in their name, email, and message as normal. The UTM data is captured invisibly in the background.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1: Connect Your Form to Formgrid
&lt;/h2&gt;

&lt;p&gt;If you have not already done this, replace your form action URL with &lt;br&gt;
your Formgrid endpoint. One line change. Everything else stays exactly as it is.&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;Go to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; and sign up. Create a new form and copy your endpoint URL from the form details 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%2Fa590ejt2zmv83285bt64.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%2Fa590ejt2zmv83285bt64.png" alt="Formgrid signup page" width="800" height="443"&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%2Flafra8ygljruiylpilbc.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%2Flafra8ygljruiylpilbc.png" alt="Formgrid endpoint URL on form details page" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Paste that endpoint URL into your form action attribute. Your form now sends submissions to Formgrid.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Add Hidden UTM Fields to Your Form
&lt;/h2&gt;

&lt;p&gt;Add three hidden input fields inside your form. These fields are invisible to the person filling in your form, but they carry the UTM data to Formgrid when the form is submitted.&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;!-- Hidden UTM tracking fields --&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- These are invisible to the user --&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;"utm_source"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"utm_source"&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;"utm_medium"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"utm_medium"&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;"utm_campaign"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"utm_campaign"&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&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;The three hidden fields are:&lt;br&gt;
utm_source:&lt;br&gt;
Where the traffic came from&lt;br&gt;
Examples: twitter, whatsapp,&lt;br&gt;
instagram, newsletter, google&lt;br&gt;
utm_medium:&lt;br&gt;
How the traffic arrived&lt;br&gt;
Examples: social, email, paid, organic&lt;br&gt;
utm_campaign:&lt;br&gt;
Which specific campaign sent them&lt;br&gt;
Examples: summer_launch, instagram_bio,&lt;br&gt;
newsletter_april&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 3: Add the JavaScript Snippet
&lt;/h2&gt;

&lt;p&gt;Add this script immediately after your closing form tag. It reads the UTM parameters from the page URL and populates the hidden fields automatically before the form is submitted.&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;script&amp;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="c1"&gt;// Read UTM parameters from the &lt;/span&gt;
    &lt;span class="c1"&gt;// current page URL&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;params&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;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;// Get each UTM value from the URL&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;utmSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_source&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;utmMedium&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;utmCampaign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_campaign&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;// Populate the hidden fields &lt;/span&gt;
    &lt;span class="c1"&gt;// if the values exist&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;utmSource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sourceField&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;utm_source&lt;/span&gt;&lt;span class="dl"&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;sourceField&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="nx"&gt;sourceField&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="nx"&gt;utmSource&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;utmMedium&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mediumField&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;utm_medium&lt;/span&gt;&lt;span class="dl"&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;mediumField&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="nx"&gt;mediumField&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="nx"&gt;utmMedium&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;utmCampaign&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;campaignField&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;utm_campaign&lt;/span&gt;&lt;span class="dl"&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;campaignField&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="nx"&gt;campaignField&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="nx"&gt;utmCampaign&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 script runs automatically when the page loads. If the URL contains UTM parameters, it fills the hidden fields silently. If there are no UTM parameters in the URL, the hidden fields stay empty, and the submission goes through normally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Complete Form With UTM Tracking
&lt;/h2&gt;

&lt;p&gt;Here is the full form with everything &lt;br&gt;
in place:&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;!-- Hidden UTM tracking fields --&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;"utm_source"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"utm_source"&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;"utm_medium"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"utm_medium"&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;"utm_campaign"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"utm_campaign"&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&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="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;var&lt;/span&gt; &lt;span class="nx"&gt;params&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;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;utmSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_source&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;utmMedium&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;utmCampaign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_campaign&lt;/span&gt;&lt;span class="dl"&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;utmSource&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;sourceField&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;utm_source&lt;/span&gt;&lt;span class="dl"&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;sourceField&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="nx"&gt;sourceField&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="nx"&gt;utmSource&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;utmMedium&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;mediumField&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;utm_medium&lt;/span&gt;&lt;span class="dl"&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;mediumField&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="nx"&gt;mediumField&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="nx"&gt;utmMedium&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;utmCampaign&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;campaignField&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;utm_campaign&lt;/span&gt;&lt;span class="dl"&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;campaignField&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
        &lt;span class="nx"&gt;campaignField&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="nx"&gt;utmCampaign&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;That is the entire setup. No libraries. &lt;br&gt;
No build tools. No dependencies. Just &lt;br&gt;
three hidden fields and ten lines of vanilla JavaScript.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 4: Create Your Tracked Links
&lt;/h2&gt;

&lt;p&gt;Now that your form is ready to capture UTM data, you need to create tracked versions of your page URL to share in different places.&lt;/p&gt;

&lt;p&gt;Your normal contact page URL:&lt;br&gt;
&lt;a href="https://yourwebsite.com/contact" rel="noopener noreferrer"&gt;https://yourwebsite.com/contact&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your tracked versions:&lt;br&gt;
For Twitter:&lt;br&gt;
&lt;a href="https://yourwebsite.com/contact" rel="noopener noreferrer"&gt;https://yourwebsite.com/contact&lt;/a&gt;&lt;br&gt;
?utm_source=twitter&amp;amp;utm_medium=social&lt;br&gt;
For WhatsApp:&lt;br&gt;
&lt;a href="https://yourwebsite.com/contact" rel="noopener noreferrer"&gt;https://yourwebsite.com/contact&lt;/a&gt;&lt;br&gt;
?utm_source=whatsapp&amp;amp;utm_medium=social&lt;br&gt;
For your email newsletter:&lt;br&gt;
&lt;a href="https://yourwebsite.com/contact" rel="noopener noreferrer"&gt;https://yourwebsite.com/contact&lt;/a&gt;&lt;br&gt;
?utm_source=newsletter&amp;amp;utm_medium=email&lt;br&gt;
For Instagram bio:&lt;br&gt;
&lt;a href="https://yourwebsite.com/contact" rel="noopener noreferrer"&gt;https://yourwebsite.com/contact&lt;/a&gt;&lt;br&gt;
?utm_source=instagram&amp;amp;utm_medium=social&lt;br&gt;
For LinkedIn:&lt;br&gt;
&lt;a href="https://yourwebsite.com/contact" rel="noopener noreferrer"&gt;https://yourwebsite.com/contact&lt;/a&gt;&lt;br&gt;
?utm_source=linkedin&amp;amp;utm_medium=social&lt;/p&gt;

&lt;p&gt;Share the right link in the right place. The person clicking the link arrives at your normal contact page. They see nothing different. But when they submit your form, Formgrid records exactly which link they clicked.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 5: See Where Your Submissions
&lt;/h2&gt;

&lt;p&gt;Are Coming From&lt;/p&gt;

&lt;p&gt;When submissions arrive in your Formgrid dashboard, each one shows you exactly where it came from.&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%2F9fykyl4efhjwmqhvlzhr.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%2F9fykyl4efhjwmqhvlzhr.png" alt=" " width="800" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open any submission, and you will see:&lt;br&gt;
Source: twitter via social&lt;/p&gt;

&lt;p&gt;Or:&lt;br&gt;
Source: whatsapp via social&lt;/p&gt;

&lt;p&gt;Or:&lt;br&gt;
Source: newsletter via email&lt;/p&gt;

&lt;p&gt;After a few weeks of sharing tracked links, you can see at a glance which channel is sending you the most submissions and which channel is sending you leads that actually convert.&lt;/p&gt;


&lt;h2&gt;
  
  
  Using This With React or
&lt;/h2&gt;

&lt;p&gt;Other Frameworks&lt;/p&gt;

&lt;p&gt;If your form is built in React or another JavaScript framework, the &lt;br&gt;
approach is the same, but you read the URL parameters using the &lt;br&gt;
framework's router or the native browser API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React example:&lt;/strong&gt;&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ContactForm&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="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;utmSource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUtmSource&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;utmMedium&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUtmMedium&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;utmCampaign&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUtmCampaign&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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="nf"&gt;useEffect&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;params&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;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;setUtmSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_source&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;setUtmMedium&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;setUtmCampaign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_campaign&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&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;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; 
      &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&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;"name"&lt;/span&gt; 
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;/&amp;gt;&lt;/span&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;"email"&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;"email"&lt;/span&gt; 
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&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;"message"&lt;/span&gt; 
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* Hidden UTM fields */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&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;"hidden"&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;"utm_source"&lt;/span&gt; 
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;utmSource&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&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;"hidden"&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;"utm_medium"&lt;/span&gt; 
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;utmMedium&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&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;"hidden"&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;"utm_campaign"&lt;/span&gt; 
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;utmCampaign&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&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;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Send Message
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&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;ContactForm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Next.js example using useSearchParams:&lt;/strong&gt;&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&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;useEffect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useState&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&lt;/span&gt;&lt;span class="dl"&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;useSearchParams&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;next/navigation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ContactForm&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;searchParams&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useSearchParams&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;utmSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_source&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;utmMedium&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_medium&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;utmCampaign&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 
    &lt;span class="nx"&gt;searchParams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utm_campaign&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; 
      &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"POST"&lt;/span&gt;
    &lt;span class="p"&gt;&amp;gt;&lt;/span&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;"name"&lt;/span&gt; 
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;/&amp;gt;&lt;/span&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;"email"&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;"email"&lt;/span&gt; 
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&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="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;textarea&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;"message"&lt;/span&gt; 
        &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Your Message"&lt;/span&gt;
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&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;"hidden"&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;"utm_source"&lt;/span&gt; 
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;utmSource&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&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;"hidden"&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;"utm_medium"&lt;/span&gt; 
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;utmMedium&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&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;"hidden"&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;"utm_campaign"&lt;/span&gt; 
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;utmCampaign&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; 
      &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&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;"submit"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Send Message
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&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;ContactForm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The logic is identical in every framework. Read the URL parameters when the component mounts. Pass them as hidden field values. Formgrid handles the rest.&lt;/p&gt;




&lt;h2&gt;
  
  
  Testing Your Setup
&lt;/h2&gt;

&lt;p&gt;Before sharing your tracked links, test that everything is working correctly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Open your contact page with &lt;br&gt;
a UTM parameter in the URL:&lt;br&gt;
&lt;a href="https://yourwebsite.com/contact" rel="noopener noreferrer"&gt;https://yourwebsite.com/contact&lt;/a&gt;&lt;br&gt;
?utm_source=test&amp;amp;utm_medium=testing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Right-click on the page and inspect the hidden form fields. You should see:&lt;/p&gt;

&lt;p&gt;utm_source value: test&lt;br&gt;
utm_medium value: testing&lt;br&gt;
utm_campaign value: (empty)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Fill in the form and submit it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Open your Formgrid dashboard and find the submission. Open it and check that the source shows:&lt;br&gt;
Source: test via testing&lt;/p&gt;

&lt;p&gt;If you see the source on the submission, your setup is working correctly. If not, check that the hidden field IDs match the JavaScript and that the script is running after the form loads.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Real Example: The Difference
&lt;/h2&gt;

&lt;p&gt;This Makes&lt;/p&gt;

&lt;p&gt;James runs a cleaning business. He shares his quote request form link in four places &lt;br&gt;
every week:&lt;br&gt;
His Instagram bio&lt;br&gt;
A local business Facebook group&lt;br&gt;
His monthly email newsletter&lt;br&gt;
Google My Business profile&lt;/p&gt;

&lt;p&gt;Before UTM tracking, he had no idea which channel was working. He was &lt;br&gt;
posting on Instagram every day and sending a newsletter once a month.&lt;/p&gt;

&lt;p&gt;After adding UTM tracking to his form, he checked his Formgrid dashboard &lt;br&gt;
after one month:&lt;br&gt;
Instagram:        3 submissions&lt;br&gt;
Facebook group:   21 submissions&lt;br&gt;
Newsletter:       8 submissions&lt;br&gt;
Google My Business: 11 submissions&lt;/p&gt;

&lt;p&gt;He was spending most of his time on Instagram, and it was sending him almost nothing. The Facebook group he checked once a week was sending him the most leads.&lt;/p&gt;

&lt;p&gt;He shifted his time accordingly. More engagement in the Facebook group. Less Instagram posting. His monthly quote requests increased by 60 percent without doing any additional marketing.&lt;/p&gt;

&lt;p&gt;That decision was only possible because he could see the data.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Happens to the UTM Data
&lt;/h2&gt;

&lt;p&gt;in Formgrid&lt;/p&gt;

&lt;p&gt;Every submission that includes UTM data shows the source in the lead &lt;br&gt;
detail view in your dashboard.&lt;/p&gt;

&lt;p&gt;You also see it in the leads tab alongside each submission, so you &lt;br&gt;
can see at a glance which channel each lead came from without opening &lt;br&gt;
the full detail view.&lt;/p&gt;

&lt;p&gt;Combined with Formgrid's lead pipeline, you can track both the source and the outcome of every lead:&lt;br&gt;
Facebook group submissions:&lt;br&gt;
21 total&lt;br&gt;
15 contacted&lt;br&gt;
9 converted (43% conversion rate)&lt;br&gt;
Instagram submissions:&lt;br&gt;
3 total&lt;br&gt;
2 contacted&lt;br&gt;
0 converted (0% conversion rate)&lt;/p&gt;

&lt;p&gt;Facebook is not just sending more leads. &lt;br&gt;
It is sending leads that actually become customers. Instagram is sending leads that go nowhere.&lt;/p&gt;

&lt;p&gt;Without UTM tracking, you would never know that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you already have an HTML form on &lt;br&gt;
your website:&lt;br&gt;
Step 1:&lt;br&gt;
Connect it to Formgrid by replacing&lt;br&gt;
the form action URL&lt;br&gt;
Step 2:&lt;br&gt;
Add the three hidden UTM fields&lt;br&gt;
Step 3:&lt;br&gt;
Add the JavaScript snippet&lt;br&gt;
Step 4:&lt;br&gt;
Create tracked versions of your&lt;br&gt;
page URL for each channel&lt;br&gt;
Step 5:&lt;br&gt;
Share the right link in each place&lt;/p&gt;

&lt;p&gt;Total setup time: about 10 minutes.&lt;/p&gt;

&lt;p&gt;From that point forward, every submission &lt;br&gt;
automatically shows you where it came from.&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;

&lt;p&gt;No credit card required. Free plan &lt;br&gt;
available. UTM tracking works on all plans, including free.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about setting up UTM &lt;br&gt;
tracking with your specific form or &lt;br&gt;
framework? Email &lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt;, and I will help you get it working.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>html</category>
      <category>marketing</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
