<?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>Forem: Allen Jones</title>
    <description>The latest articles on Forem by Allen Jones (@allenarduino).</description>
    <link>https://forem.com/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>Forem: Allen Jones</title>
      <link>https://forem.com/allenarduino</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/allenarduino"/>
    <language>en</language>
    <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://forem.com/allenarduino/how-to-build-a-15k-web-design-agency-landing-page-with-nextjs-and-formgrid-5291</link>
      <guid>https://forem.com/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%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;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://forem.com/allenarduino/chatgpt-built-your-html-form-now-what-how-to-handle-form-submissions-without-a-backend-51j2</link>
      <guid>https://forem.com/allenarduino/chatgpt-built-your-html-form-now-what-how-to-handle-form-submissions-without-a-backend-51j2</guid>
      <description>&lt;p&gt;You asked an AI tool 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 $8.&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://forem.com/allenarduino/the-roofing-contact-form-that-actually-gets-homeowners-to-submit-ioi</link>
      <guid>https://forem.com/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://forem.com/allenarduino/how-to-get-more-roofing-quote-requests-from-your-website-without-paying-for-more-ads-1b02</link>
      <guid>https://forem.com/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 &lt;br&gt;
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://forem.com/allenarduino/why-your-roofing-website-gets-traffic-but-no-quote-requests-488c</link>
      <guid>https://forem.com/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://forem.com/allenarduino/how-to-send-nextjs-form-submissions-to-google-sheets-without-a-backend-4f46</link>
      <guid>https://forem.com/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 $8 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 $8 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;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://forem.com/allenarduino/how-to-send-framer-form-submissions-to-google-sheets-without-zapier-48f</link>
      <guid>https://forem.com/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 $8 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 $8 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>
      <category>automation</category>
      <category>productivity</category>
      <category>tutorial</category>
      <category>webdev</category>
    </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://forem.com/allenarduino/how-to-send-squarespace-form-submissions-to-google-sheets-without-zapier-56g0</link>
      <guid>https://forem.com/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 $8 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 $8 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;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://forem.com/allenarduino/how-to-track-where-your-form-submissions-are-coming-from-using-your-own-html-form-4k5c</link>
      <guid>https://forem.com/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>
    <item>
      <title>How to Track Where Your Form Submissions Are Coming From</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Tue, 28 Apr 2026 20:23:12 +0000</pubDate>
      <link>https://forem.com/allenarduino/how-to-track-where-your-form-submissions-are-coming-from-3ila</link>
      <guid>https://forem.com/allenarduino/how-to-track-where-your-form-submissions-are-coming-from-3ila</guid>
      <description>&lt;p&gt;You are getting form submissions.&lt;/p&gt;

&lt;p&gt;People are filling in your contact form, your registration form, and your quote request form. &lt;br&gt;
The submissions are arriving in your inbox and your dashboard.&lt;/p&gt;

&lt;p&gt;But here is the question most small business owners never think to ask:&lt;/p&gt;

&lt;p&gt;Where are these people coming from?&lt;/p&gt;

&lt;p&gt;Did they find your form through your Instagram bio? Did someone share your link in a WhatsApp group? Did they click a link in your email newsletter? Did they find you through a Google search?&lt;/p&gt;

&lt;p&gt;If you do not know the answer to that question, you are making marketing decisions blindly. You are spending time on channels that might not be sending you any leads at all, while ignoring the one channel that is sending you your best customers.&lt;/p&gt;

&lt;p&gt;This guide shows you how to track exactly where every form submission comes from using a simple system called UTM tracking and how Formgrid makes it automatic.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why This Matters More Than You Think
&lt;/h2&gt;

&lt;p&gt;Imagine you are sharing your contact form &lt;br&gt;
in three places:&lt;br&gt;
Your Instagram bio&lt;br&gt;
A WhatsApp group for your industry&lt;br&gt;
Your monthly email newsletter&lt;/p&gt;

&lt;p&gt;After a month, you have 40 submissions. But you have no idea which channel sent which submissions.&lt;/p&gt;

&lt;p&gt;Without source tracking:&lt;br&gt;
You guess Instagram is working because you post there most often.&lt;br&gt;
You stop sending the newsletter because it feels like a lot of effort.&lt;br&gt;
You leave the WhatsApp group because it seems inactive.&lt;/p&gt;

&lt;p&gt;With source tracking, you discover:&lt;br&gt;
Instagram:   4 submissions&lt;br&gt;
WhatsApp:    28 submissions&lt;br&gt;
Newsletter:  8 submissions&lt;/p&gt;

&lt;p&gt;WhatsApp was sending you 70 percent of your leads, and you almost stopped using it.&lt;/p&gt;

&lt;p&gt;That is the difference source tracking makes.&lt;/p&gt;


&lt;h2&gt;
  
  
  What UTM Tracking Is
&lt;/h2&gt;

&lt;p&gt;UTM stands for Urchin Tracking Module. The name does not matter. What matters is what it does.&lt;/p&gt;

&lt;p&gt;UTM tracking is a simple way to add invisible labels to your links so you can see which link a person clicked before they filled in your form.&lt;/p&gt;

&lt;p&gt;You create different versions of your form link for each place you share it. Every version looks the same to the person clicking it. But behind the scenes, each version carries a label that tells you where it came from.&lt;/p&gt;

&lt;p&gt;When someone clicks your WhatsApp link and fills in your form, Formgrid reads that label automatically and attaches it to the submission. No form fields needed. No technical setup required. &lt;br&gt;
It just works.&lt;/p&gt;


&lt;h2&gt;
  
  
  How UTM Links Work
&lt;/h2&gt;

&lt;p&gt;Your normal Formgrid form link looks &lt;br&gt;
like this:&lt;br&gt;
&lt;a href="https://formgrid.dev/f/your-form-id" rel="noopener noreferrer"&gt;https://formgrid.dev/f/your-form-id&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A UTM tracked version of the same link &lt;br&gt;
looks like this:&lt;br&gt;
&lt;a href="https://formgrid.dev/f/your-form-id?utm_source=whatsapp&amp;amp;utm_medium=social" rel="noopener noreferrer"&gt;https://formgrid.dev/f/your-form-id?utm_source=whatsapp&amp;amp;utm_medium=social&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The part after the question mark is the &lt;br&gt;
UTM parameter. It tells Formgrid two things:&lt;br&gt;
utm_source=whatsapp where the link was shared.&lt;br&gt;
In this case, WhatsApp.&lt;br&gt;
utm_medium=social&lt;br&gt;
How the link was shared.&lt;br&gt;
In this case through social media.&lt;/p&gt;

&lt;p&gt;The person clicking the link sees nothing different. They open your form. They fill it in. They submit it.&lt;/p&gt;

&lt;p&gt;Behind the scenes, Formgrid reads the UTM parameters from the URL and saves them to the submission automatically.&lt;/p&gt;

&lt;p&gt;No visible fields. No extra steps. &lt;br&gt;
No technical knowledge is needed from the person filling in your form.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Three UTM Parameters
&lt;/h2&gt;

&lt;p&gt;You only need to understand three:&lt;br&gt;
utm_source&lt;br&gt;
Where the traffic came from.&lt;br&gt;
Examples:&lt;br&gt;
whatsapp&lt;br&gt;
twitter&lt;br&gt;
instagram&lt;br&gt;
linkedin&lt;br&gt;
facebook&lt;br&gt;
email&lt;br&gt;
google&lt;br&gt;
reddit&lt;/p&gt;

&lt;p&gt;utm_medium&lt;br&gt;
How the traffic arrived.&lt;br&gt;
Examples:&lt;br&gt;
social    (shared on social media)&lt;br&gt;
email     (sent in an email)&lt;br&gt;
paid      (from a paid ad)&lt;br&gt;
organic   (from search)&lt;br&gt;
referral  (linked from another site)&lt;/p&gt;

&lt;p&gt;utm_campaign&lt;br&gt;
Which specific campaign or piece&lt;br&gt;
of content sent to them.&lt;br&gt;
Examples:&lt;br&gt;
summer_launch&lt;br&gt;
newsletter_april&lt;br&gt;
instagram_bio&lt;br&gt;
horse_ride_outreach&lt;/p&gt;

&lt;p&gt;You do not need all three on every link. &lt;br&gt;
Source and medium are enough for most small businesses.&lt;/p&gt;


&lt;h2&gt;
  
  
  How to Create Tracked Links in Formgrid
&lt;/h2&gt;

&lt;p&gt;Formgrid generates tracked links automatically for you. You do not need to edit URLs manually or understand the technical details.&lt;/p&gt;

&lt;p&gt;Here is how it works.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Create and Save Your Form
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt; &lt;br&gt;
and sign up. 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;Create a new form using the drag and drop builder or connect your existing HTML form to a Formgrid endpoint.&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%2Fkw73gs1mo5ra6bjuszx1.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%2Fkw73gs1mo5ra6bjuszx1.png" alt="Formgrid dashboard and new form creation" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give your form a name and click Save.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Open the Share Modal
&lt;/h3&gt;

&lt;p&gt;Once your form is saved, open it in the form builder. In the top toolbar, you will see four buttons:&lt;br&gt;
Embed   Preview   Share   Save Changes&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Share&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A modal opens showing your form link and six pre-built tracked links for the most common channels.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Copy Your Tracked Links
&lt;/h3&gt;

&lt;p&gt;The Share modal shows:&lt;br&gt;
Your form link:&lt;br&gt;
formgrid.dev/f/your-form-id&lt;br&gt;
[Copy]&lt;br&gt;
Share with tracking:&lt;br&gt;
[Twitter]    [Copy]&lt;br&gt;
[WhatsApp]   [Copy]&lt;br&gt;
[Email]      [Copy]&lt;br&gt;
[Instagram]  [Copy]&lt;br&gt;
[LinkedIn]   [Copy]&lt;br&gt;
[Facebook]   [Copy]&lt;br&gt;
Custom source:&lt;br&gt;
[               ] [Copy]&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%2Fbez1uni6mdk22t38hl9a.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%2Fbez1uni6mdk22t38hl9a.png" alt=" " width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each button copies a different tracked version of your form link to your clipboard.&lt;br&gt;
Twitter link:&lt;br&gt;
formgrid.dev/f/your-form-id&lt;br&gt;
?utm_source=twitter&amp;amp;utm_medium=social&lt;br&gt;
WhatsApp link:&lt;br&gt;
formgrid.dev/f/your-form-id&lt;br&gt;
?utm_source=whatsapp&amp;amp;utm_medium=social&lt;br&gt;
Email link:&lt;br&gt;
formgrid.dev/f/your-form-id&lt;br&gt;
?utm_source=email&amp;amp;utm_medium=newsletter&lt;/p&gt;

&lt;p&gt;You copy the link for wherever you are sharing. Paste it. Done.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Share Each Link in the
&lt;/h3&gt;

&lt;p&gt;Right Place&lt;br&gt;
Paste the Twitter link in your&lt;br&gt;
Twitter bio or tweet&lt;br&gt;
Paste the WhatsApp link in your&lt;br&gt;
WhatsApp group or status&lt;br&gt;
Paste the Email link in your&lt;br&gt;
newsletter or email signature&lt;br&gt;
Paste the Instagram link in your&lt;br&gt;
Instagram bio&lt;/p&gt;

&lt;p&gt;Each link goes to the same form. &lt;br&gt;
The person filling it in sees nothing different. &lt;br&gt;
But Formgrid knows which link they clicked.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 5: See Where Your Submissions
&lt;/h3&gt;

&lt;p&gt;Are Coming From&lt;/p&gt;

&lt;p&gt;When submissions arrive in your dashboard, each one shows 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: WhatsApp via social&lt;/p&gt;

&lt;p&gt;Or:&lt;br&gt;
Source: Twitter via social&lt;/p&gt;

&lt;p&gt;Or:&lt;br&gt;
Source: email via newsletter&lt;/p&gt;

&lt;p&gt;After a few weeks of sharing your tracked links, you can see at a glance which channel is sending you the most submissions and which channel is sending you the leads that actually convert.&lt;/p&gt;


&lt;h2&gt;
  
  
  A Real Example: How This Changes
&lt;/h2&gt;

&lt;p&gt;Your Decisions&lt;/p&gt;

&lt;p&gt;Sarah runs a photography studio. She shares &lt;br&gt;
her booking enquiry form in four places:&lt;br&gt;
Her Instagram bio&lt;br&gt;
Her WhatsApp group for local businesses&lt;br&gt;
Her monthly email newsletter&lt;br&gt;
Her Twitter profile&lt;/p&gt;

&lt;p&gt;After using tracked links for one month, her Formgrid dashboard shows:&lt;br&gt;
Instagram:   6 submissions&lt;br&gt;
WhatsApp:    19 submissions&lt;br&gt;
Newsletter:  3 submissions&lt;br&gt;
Twitter:     2 submissions&lt;/p&gt;

&lt;p&gt;She was spending two hours per week creating content for Twitter. She had 2 submissions to show for it.&lt;/p&gt;

&lt;p&gt;She was spending 10 minutes per week in the local business WhatsApp group. She had 19 submissions to show for it.&lt;/p&gt;

&lt;p&gt;She stopped posting on Twitter. She started engaging more in the WhatsApp group. &lt;br&gt;
Her submission volume increased by 40 percent without creating any &lt;br&gt;
more content.&lt;/p&gt;

&lt;p&gt;That decision was only possible because she could see the data.&lt;/p&gt;


&lt;h2&gt;
  
  
  What About Custom Channels
&lt;/h2&gt;

&lt;p&gt;Not every channel fits neatly into the six default options. Maybe you share your form in a Reddit community. &lt;br&gt;
Maybe you put it in a blog post. Maybe a podcast mentions your business.&lt;/p&gt;

&lt;p&gt;The Share modal in Formgrid has a custom &lt;br&gt;
source field at the bottom:&lt;br&gt;
Custom source:&lt;br&gt;
[reddit             ] [Copy]&lt;/p&gt;

&lt;p&gt;Type your source name and click Copy. &lt;br&gt;
Formgrid generates a tracked link for that exact source:&lt;br&gt;
formgrid.dev/f/your-form-id&lt;br&gt;
?utm_source=reddit&amp;amp;utm_medium=custom&lt;/p&gt;

&lt;p&gt;You can create tracked links for any channel you use.&lt;/p&gt;


&lt;h2&gt;
  
  
  What To Do With This Information
&lt;/h2&gt;

&lt;p&gt;Once you have a few weeks of tracked submissions in your dashboard, ask yourself these questions:&lt;br&gt;
Which channel sends the most submissions?&lt;br&gt;
Double down on that channel.&lt;br&gt;
Which channel sends zero submissions?&lt;br&gt;
Stop spending time there, or try a different approach.&lt;br&gt;
Which channel sends submissions that actually convert to customers?&lt;br&gt;
That is your most valuable channel regardless of volume.&lt;/p&gt;

&lt;p&gt;The last question is the most powerful one. Volume is vanity. Conversion is what matters.&lt;/p&gt;

&lt;p&gt;A channel that sends 5 submissions, and 4 of them become customers is &lt;br&gt;
worth more than a channel that sends 30 submissions and none of them convert.&lt;/p&gt;

&lt;p&gt;With Formgrid's lead pipeline, you can track both. You see the source on each submission, and you see whether that submission became &lt;br&gt;
New, Contacted, or Converted.&lt;br&gt;
WhatsApp submissions:&lt;br&gt;
19 total&lt;br&gt;
14 contacted&lt;br&gt;
8 converted (42% conversion rate)&lt;br&gt;
Instagram submissions:&lt;br&gt;
6 total&lt;br&gt;
4 contacted&lt;br&gt;
1 converted (17% conversion rate)&lt;/p&gt;

&lt;p&gt;WhatsApp is not just sending more leads. &lt;br&gt;
It is sending better leads. You would never know that without source tracking.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why Most Form Tools Do Not Do This
&lt;/h2&gt;

&lt;p&gt;Most form backends receive your submission and send you an email. That is where their job ends.&lt;/p&gt;

&lt;p&gt;They have no concept of where the submission came from. &lt;br&gt;
They have no pipeline to track what happens after. &lt;br&gt;
They have no way to connect a lead back to the channel that generated it.&lt;/p&gt;

&lt;p&gt;Formgrid captures UTM parameters automatically from every submission. &lt;br&gt;
It stores the source, medium, and campaign on every lead record. It shows you the source in the lead detail view so you always know where each person came from.&lt;/p&gt;

&lt;p&gt;No plugin. No Zapier integration. &lt;br&gt;
No third-party analytics tool. &lt;br&gt;
It is just built in.&lt;/p&gt;


&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you already have a form on your website, you can connect it to Formgrid by replacing the form action URL with your Formgrid endpoint. One line change. Everything else stays the same.&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;If you are starting from scratch, use the drag-and-drop form builder to get a shareable link in under 2 minutes. No website needed.&lt;/p&gt;

&lt;p&gt;Either way, the moment you start sharing tracked links, Formgrid automatically shows you where every submission 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 available. &lt;br&gt;
The Share modal with tracked links is available on all plans, including free.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about UTM tracking &lt;br&gt;
or setting up source tracking for &lt;br&gt;
your specific form? Email &lt;br&gt;
&lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt;, and I will &lt;br&gt;
help you get it working.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>beginners</category>
      <category>marketing</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Getform Is Now Forminit: What Changed and What It Means for Your Forms</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Mon, 27 Apr 2026 23:43:28 +0000</pubDate>
      <link>https://forem.com/allenarduino/getform-is-now-forminit-what-changed-and-what-it-means-for-your-forms-1bcm</link>
      <guid>https://forem.com/allenarduino/getform-is-now-forminit-what-changed-and-what-it-means-for-your-forms-1bcm</guid>
      <description>&lt;p&gt;If you have been using Getform and recently noticed things look different, you are not imagining it.&lt;/p&gt;

&lt;p&gt;Getform officially rebranded to Forminit in January 2026. Same team. Same core product. New name and a significant feature update.&lt;/p&gt;

&lt;p&gt;Your existing Getform endpoints still work. &lt;br&gt;
No migration needed. But the rebrand comes with changes worth understanding before you decide whether to stay or switch.&lt;/p&gt;

&lt;p&gt;This post covers what actually changed, what is new, what is still missing, and what your alternatives look like in 2026.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is Forminit (Formerly Getform)?
&lt;/h2&gt;

&lt;p&gt;Forminit is a headless form backend API. &lt;br&gt;
You build your own form in HTML, React, or any framework, point it at a Forminit endpoint, and they handle everything after the user clicks submit.&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://forminit.com/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="c"&gt;&amp;lt;!-- Sender Block --&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;"fi-sender-fullName"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Full name"&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;"fi-sender-email"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Email"&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;"tel"&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"fi-sender-phone"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Phone"&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;"fi-sender-city"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"City"&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;"fi-sender-address"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"Address"&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;Submit&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;Submissions are stored in a dashboard. You get email notifications. File uploads, spam protection, and webhooks are included on paid plans.&lt;/p&gt;

&lt;p&gt;That was Getform. Forminit is the same thing with new features added on top.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Actually Changed in the Rebrand
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Authentication Modes
&lt;/h3&gt;

&lt;p&gt;The biggest technical change is authentication. &lt;br&gt;
Forminit now offers two modes:&lt;/p&gt;

&lt;p&gt;Public mode works exactly like Getform did. &lt;br&gt;
Your form posts to an endpoint, and submissions arrive in your dashboard. Anyone can technically target that endpoint.&lt;/p&gt;

&lt;p&gt;Protected mode lets you generate API keys for server-side use. If you are proxying form submissions through your own backend before sending them to Forminit, this gives you higher rate limits and better protection against abuse.&lt;/p&gt;

&lt;p&gt;For most users, using a simple HTML form on a static site in public mode is still the right choice. Protected mode is for developers who want server-side control.&lt;/p&gt;
&lt;h3&gt;
  
  
  Workspaces
&lt;/h3&gt;

&lt;p&gt;Forminit now has workspaces. These are containers you can share with team members. Useful for agencies managing multiple clients or freelancers keeping projects separated.&lt;/p&gt;

&lt;p&gt;If you are a solo developer or small business owner with one or two forms, this feature will not affect you at all.&lt;/p&gt;
&lt;h3&gt;
  
  
  Form Blocks
&lt;/h3&gt;

&lt;p&gt;This is the most interesting technical addition. Form Blocks bring typed fields to your submissions. Each block type &lt;br&gt;
validates automatically:&lt;br&gt;
Phone block:    validates E.164 format&lt;br&gt;
Email block:    validates RFC 5322 format&lt;br&gt;
Country block:  validates ISO 3166 codes&lt;br&gt;
Select block:   tracks which options&lt;br&gt;
get chosen most often&lt;br&gt;
Rating block:   validates 1 to 5 range&lt;/p&gt;

&lt;p&gt;The idea is cleaner data arriving in your dashboard without extra validation work on your end. If you are collecting structured data at scale, this is genuinely useful.&lt;/p&gt;
&lt;h3&gt;
  
  
  Submission Inbox
&lt;/h3&gt;

&lt;p&gt;This is where it gets interesting for small businesses. &lt;br&gt;
Forminit added a submission inbox to the dashboard with:&lt;br&gt;
Star submissions&lt;br&gt;
Change status&lt;br&gt;
Add notes&lt;br&gt;
Switch between inbox and table views&lt;/p&gt;

&lt;p&gt;Sound familiar? That is a lightweight lead management system. The same problem Formgrid was built to solve.&lt;/p&gt;

&lt;p&gt;The difference is that Forminit's inbox is still fairly basic. Status changes and notes exist, but there are no follow-up reminders. &lt;br&gt;
No conversion rate. No email was sent to you on the day you need to act. You still have to remember to check the dashboard yourself.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Is Still Missing From Forminit
&lt;/h2&gt;

&lt;p&gt;After the rebrand, Forminit remains a developer-focused form backend. It does not have:&lt;br&gt;
A form builder                  ❌&lt;br&gt;
A shareable form link           ❌&lt;br&gt;
Follow-up reminder emails       ❌&lt;br&gt;
Conversion rate tracking        ❌&lt;br&gt;
Open source code                ❌&lt;br&gt;
Self-hosting option             ❌&lt;/p&gt;

&lt;p&gt;If you do not have a website or need to share a form link via WhatsApp, email, or Instagram, Forminit cannot help you. You need to build your own form first and then deploy it.&lt;/p&gt;

&lt;p&gt;If you care about data ownership, GDPR compliance, or running your form backend on your own infrastructure, Forminit gives you no option.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Does Forminit Cost?
&lt;/h2&gt;

&lt;p&gt;Forminit's pricing after the rebrand:&lt;br&gt;
Free:         50 submissions per month&lt;br&gt;
30-day submission history&lt;br&gt;
Basic features&lt;br&gt;
Pro:          $19 per month&lt;br&gt;
3,000 submissions per month&lt;br&gt;
File uploads&lt;br&gt;
Webhooks&lt;br&gt;
CSV export&lt;br&gt;
REST API&lt;br&gt;
Business:     $49 per month&lt;br&gt;
Higher limits&lt;br&gt;
Auto-responder emails&lt;br&gt;
Custom SMTP&lt;br&gt;
Workspaces&lt;/p&gt;

&lt;p&gt;The free plan is the same as before. &lt;br&gt;
The paid plans are more expensive than most alternatives in the same category.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Best Forminit Alternatives in 2026
&lt;/h2&gt;

&lt;p&gt;If you were happy with Getform and are now evaluating whether Forminit is still the right choice, here are the main alternatives worth looking at.&lt;/p&gt;


&lt;h3&gt;
  
  
  1. Formgrid: Form Backend, Form Builder, and Lead Management in One Place
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a form backend and small businesses who want to manage leads without a separate CRM.&lt;/p&gt;

&lt;p&gt;Formgrid does everything Forminit does as a form backend. You point your existing HTML form at a Formgrid endpoint with &lt;br&gt;
one 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="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;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; 
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Send Message&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/form&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But Formgrid adds three things Forminit does not have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A drag and drop form builder with a shareable link.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you do not have a website or want to share a form via WhatsApp, email, or social media, Formgrid gives you a shareable link in under 2 minutes. No HTML required. No hosting needed.&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%2F4fjeafzj9jij0xoxszqp.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%2F4fjeafzj9jij0xoxszqp.png" alt="Formgrid drag and drop form builder" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A proper lead pipeline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every submission becomes a tracked lead with a status you can update in one click:&lt;br&gt;
New → Contacted → Converted&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 leads tab showing tracked submissions" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At the top of the leads tab you see your conversion rate updated automatically:&lt;br&gt;
3 of 23 leads converted (13%)&lt;/p&gt;

&lt;p&gt;Forminit shows you a submission inbox. Formgrid shows you a business pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Follow-up reminder emails.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the feature Forminit does not have and the one that matters most for small businesses.&lt;/p&gt;

&lt;p&gt;When a lead asks you to follow up in two weeks, you set a date for the follow-up. On that date, Formgrid emails you with the lead details and your notes attached.&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;You open the email. You have all the context. &lt;br&gt;
You send the follow-up. You close the deal.&lt;/p&gt;

&lt;p&gt;Forminit has no equivalent. You have to remember to check the dashboard yourself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notes on every lead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After every conversation, add a private note directly on the lead. What you talked about. What they need. 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" width="800" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The next time you open that lead, your note is right there. You always know where the conversation stands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt;&lt;br&gt;
Free:      $0/month    25 submissions&lt;br&gt;
Premium:   $8/month    1,000 submissions&lt;br&gt;
Business:  $29/month   15,000 submissions&lt;br&gt;
plus auto-responder&lt;br&gt;
emails and more&lt;/p&gt;

&lt;p&gt;Formgrid's Pro equivalent is $8 per month compared to Forminit's $19 per month. You pay less and get a form builder, lead pipeline, and follow-up reminders that Forminit does not have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open source and self-hostable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Formgrid is fully open source under the MIT license. You can run it on your own infrastructure with Docker for unlimited free usage. Forminit has no open source option.&lt;/p&gt;

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


&lt;h3&gt;
  
  
  2. Formspree: The Original Form Backend
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want a dead-simple form endpoint with no extras.&lt;/p&gt;

&lt;p&gt;Formspree is one of the oldest and most reliable form backends available. It does one thing and does it well. &lt;br&gt;
Point your form at an endpoint, and submissions arrive in your inbox.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;br&gt;
HTML form endpoint&lt;br&gt;
Email notifications&lt;br&gt;
File uploads on paid plans&lt;br&gt;
Spam protection&lt;br&gt;
Basic dashboard&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free plan with 50 submissions &lt;br&gt;
per month. Paid plans start at $10 per month for 200 submissions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; No form builder. No lead &lt;br&gt;
management. No notes. No follow-up &lt;br&gt;
reminders. No open source. Submission &lt;br&gt;
history is deleted after 30 days on the &lt;br&gt;
free plan.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Basin: Minimal and No-Frills
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers who want the simplest possible backend form with no distractions.&lt;/p&gt;

&lt;p&gt;Basin is intentionally minimal. Point your form at their endpoint. Receive emails. Done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;br&gt;
HTML form endpoint&lt;br&gt;
Email notifications&lt;br&gt;
Spam protection&lt;br&gt;
Simple dashboard&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pricing:&lt;/strong&gt; Free tier available. &lt;br&gt;
Paid plans start at $8 per month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; Very limited compared to &lt;br&gt;
other options. No form builder. No lead &lt;br&gt;
management. No self-hosting. &lt;br&gt;
Minimal integrations.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. Netlify Forms: Great If You Are Already on Netlify
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers whose sites are deployed on Netlify.&lt;/p&gt;

&lt;p&gt;If your site is on Netlify, forms work out of the box. Add one attribute to your form tag, and submissions are stored 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;&lt;strong&gt;Pricing:&lt;/strong&gt; 100 submissions per month &lt;br&gt;
free with Netlify. Additional submissions through Netlify's pricing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Drawback:&lt;/strong&gt; Only works on Netlify. &lt;br&gt;
No lead management. No form builder. &lt;br&gt;
No self-hosting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Forminit&lt;/th&gt;
&lt;th&gt;Formgrid&lt;/th&gt;
&lt;th&gt;Formspree&lt;/th&gt;
&lt;th&gt;Basin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;HTML form endpoint&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email notifications&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File uploads&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Form builder&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable form link&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lead pipeline&lt;/td&gt;
&lt;td&gt;Basic&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notes on leads&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Follow up reminders&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversion tracking&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hostable&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/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;td&gt;50/month&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starting price&lt;/td&gt;
&lt;td&gt;$19/month&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;td&gt;$10/month&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR friendly&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Who Should Stay on Forminit
&lt;/h2&gt;

&lt;p&gt;Forminit is still a good choice if:&lt;/p&gt;

&lt;p&gt;You are a developer who needs protected API key authentication for server-side form submissions.&lt;/p&gt;

&lt;p&gt;You need typed field validation (phone, email, country, rating) built in at the backend level without writing your own validation logic.&lt;/p&gt;

&lt;p&gt;You are running an agency with multiple clients and want workspace isolation.&lt;/p&gt;

&lt;p&gt;You were happy with Getform and just need to know your endpoints still work. They do.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Should Switch to Formgrid
&lt;/h2&gt;

&lt;p&gt;Switch to Formgrid if:&lt;/p&gt;

&lt;p&gt;You do not have a website and need a shareable form link you can send via WhatsApp or email without any code.&lt;/p&gt;

&lt;p&gt;You want to track what happens to submissions after they arrive. Who did you contact? Who converted? Who needs a follow-up?&lt;/p&gt;

&lt;p&gt;You want follow-up reminder emails that tell you when to act rather than relying on yourself to check a dashboard.&lt;/p&gt;

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

&lt;p&gt;You are paying $19 per month for Forminit and want the same functionality plus a form builder and lead management for $8 per month.&lt;/p&gt;

&lt;p&gt;You need GDPR friendly hosting with no tracking and no data selling.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Switch From Getform or Forminit to Formgrid
&lt;/h2&gt;

&lt;p&gt;If you are already using Getform or Forminit, switching to Formgrid takes about five minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign up at &lt;br&gt;
&lt;a href="https://formgrid.dev" rel="noopener noreferrer"&gt;formgrid.dev&lt;/a&gt;. &lt;br&gt;
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 Formgrid 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%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 Forminit or Getform endpoint URL in your existing HTML form with your Formgrid endpoint URL. One line change.&lt;/p&gt;

&lt;p&gt;That is the entire migration. Your form works exactly as before. The difference is that 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.&lt;/p&gt;




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

&lt;p&gt;The Getform to Forminit rebrand is a genuine product update, not just a name change. Authentication modes and Form Blocks are useful additions for developers building more complex form workflows.&lt;/p&gt;

&lt;p&gt;But the core limitation remains. Forminit is a headless form backend for developers. If you want to share a form link without writing HTML, track leads through a pipeline, set follow-up reminders, or &lt;br&gt;
self-host your form backend. Forminit is not built for that.&lt;/p&gt;

&lt;p&gt;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;/p&gt;

&lt;p&gt;No credit card required. Free plan available. If you are already on Getform or Forminit, switching takes five minutes, and your form does not change at all.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about switching or setting &lt;br&gt;
up lead tracking for your specific use &lt;br&gt;
case? Email &lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt;, and I will &lt;br&gt;
help you get it working.&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Formspree vs Formgrid: What Happens to Your Leads After They Hit Your Inbox</title>
      <dc:creator>Allen Jones</dc:creator>
      <pubDate>Sun, 26 Apr 2026 15:34:23 +0000</pubDate>
      <link>https://forem.com/allenarduino/formspree-vs-formgrid-what-happens-to-your-leads-after-they-hit-your-inbox-1j69</link>
      <guid>https://forem.com/allenarduino/formspree-vs-formgrid-what-happens-to-your-leads-after-they-hit-your-inbox-1j69</guid>
      <description>&lt;p&gt;Most comparisons between Formspree and Formgrid focus on price and features.&lt;/p&gt;

&lt;p&gt;This one focuses on something more important.&lt;/p&gt;

&lt;p&gt;What actually happens to your leads after they submit your form?&lt;/p&gt;

&lt;p&gt;Because that is where most small businesses are losing customers without realising it. &lt;br&gt;
Not at the form. Not at the inbox. &lt;br&gt;
After the inbox.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Moment Formspree's Job Ends
&lt;/h2&gt;

&lt;p&gt;When someone fills in your contact form &lt;br&gt;
and hits submit, Formspree does its job &lt;br&gt;
cleanly and reliably.&lt;br&gt;
Submission received         ✅&lt;br&gt;
Spam filtered               ✅&lt;br&gt;
Email notification sent     ✅&lt;br&gt;
Submission stored           ✅&lt;/p&gt;

&lt;p&gt;That is it. Formspree's job is done.&lt;/p&gt;

&lt;p&gt;The submission is in your inbox. It is &lt;br&gt;
in your Formspree dashboard. What happens next is entirely up to you.&lt;/p&gt;

&lt;p&gt;Did you reply? Did you follow up? Did they become a customer? Did they go cold while sitting in your starred emails?&lt;/p&gt;

&lt;p&gt;Formspree has no idea. It received the submission. That was the assignment.&lt;/p&gt;

&lt;p&gt;For a developer building a portfolio contact form or a simple static site, that is completely fine. The submission is just a notification. There is nothing more to track.&lt;/p&gt;

&lt;p&gt;But for a small business owner, that submission is a potential customer. &lt;br&gt;
And potential customers need more than an email notification. &lt;br&gt;
They need a system that tracks what happens to them after they reach out.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Moment Formgrid's Job Begins
&lt;/h2&gt;

&lt;p&gt;Formgrid does everything Formspree does &lt;br&gt;
at the point of submission.&lt;br&gt;
Submission received         ✅&lt;br&gt;
Spam filtered               ✅&lt;br&gt;
Email notification sent     ✅&lt;br&gt;
Submission stored           ✅&lt;/p&gt;

&lt;p&gt;But that is where the similarity ends.&lt;/p&gt;

&lt;p&gt;Because in Formgrid, that submission 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.&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;
  
  
  What Happens in Formspree After
&lt;/h2&gt;

&lt;p&gt;the Submission&lt;/p&gt;

&lt;p&gt;You receive an email notification. &lt;br&gt;
You open it. You read the enquiry.&lt;/p&gt;

&lt;p&gt;Then one of three things happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best case:&lt;/strong&gt; You reply immediately, have a great conversation, and the person becomes a customer. Formspree worked perfectly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most common case:&lt;/strong&gt; You reply when you get a chance, a day or two later. The lead is still warm, but not as warm as it was. You close some of them. You lose some of them. You have no idea which or why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worst case:&lt;/strong&gt; The submission gets buried under 40 other emails. &lt;br&gt;
You find it two weeks later. The person has already gone with someone else. You have no idea how many times this has happened because Formspree has no way to show you.&lt;/p&gt;

&lt;p&gt;After a month of submissions in your Formspree dashboard, you have no idea at a glance:&lt;br&gt;
Which ones did you reply to?&lt;br&gt;
Which ones are still waiting?&lt;br&gt;
Which ones became customers?&lt;br&gt;
Which ones went cold?&lt;/p&gt;

&lt;p&gt;You have a list of submissions. &lt;br&gt;
Not a picture of your business.&lt;/p&gt;


&lt;h2&gt;
  
  
  What Happens in Formgrid After
&lt;/h2&gt;

&lt;p&gt;the Submission&lt;/p&gt;

&lt;p&gt;You receive the same instant email notification. You open it. You read the enquiry.&lt;/p&gt;

&lt;p&gt;But then you open your Formgrid dashboard, and the lead is already &lt;br&gt;
there waiting for you as a New lead with a status, a timestamp, and &lt;br&gt;
all the submitter 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%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 leads tab showing tracked submissions" width="800" height="497"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;And your conversion rate:&lt;br&gt;
3 of 23 leads converted (13%)&lt;/p&gt;

&lt;p&gt;You know immediately which leads need your attention. You know &lt;br&gt;
exactly how your form is performing. You know your conversion rate without counting anything manually.&lt;/p&gt;

&lt;p&gt;That is the difference between a form backend and a lead management system.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Four Things That Happen
&lt;/h2&gt;

&lt;p&gt;Differently in Formgrid&lt;/p&gt;
&lt;h3&gt;
  
  
  1. You Can See Where Every Lead Stands
&lt;/h3&gt;

&lt;p&gt;In Formspree, every submission looks the same. New or old. Replied to or not. Converting or dead. It is all in the same flat list.&lt;/p&gt;

&lt;p&gt;In Formgrid, every lead has a status:&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;When you reply to a lead, you change its status from New to Contacted. When they become a customer, you change it to Converted.&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%2F0lyv3sjeczegm31elrta.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%2F0lyv3sjeczegm31elrta.png" alt="Lead status dropdown in Formgrid" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can also update multiple leads at once using bulk actions. &lt;br&gt;
Mark everything you replied to this morning as Contacted in one click.&lt;/p&gt;

&lt;p&gt;Three stages. That is all you need to turn a flat list into a visible one pipeline.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. You Can Add Notes to Every Lead
&lt;/h3&gt;

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

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

&lt;p&gt;In Formgrid, every lead has a notes field that accepts up to 2000 &lt;br&gt;
characters. Write whatever you need to remember:&lt;br&gt;
Called Thursday. Interested in the monthly package. Budget around&lt;br&gt;
$800 per month. Partner needs to approve. Follow up after the 20th.&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;The next time you open that lead, your note is right there. You know &lt;br&gt;
exactly where the conversation left off before you pick up the phone. &lt;br&gt;
You sound prepared. You sound professional. You close more deals.&lt;/p&gt;

&lt;p&gt;Without the note, you are starting from scratch every time. You ask &lt;br&gt;
the same questions again. You sound like you do not remember them. &lt;br&gt;
You lose the deal to someone who does.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. You Can Set 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;The problem is that "follow up in two weeks" is not a system. It is a hope.&lt;/p&gt;

&lt;p&gt;In Formgrid, you set a follow-up reminder directly on the lead. &lt;br&gt;
Pick a date. Click Set Reminder.&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;On that date, Formgrid emails you with the lead details and your &lt;br&gt;
notes so you have everything you need before you follow up.&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;br&gt;
Follow-up reminder: James Garside&lt;br&gt;
from Contact Form&lt;br&gt;
Lead: James Garside&lt;br&gt;
Email: &lt;a href="mailto:james@email.com"&gt;james@email.com&lt;/a&gt;&lt;br&gt;
Current status: Contacted&lt;br&gt;
Notes: Called Thursday. Budget&lt;br&gt;
around $800. Follow up after&lt;br&gt;
the 20th.&lt;br&gt;
View this lead: [link]&lt;/p&gt;

&lt;p&gt;You open that email. You have the &lt;br&gt;
context. You send the follow-up. You close the deal.&lt;/p&gt;

&lt;p&gt;Formspree has no equivalent of this. The moment the submission hits your inbox, Formspree is done. Whether you follow up is entirely up to you and your memory.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. You Can See Your Conversion Rate
&lt;/h3&gt;

&lt;p&gt;Do you know what percentage of your Formspree submissions become paying customers?&lt;/p&gt;

&lt;p&gt;Almost certainly not. Because Formspree has no way to track that. It receives submissions and stores them. It has no concept of whether a submission converted or not.&lt;/p&gt;

&lt;p&gt;In Formgrid, your conversion rate updates automatically as you move &lt;br&gt;
leads through the pipeline:&lt;br&gt;
3 of 23 leads converted (13%)&lt;/p&gt;

&lt;p&gt;That number tells you things you cannot see from a flat submissions list.&lt;/p&gt;

&lt;p&gt;If it drops, you know something changed. Maybe a new traffic source is bringing lower-quality leads. Maybe you are taking too long to reply. Maybe your pricing conversation needs work.&lt;/p&gt;

&lt;p&gt;If it is climbing, you know your process is working. Keep doing &lt;br&gt;
what you are doing.&lt;/p&gt;

&lt;p&gt;Without that number, you are guessing. With Formspree, you are always guessing.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Side-by-Side Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;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;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email notifications&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Submissions dashboard&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSV export&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spam protection&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File uploads&lt;/td&gt;
&lt;td&gt;✅ Paid&lt;/td&gt;
&lt;td&gt;✅&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 rate 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;Form builder&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shareable form link&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hostable&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;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;$10/month&lt;/td&gt;
&lt;td&gt;$8/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GDPR friendly&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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


&lt;h2&gt;
  
  
  How to Switch From Formspree
&lt;/h2&gt;

&lt;p&gt;to Formgrid&lt;/p&gt;

&lt;p&gt;If you are already using Formspree, switching to Formgrid takes about &lt;br&gt;
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 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;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 &lt;br&gt;
copy your Formgrid 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%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 &lt;br&gt;
endpoint in your existing HTML form with your Formgrid endpoint URL. &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="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;input&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; 
    &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"_honey"&lt;/span&gt; 
    &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"display:none"&lt;/span&gt; 
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;That is the entire migration. Your form works exactly as before. The &lt;br&gt;
difference is that 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.&lt;/p&gt;

&lt;p&gt;If you do not have a website or want a standalone shareable form &lt;br&gt;
link use the drag and drop builder to get a link in under 5 minutes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fjeafzj9jij0xoxszqp.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%2F4fjeafzj9jij0xoxszqp.png" alt="Formgrid drag and drop form builder" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Costs
&lt;/h2&gt;

&lt;p&gt;Free:      $0/month    25 submissions&lt;br&gt;
Premium:   $8/month    1,000 submissions&lt;br&gt;
Business:  $29/month   15,000 submissions&lt;br&gt;
plus auto-responder&lt;br&gt;
emails and more&lt;/p&gt;

&lt;p&gt;Formspree's equivalent paid plan starts at $10 per month for 200 &lt;br&gt;
submissions with no lead management.&lt;/p&gt;

&lt;p&gt;You pay less with Formgrid and get a complete lead pipeline on top of &lt;br&gt;
everything Formspree already does.&lt;/p&gt;




&lt;h2&gt;
  
  
  When Formspree Is Still the Right Choice
&lt;/h2&gt;

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

&lt;p&gt;If you are a developer building a simple contact form for a &lt;br&gt;
portfolio site or a static site where submissions are just &lt;br&gt;
notifications and nothing more. Formspree works fine.&lt;/p&gt;

&lt;p&gt;You are not trying to convert those submissions into customers. &lt;br&gt;
You are just receiving messages. The pipeline, the notes, and the &lt;br&gt;
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 &lt;br&gt;
the calculation changes completely.&lt;/p&gt;

&lt;p&gt;A small business taking 20 enquiries per month needs to know which ones they replied to, which ones need a follow-up, and which ones became customers. Formspree cannot tell you any of that. Formgrid can.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;If you are a small business owner using Formspree, and you have ever &lt;br&gt;
lost track of a lead that could have become a customer. This is worth five minutes of your time.&lt;/p&gt;

&lt;p&gt;Switch your form endpoint. Set up your first pipeline. See what your &lt;br&gt;
conversion rate actually is.&lt;/p&gt;

&lt;p&gt;That number alone might change how you think about your contact &lt;br&gt;
form entirely.&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. Switching from Formspree takes five minutes, and your form &lt;br&gt;
does not change at all.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions about switching from &lt;br&gt;
Formspree or setting up lead tracking for your specific use case? Email &lt;br&gt;
&lt;a href="mailto:allen@formgrid.dev"&gt;allen@formgrid.dev&lt;/a&gt;, and I will help &lt;br&gt;
you get it working.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>marketing</category>
      <category>productivity</category>
      <category>saas</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
